/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.smis.job;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.cim.CIMObjectPath;
import javax.cim.CIMProperty;
import javax.wbem.CloseableIterator;
import javax.wbem.client.WBEMClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.exceptions.DeviceControllerErrors;
import com.emc.storageos.svcs.errorhandling.model.ServiceError;
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;
/**
* A job used for creating VDEVs for a snapshot target group
*/
public class SmisCreateVmaxCGTargetVolumesJob extends SmisJob {
private static final Logger _log = LoggerFactory.getLogger(SmisCreateVmaxCGTargetVolumesJob.class);
private List<String> _deviceIds;
public SmisCreateVmaxCGTargetVolumesJob(CIMObjectPath cimJob, URI storageSystem,
String sourceGroupName,
String snapshotLabel, Boolean createInactive,
TaskCompleter taskCompleter) {
super(cimJob, storageSystem, taskCompleter, "CreateVdevVolume");
}
@Override
public void updateStatus(JobContext jobContext) throws Exception {
CloseableIterator<CIMObjectPath> iterator = null;
DbClient dbClient = jobContext.getDbClient();
JobStatus jobStatus = getJobStatus();
try {
if (jobStatus == JobStatus.SUCCESS) {
_deviceIds = new ArrayList<String>();
CIMConnectionFactory cimConnectionFactory = jobContext.getCimConnectionFactory();
WBEMClient client = getWBEMClient(dbClient, cimConnectionFactory);
iterator = client.associatorNames(getCimJob(), null, SmisConstants.CIM_STORAGE_VOLUME, null, null);
while (iterator.hasNext()) {
CIMObjectPath volumePath = iterator.next();
CIMProperty<String> deviceID = (CIMProperty<String>) volumePath.getKey(SmisConstants.CP_DEVICE_ID);
String nativeID = deviceID.getValue();
if (nativeID == null || nativeID.isEmpty()) {
throw new IllegalStateException("Could not determine volume native ID from the SMI-S provider");
}
_deviceIds.add(nativeID);
}
} else if (jobStatus == JobStatus.FAILED || jobStatus == JobStatus.FATAL_ERROR) {
_log.info("Failed to create volume: {}", getTaskCompleter().getId());
}
} catch (Exception e) {
setPostProcessingFailedStatus(e.getMessage());
_log.error("Caught an exception while trying to updateStatus for SmisCreateVmaxCGTargetVolumesJob", e);
ServiceError error = DeviceControllerErrors.smis.methodFailed("updateStatus", e.getMessage());
getTaskCompleter().error(dbClient, error);
} finally {
if (iterator != null) {
iterator.close();
}
}
}
public List<String> getTargetDeviceIds() {
return _deviceIds;
}
}