/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.block.taskcompleter;
import java.net.URI;
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.model.BlockConsistencyGroup;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.model.Operation.Status;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.model.VolumeGroup;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
/**
* Task completer class for remove volumes from CG
*
*/
public class BlockConsistencyGroupRemoveVolumeCompleter extends BlockConsistencyGroupUpdateCompleter{
private static final long serialVersionUID = -871023109512730999L;
private static final Logger log = LoggerFactory.getLogger(BlockConsistencyGroupRemoveVolumeCompleter.class);
private List<URI> removedVolumeList = null;
private boolean keepRGReference = false;
public BlockConsistencyGroupRemoveVolumeCompleter(URI cgURI, List<URI>removedVolumesList, boolean keepRGReference, String opId) {
super(cgURI, opId);
this.removedVolumeList = removedVolumesList;
this.keepRGReference = keepRGReference;
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded)
throws DeviceControllerException {
log.info("Updating removed volume replicationGroupInstance");
try {
if (status == Status.ready && !keepRGReference) {
for (URI blockObjectURI : removedVolumeList) {
BlockObject blockObject = BlockObject.fetch(dbClient, blockObjectURI);
if (blockObject != null) {
boolean isVplexBackendVolume = false;
if (blockObject instanceof Volume) {
VolumeGroup volumeGroup = ((Volume) blockObject).getApplication(dbClient);
if (volumeGroup != null) {
((Volume) blockObject).getVolumeGroupIds().remove(volumeGroup.getId().toString());
}
isVplexBackendVolume = Volume.checkForVplexBackEndVolume(dbClient, (Volume) blockObject);
}
if (!NullColumnValueGetter.isNullURI(blockObject.getConsistencyGroup())) {
BlockConsistencyGroup cg = dbClient.queryObject(BlockConsistencyGroup.class, blockObject.getConsistencyGroup());
if (!cg.checkForType(BlockConsistencyGroup.Types.RP)) {
blockObject.setConsistencyGroup(NullColumnValueGetter.getNullURI());
}
}
blockObject.setReplicationGroupInstance(NullColumnValueGetter.getNullStr());
// if this is a vplex backend volume, also clear the backing replication group
// instance on the parent virtual volume
if (isVplexBackendVolume) {
Volume virtualVolume = Volume.fetchVplexVolume(dbClient, (Volume) blockObject);
if (null != virtualVolume) {
virtualVolume.setBackingReplicationGroupInstance(NullColumnValueGetter.getNullStr());
dbClient.updateObject(virtualVolume);
}
}
}
dbClient.updateObject(blockObject);
}
}
super.complete(dbClient, status, coded);
} catch (Exception e) {
log.error("Failed updating status. BlockConsistencyGroupRemoveVolume {}, for task "
+ getOpId(), getId(), e);
}
}
}