package com.emc.storageos.volumecontroller.impl.smis.job; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.BlockSnapshotSession; import com.emc.storageos.plugins.common.Constants; import com.emc.storageos.volumecontroller.JobContext; import com.emc.storageos.volumecontroller.TaskCompleter; import com.emc.storageos.volumecontroller.impl.smis.CIMConnectionFactory; import com.emc.storageos.volumecontroller.impl.smis.SmisConstants; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.cim.CIMObjectPath; import javax.wbem.CloseableIterator; import javax.wbem.client.WBEMClient; import java.net.URI; import java.util.Iterator; import java.util.List; /** * ViPR Job created when an underlying CIM job is created to create * a new array group snapshot point-in-time copy represented in ViPR by a * BlockSnapshotSession instance. * * @author Ian Bibby */ public class SmisBlockSnapshotSessionCGCreateJob extends SmisJob { private static Logger log = LoggerFactory.getLogger(SmisBlockSnapshotSessionCGCreateJob.class); private static String JOB_NAME = "SmisBlockSnapshotSessionCGCreateJob"; public SmisBlockSnapshotSessionCGCreateJob(CIMObjectPath cimJob, URI storageSystem, TaskCompleter taskCompleter) { super(cimJob, storageSystem, taskCompleter, JOB_NAME); } @Override public void updateStatus(JobContext jobContext) throws Exception { JobStatus jobStatus = getJobStatus(); CloseableIterator<CIMObjectPath> syncAspectIter = null; CloseableIterator<CIMObjectPath> settingsStateIter = null; try { DbClient dbClient = jobContext.getDbClient(); if (jobStatus == JobStatus.IN_PROGRESS) { return; } if (jobStatus == JobStatus.SUCCESS) { log.info("Post-processing successful snapshot session group creation for task ", getTaskCompleter().getOpId()); // Get the snapshot sessions. Iterator<BlockSnapshotSession> iterator = dbClient.queryIterativeObjects(BlockSnapshotSession.class, getTaskCompleter().getIds(), true); List<BlockSnapshotSession> snapSessions = Lists.newArrayList(iterator); // Update Settings instance for the session. CIMConnectionFactory cimConnectionFactory = jobContext.getCimConnectionFactory(); WBEMClient client = getWBEMClient(dbClient, cimConnectionFactory); syncAspectIter = client.associatorNames(getCimJob(), null, SmisConstants.SYMM_SYNCHRONIZATION_ASPECT_FOR_SOURCE_GROUP, null, null); if (syncAspectIter.hasNext()) { CIMObjectPath syncAspectPath = syncAspectIter.next(); String instanceId = syncAspectPath.getKeyValue(Constants.INSTANCEID).toString(); log.info("SynchronizationAspectForSourceGroup instance id is {}", instanceId); for (BlockSnapshotSession snapSession : snapSessions) { snapSession.setSessionInstance(instanceId); } dbClient.updateObject(snapSessions); } } else if (jobStatus == JobStatus.FAILED || jobStatus == JobStatus.FATAL_ERROR) { log.info("Failed to create snapshot session for task ", getTaskCompleter().getOpId()); } } catch (Exception e) { setPostProcessingErrorStatus("Encountered an internal error in create snapshot session job status processing: " + e.getMessage()); log.error("Encountered an internal error in create snapshot session job status processing", e); } finally { if (syncAspectIter != null) { syncAspectIter.close(); } if (settingsStateIter != null) { settingsStateIter.close(); } super.updateStatus(jobContext); } } }