/*
* Copyright (c) 2015 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.Volume;
import com.emc.storageos.volumecontroller.Job;
import com.emc.storageos.volumecontroller.JobContext;
import com.emc.storageos.volumecontroller.impl.block.taskcompleter.MetaVolumeTaskCompleter;
import com.emc.storageos.workflow.WorkflowService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMObjectPath;
import java.net.URI;
import java.util.ArrayList;
public class SmisCreateMetaVolumeJob extends SmisCreateVolumeJob {
private static final Logger _log = LoggerFactory.getLogger(SmisCreateMetaVolumeJob.class);
private MetaVolumeTaskCompleter _metaVolumeTaskCompleter;
private Volume _metaHead;
Boolean _isLastJob;
public SmisCreateMetaVolumeJob(CIMObjectPath cimJob,
URI storageSystem,
URI storagePool,
Volume metaHead,
MetaVolumeTaskCompleter metaVolumeTaskCompleter,
Boolean isLastJob) {
super(cimJob, storageSystem, storagePool, metaVolumeTaskCompleter.getVolumeTaskCompleter(), "CreateMetaVolume");
_metaVolumeTaskCompleter = metaVolumeTaskCompleter;
_metaHead = metaHead;
_isLastJob = isLastJob;
}
/**
* Called to update the job status when the create meta volume job completes.
*
* @param jobContext The job context.
*/
public void updateStatus(JobContext jobContext) throws Exception {
JobStatus jobStatus = getJobStatus();
try {
DbClient dbClient = jobContext.getDbClient();
if (jobStatus == Job.JobStatus.IN_PROGRESS) {
return;
} else if (jobStatus == JobStatus.SUCCESS) {
// Reset list of meta members native ids in WF data (when meta is created meta members are removed from array)
String opId = _metaVolumeTaskCompleter.getVolumeTaskCompleter().getOpId();
WorkflowService.getInstance().storeStepData(opId, new ArrayList<String>());
// Reset list of meta member volumes in the meta head
_metaHead.getMetaVolumeMembers().clear();
dbClient.persistObject(_metaHead);
}
} catch (Exception e) {
_log.error("Caught an exception while trying to process status for " + this.getJobName(), e);
setPostProcessingErrorStatus("Encountered an internal error during " + this.getJobName() + " job status processing : "
+ e.getMessage());
} finally {
_metaVolumeTaskCompleter.setLastStepStatus(jobStatus);
if (_isLastJob) {
super.updateStatus(jobContext);
} else {
// Complete only if error (this is not the last job for meta volume create).
if (isJobInTerminalFailedState()) {
super.updateStatus(jobContext);
}
}
}
}
}