/*
* Copyright (c) 2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.smis.job;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.BlockSnapshot;
import com.emc.storageos.db.client.model.NamedURI;
import com.emc.storageos.db.client.model.Operation;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.volumecontroller.JobContext;
import com.emc.storageos.volumecontroller.TaskCompleter;
import com.emc.storageos.volumecontroller.impl.block.taskcompleter.BlockSnapshotDeleteCompleter;
import com.emc.storageos.volumecontroller.impl.smis.CIMConnectionFactory;
import com.emc.storageos.volumecontroller.impl.smis.SmisUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMObjectPath;
import javax.wbem.client.WBEMClient;
import java.net.URI;
public class SmisBlockDeleteSnapshotJob extends SmisJob {
private static final Logger _log = LoggerFactory.getLogger(SmisBlockDeleteSnapshotJob.class);
public SmisBlockDeleteSnapshotJob(CIMObjectPath cimJob,
URI storageSystem,
TaskCompleter taskCompleter) {
super(cimJob, storageSystem, taskCompleter, "DeleteBlockSnapshot");
}
public void updateStatus(JobContext jobContext) throws Exception {
DbClient dbClient = jobContext.getDbClient();
JobStatus jobStatus = getJobStatus();
try {
BlockSnapshotDeleteCompleter completer = (BlockSnapshotDeleteCompleter) getTaskCompleter();
BlockSnapshot snapshot = dbClient.queryObject(BlockSnapshot.class, completer.getId());
if (jobStatus == JobStatus.IN_PROGRESS) {
return;
}
// If terminal state update storage pool capacity
if (jobStatus == JobStatus.SUCCESS || jobStatus == JobStatus.FAILED || jobStatus == JobStatus.FATAL_ERROR) {
CIMConnectionFactory cimConnectionFactory = jobContext.getCimConnectionFactory();
WBEMClient client = getWBEMClient(dbClient, cimConnectionFactory);
NamedURI volumeURI = snapshot.getParent();
Volume volume = dbClient.queryObject(Volume.class, volumeURI);
URI poolURI = volume.getPool();
// Update capacity of storage pools.
SmisUtils.updateStoragePoolCapacity(dbClient, client, poolURI);
}
if (jobStatus == JobStatus.SUCCESS) {
_log.info("Deleting snapshot job was successful.");
snapshot.setInactive(true);
dbClient.persistObject(snapshot);
} else if (jobStatus == JobStatus.FAILED || jobStatus == JobStatus.FATAL_ERROR) {
_log.info("Failed to delete snapshot: {}", getTaskCompleter().getId());
}
} catch (Exception e) {
setFatalErrorStatus(e.getMessage());
_log.error("Caught an exception while trying to updateStatus for SmisBlockDeleteSnapshotJob", e);
Operation updateOp = new Operation();
updateOp.setStatus("Encountered an internal error during block delete snapshot job status processing: " + e.getMessage());
dbClient.updateTaskOpStatus(BlockSnapshot.class, getTaskCompleter().getId(), getTaskCompleter().getOpId(),
updateOp);
} finally {
super.updateStatus(jobContext);
}
}
}