/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.hds.prov.job;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.hds.HDSConstants;
import com.emc.storageos.hds.model.LogicalUnit;
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;
public class HDSCreateMetaVolumeMembersJob extends HDSJob {
private static final Logger _log = LoggerFactory.getLogger(HDSCreateMetaVolumeMembersJob.class);
private int count;
private Volume metaHead;
// Actually denotes the LogicalUnit id's.
private List<String> metaMembers = new ArrayList<String>();
private MetaVolumeTaskCompleter metaVolumeTaskCompleter;
public HDSCreateMetaVolumeMembersJob(String messageId, URI storageSystem, Volume metaHead, int count,
MetaVolumeTaskCompleter metaVolumeTaskCompleter) {
super(messageId, storageSystem, metaVolumeTaskCompleter.getVolumeTaskCompleter(), "CreateMetaVolumeMembers");
this.metaVolumeTaskCompleter = metaVolumeTaskCompleter;
this.count = count;
this.metaHead = metaHead;
}
public List<String> getMetaMembers() {
return metaMembers;
}
public JobStatus getStatus() {
return _status;
}
/**
* Called to update the job status when the create meta members job completes.
*
* @param jobContext The job context.
*/
@Override
public void updateStatus(JobContext jobContext) throws Exception {
try {
if (_status == JobStatus.IN_PROGRESS) {
return;
}
String opId = getTaskCompleter().getOpId();
StringBuilder logMsgBuilder =
new StringBuilder(String.format("Updating status of job %s to %s, task: %s", this.getJobName(), _status.name(), opId));
if (_status == JobStatus.SUCCESS) {
List<LogicalUnit> luList = (List<LogicalUnit>) _javaResult.getBean(HDSConstants.LOGICALUNIT_LIST_BEAN_NAME);
List<String> luObjectIdList = new ArrayList<String>();
// verify that all meta members have been created
if (null != luList && !luList.isEmpty()) {
for (LogicalUnit lu : luList) {
luObjectIdList.add(lu.getObjectID());
}
}
if (luObjectIdList.size() != count) {
logMsgBuilder.append("\n");
logMsgBuilder.append(String.format(
" Failed to create required number %s of meta members for meta head %s, task: %s .",
count, metaHead.getLabel(), opId));
_log.error(logMsgBuilder.toString());
setFailedStatus(logMsgBuilder.toString());
} else {
// Process meta members
logMsgBuilder.append("\n");
logMsgBuilder.append(String.format(" Created required number %s of meta members for meta head %s, task: %s .",
count, metaHead.getLabel(), opId));
metaMembers.addAll(luObjectIdList);
logMsgBuilder.append(String.format("%n Meta member device ID's: %s", metaMembers));
_log.info(logMsgBuilder.toString());
}
} else if (_status == JobStatus.FAILED) {
logMsgBuilder.append("\n");
logMsgBuilder.append(String.format(
"Task %s failed to create meta members for meta head volume: %s", opId, metaHead.getLabel()));
_log.error(logMsgBuilder.toString());
setFailedStatus(logMsgBuilder.toString());
}
} catch (Exception e) {
_log.error("Caught an exception while trying to updateStatus for " + this.getJobName(), e);
setErrorStatus("Encountered an internal error during " + this.getJobName() + " job status processing : " + e.getMessage());
} finally {
metaVolumeTaskCompleter.setLastStepStatus(_status);
if (_status != JobStatus.IN_PROGRESS) {
// set meta members native ids in step data in WF
String opId = metaVolumeTaskCompleter.getVolumeTaskCompleter().getOpId();
WorkflowService.getInstance().storeStepData(opId, metaMembers);
_log.debug("Set meta members for meta volume in WF. Members: {}", metaMembers);
}
// Do this last, after everything is complete. Do not update status in case of success. This is not independent
// operation.
if (_status == Job.JobStatus.FAILED || _status == Job.JobStatus.ERROR) {
super.updateStatus(jobContext);
}
}
}
}