/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.vplexcontroller.completers;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.constraint.ContainmentConstraint;
import com.emc.storageos.db.client.constraint.URIQueryResultList;
import com.emc.storageos.db.client.model.BlockSnapshot;
import com.emc.storageos.db.client.model.StringSet;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.volumecontroller.impl.block.taskcompleter.ApplicationTaskCompleter;
public class VolumeGroupUpdateTaskCompleter extends ApplicationTaskCompleter {
private static final long serialVersionUID = 8574883265512570806L;
private static final Logger log = LoggerFactory.getLogger(VolumeGroupUpdateTaskCompleter.class);
public VolumeGroupUpdateTaskCompleter(URI volumeGroupId, Collection<URI> addVolumes, Collection<URI>removeVols,
Collection<URI>cgs, String opId) {
super(volumeGroupId, addVolumes, removeVols, cgs, opId);
}
/**
* Remove the volume group to the volume volumeGroupIds attribute and add back consistency group Id to
* its backend volumes
* @param voluri The volumes that will be updated
* @param dbClient
*/
@Override
protected void removeApplicationFromVolume(URI voluri, DbClient dbClient) {
Volume volume = dbClient.queryObject(Volume.class, voluri);
log.info(String.format("removing the volume %s from application", volume.getLabel()));
String volumeGroupId = getId().toString();
StringSet volumeGroupIds = volume.getVolumeGroupIds();
if(volumeGroupIds != null) {
volumeGroupIds.remove(volumeGroupId);
}
dbClient.updateObject(volume);
URI cgURI = volume.getConsistencyGroup();
if (NullColumnValueGetter.isNullURI(cgURI)) {
return;
}
StringSet backends = volume.getAssociatedVolumes();
if (backends != null) {
for (String backendId : backends) {
Volume backendVol = dbClient.queryObject(Volume.class, URI.create(backendId));
log.info(String.format("update the volume %s cg", backendVol.getLabel()));
if (backendVol != null) {
backendVol.setConsistencyGroup(cgURI);
dbClient.updateObject(backendVol);
// handle snapshot
URIQueryResultList snapshotURIs = new URIQueryResultList();
dbClient.queryByConstraint(ContainmentConstraint.Factory.getVolumeSnapshotConstraint(
backendVol.getId()), snapshotURIs);
if (snapshotURIs.iterator().hasNext()) {
List<BlockSnapshot> snapshots = dbClient.queryObject(BlockSnapshot.class, snapshotURIs);
for (BlockSnapshot snapshot : snapshots) {
if (snapshot != null && !snapshot.getInactive()) {
snapshot.setSnapsetLabel(NullColumnValueGetter.getNullStr());
}
}
dbClient.updateObject(snapshots);
}
}
}
}
// handle clones
StringSet fullCopies = volume.getFullCopies();
List<Volume> fullCopiesToUpdate = new ArrayList<Volume>();
if (fullCopies != null && !fullCopies.isEmpty()) {
for (String fullCopyId : fullCopies) {
Volume fullCopy = dbClient.queryObject(Volume.class, URI.create(fullCopyId));
if (fullCopy != null && !fullCopy.getInactive()) {
fullCopy.setFullCopySetName(NullColumnValueGetter.getNullStr());
fullCopiesToUpdate.add(fullCopy);
}
}
}
if (!fullCopiesToUpdate.isEmpty()) {
dbClient.updateObject(fullCopiesToUpdate);
}
}
}