/*
* 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.Operation.Status;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.model.VolumeGroup;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
import com.emc.storageos.volumecontroller.impl.ControllerUtils;
public class BlockConsistencyGroupAddVolumeCompleter extends BlockConsistencyGroupUpdateCompleter{
private static final long serialVersionUID = -871023109512730999L;
private static final Logger log = LoggerFactory.getLogger(BlockConsistencyGroupAddVolumeCompleter.class);
private List<URI> addVolumeList = null;
String groupName;
public BlockConsistencyGroupAddVolumeCompleter(URI cgURI, List<URI>addVolumesList, String groupName, String opId) {
super(cgURI, opId);
this.addVolumeList = addVolumesList;
this.groupName = groupName;
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded)
throws DeviceControllerException {
log.info("Updating add volume replicationGroupInstance");
try {
super.complete(dbClient, status, coded);
if (status == Status.ready) {
BlockConsistencyGroup cg = dbClient.queryObject(BlockConsistencyGroup.class, getId());
if (groupName == null) {
groupName = (cg.getAlternateLabel() != null) ? cg.getAlternateLabel() : cg.getLabel();
}
VolumeGroup volumeGroup = ControllerUtils.getApplicationForCG(dbClient, cg, groupName);
for (URI voluri : addVolumeList) {
Volume volume = dbClient.queryObject(Volume.class, voluri);
if (volume != null && !volume.getInactive()) {
boolean isFullCopy = ControllerUtils.isVolumeFullCopy(volume, dbClient);
if (!isFullCopy) {
volume.setReplicationGroupInstance(groupName);
volume.setConsistencyGroup(this.getConsistencyGroupURI());
boolean isVplexBackendVolume = Volume.checkForVplexBackEndVolume(dbClient, volume);
if (volumeGroup != null && !isVplexBackendVolume) {
// do not set Application Id on VPLEX backend volume
volume.getVolumeGroupIds().add(volumeGroup.getId().toString());
}
// if this is a vplex backend volume, update the backing replication group
// instance on the parent virtual volume
if (isVplexBackendVolume) {
Volume virtualVolume = Volume.fetchVplexVolume(dbClient, volume);
if (null != virtualVolume) {
if (!groupName.equals(virtualVolume.getBackingReplicationGroupInstance())) {
virtualVolume.setBackingReplicationGroupInstance(groupName);
dbClient.updateObject(virtualVolume);
}
}
}
dbClient.updateObject(volume);
}
}
}
}
} catch (Exception e) {
log.error("Failed updating status. BlockConsistencyGroupRemoveVolume {}, for task "
+ getOpId(), getId(), e);
}
}
}