/*
* 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.exceptions.DeviceControllerException;
import com.emc.storageos.svcs.errorhandling.model.ServiceError;
import com.emc.storageos.volumecontroller.Job;
import com.emc.storageos.volumecontroller.JobContext;
import com.emc.storageos.volumecontroller.impl.block.taskcompleter.CleanupMetaVolumeMembersCompleter;
import com.emc.storageos.workflow.Workflow;
import com.emc.storageos.workflow.WorkflowService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.cim.CIMObjectPath;
import javax.wbem.CloseableIterator;
import java.net.URI;
import java.util.ArrayList;
public class SmisCleanupMetaVolumeMembersJob extends SmisJob {
private static final Logger _log = LoggerFactory.getLogger(SmisCleanupMetaVolumeMembersJob.class);
CleanupMetaVolumeMembersCompleter cleanupCompleter;
URI storageSystemURI;
URI volumeURI;
public SmisCleanupMetaVolumeMembersJob(CIMObjectPath cimJob, URI storageSystemURI, URI volumeURI,
CleanupMetaVolumeMembersCompleter cleanupCompleter) {
super(cimJob, storageSystemURI, cleanupCompleter, "CleanupMetaVolumeMembers");
this.cleanupCompleter = cleanupCompleter;
this.storageSystemURI = storageSystemURI;
this.volumeURI = volumeURI;
}
@Override
public void updateStatus(JobContext jobContext) throws Exception {
CloseableIterator<CIMObjectPath> iterator = null;
DbClient dbClient = jobContext.getDbClient();
JobStatus jobStatus = getJobStatus();
try {
if (jobStatus == Job.JobStatus.IN_PROGRESS) {
return;
}
StringBuilder logMsgBuilder =
new StringBuilder(String.format("Updating status of job %s to %s", this.getJobName(), jobStatus.name()));
_log.info(logMsgBuilder.toString());
if (jobStatus == Job.JobStatus.SUCCESS) {
// clean meta volume members in source step data
String sourceStepId = cleanupCompleter.getSourceStepId();
WorkflowService.getInstance().storeStepData(sourceStepId, new ArrayList<String>());
// Reset list of meta member volumes in the meta head
Volume metaHead = dbClient.queryObject(Volume.class, volumeURI);
if (metaHead.getMetaVolumeMembers() != null) {
metaHead.getMetaVolumeMembers().clear();
dbClient.persistObject(metaHead);
}
cleanupCompleter.complete(Workflow.StepState.SUCCESS, null);
} else if (jobStatus == JobStatus.FAILED || jobStatus == JobStatus.FATAL_ERROR) {
ServiceError serviceError = DeviceControllerException.errors.jobFailedOp("CleanupMetaVolumeMembersJob");
cleanupCompleter.complete(Workflow.StepState.ERROR, serviceError);
}
} catch (Exception e) {
_log.error("Caught an exception while trying to updateStatus for CleanupMetaVolumeMembersJob", e);
setFatalErrorStatus(e.getMessage());
ServiceError serviceError = DeviceControllerException.errors.jobFailed(e);
cleanupCompleter.complete(Workflow.StepState.ERROR, serviceError);
}
}
}