/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.vnxunity.job;
import java.net.URI;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.BlockSnapshot;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.vnxe.VNXeApiClient;
import com.emc.storageos.vnxe.models.ParametersOut;
import com.emc.storageos.vnxe.models.Snap;
import com.emc.storageos.vnxe.models.VNXeCommandJob;
import com.emc.storageos.volumecontroller.JobContext;
import com.emc.storageos.volumecontroller.TaskCompleter;
import com.emc.storageos.volumecontroller.impl.NativeGUIDGenerator;
import com.emc.storageos.volumecontroller.impl.block.taskcompleter.BlockSnapshotCreateCompleter;
import com.emc.storageos.volumecontroller.impl.vnxe.job.VNXeJob;
public class VNXUnityCreateCGSnapshotJob extends VNXeJob{
private static final long serialVersionUID = -5563400198981214053L;
private static final Logger _logger = LoggerFactory.getLogger(VNXUnityCreateCGSnapshotJob.class);
private Boolean readOnly;
public VNXUnityCreateCGSnapshotJob(String jobId,
URI storageSystemUri, Boolean readOnly, TaskCompleter taskCompleter) {
super(jobId, storageSystemUri, taskCompleter, "createCGSnapshot");
this.readOnly = readOnly;
}
public void updateStatus(JobContext jobContext) throws Exception {
DbClient dbClient = jobContext.getDbClient();
try {
if (_status == JobStatus.IN_PROGRESS) {
return;
}
BlockSnapshotCreateCompleter completer = (BlockSnapshotCreateCompleter) getTaskCompleter();
List<BlockSnapshot> snapshots = dbClient.queryObject(BlockSnapshot.class, completer.getSnapshotURIs());
StorageSystem storage = dbClient.queryObject(StorageSystem.class, getStorageSystemUri());
if (_status == JobStatus.SUCCESS) {
VNXeApiClient vnxeApiClient = getVNXeClient(jobContext);
VNXeCommandJob vnxeJob = vnxeApiClient.getJob(getJobIds().get(0));
ParametersOut output = vnxeJob.getParametersOut();
String snapGroupId = output.getId();
List<Snap> snaps = vnxeApiClient.getSnapshotsBySnapGroup(snapGroupId);
// Create mapping of volume.nativeDeviceId to BlockSnapshot object
Map<String, BlockSnapshot> volumeToSnapMap = new HashMap<String, BlockSnapshot>();
for (BlockSnapshot snapshot : snapshots) {
Volume volume = dbClient.queryObject(Volume.class, snapshot.getParent());
volumeToSnapMap.put(volume.getNativeId(), snapshot);
}
for (Snap snap : snaps) {
String lunId = snap.getLun().getId();
BlockSnapshot snapshot = volumeToSnapMap.get(lunId);
snapshot.setNativeId(snap.getId());
snapshot.setNativeGuid(NativeGUIDGenerator.generateNativeGuid(storage, snapshot));
snapshot.setDeviceLabel(snap.getName());
snapshot.setReplicationGroupInstance(snapGroupId);
snapshot.setIsSyncActive(true);
snapshot.setInactive(false);
snapshot.setCreationTime(Calendar.getInstance());
snapshot.setWWN(snap.getAttachedWWN());
snapshot.setAllocatedCapacity(snap.getSize());
snapshot.setProvisionedCapacity(snap.getSize());
if (readOnly) {
snapshot.setIsReadOnly(readOnly);
}
_logger.info(String.format("Going to set blocksnapshot %1$s nativeId to %2$s (%3$s). Associated lun is %4$s",
snapshot.getId().toString(), snap.getId(), snapshot.getLabel(), lunId));
dbClient.updateObject(snapshot);
}
} else if (_status == JobStatus.FAILED) {
_logger.info("Failed to create snapshot");
for (BlockSnapshot snapshot : snapshots) {
snapshot.setInactive(true);
}
dbClient.updateObject(snapshots);
}
} catch (Exception e) {
_logger.error("Caught an exception while trying to updateStatus for VNXUntiyCreateCGSnapshotJob", e);
setErrorStatus("Encountered an internal error during group snapshot create job status processing : " + e.getMessage());
} finally {
super.updateStatus(jobContext);
}
}
}