use of com.emc.storageos.db.client.model.StorageSystem in project coprhd-controller by CoprHD.
the class ProtectionOrchestrationDeviceController method performSRDFProtectionOperation.
@Override
public void performSRDFProtectionOperation(URI storageSystemId, Copy copy, String op, String task) {
StorageSystem storageSystem = dbClient.queryObject(StorageSystem.class, storageSystemId);
// Maps Vplex volume that needs to be flushed to underlying array volume
Map<Volume, Volume> vplexToArrayVolumesToFlush = getVplexVolumesToBeCacheFlushed(copy, op);
List<URI> readOnlyVolumes = getVolumesForResume(copy);
if (!vplexToArrayVolumesToFlush.isEmpty()) {
executeFlushWorkflow(vplexToArrayVolumesToFlush, storageSystem, copy, op, task);
} else if (op.equalsIgnoreCase(RESUME) && !readOnlyVolumes.isEmpty()) {
executeResumeWorkflow(storageSystem, readOnlyVolumes, copy, op, task);
} else {
srdfDeviceController.performProtectionOperation(storageSystemId, copy, op, task);
}
}
use of com.emc.storageos.db.client.model.StorageSystem in project coprhd-controller by CoprHD.
the class NetworkScheduler method getVPlexClusterSerialNumber.
/**
* For the passed VPLEX port, determines the VPLEX cluster for the port
* and then returns the serial number for that cluster. Called when
* configuring the zone name for a VPLEX port.
*
* @param port A reference to a VPLEX port.
* @return The serial number for the port's cluster.
*/
private String getVPlexClusterSerialNumber(StoragePort port) {
URI systemURI = port.getStorageDevice();
StorageSystem vplexSystem = _dbClient.queryObject(StorageSystem.class, systemURI);
String portClusterId = ConnectivityUtil.getVplexClusterOfPort(port);
return VPlexUtil.getVPlexClusterSerialNumber(portClusterId, vplexSystem);
}
use of com.emc.storageos.db.client.model.StorageSystem in project coprhd-controller by CoprHD.
the class SRDFDeviceController method expandVolume.
@Override
public void expandVolume(URI storage, URI pool, URI volumeId, Long size, String task) throws InternalException {
TaskCompleter completer = null;
Workflow workflow = workflowService.getNewWorkflow(this, "expandVolume", true, task);
String waitFor = null;
try {
Volume source = dbClient.queryObject(Volume.class, volumeId);
StringSet targets = source.getSrdfTargets();
List<URI> combined = Lists.newArrayList();
combined.add(source.getId());
combined.addAll(transform(targets, FCTN_STRING_TO_URI));
completer = new SRDFExpandCompleter(combined, task);
if (null != targets) {
for (String targetURI : targets) {
Volume target = dbClient.queryObject(Volume.class, URI.create(targetURI));
log.info("target Volume {} with srdf group {}", target.getNativeGuid(), target.getSrdfGroup());
RemoteDirectorGroup group = dbClient.queryObject(RemoteDirectorGroup.class, target.getSrdfGroup());
StorageSystem system = dbClient.queryObject(StorageSystem.class, group.getSourceStorageSystemUri());
Set<String> volumes = findVolumesPartOfRDFGroups(system, group);
if (group.getVolumes() == null) {
group.setVolumes(new StringSet());
}
group.getVolumes().replace(volumes);
dbClient.persistObject(group);
if (!source.hasConsistencyGroup()) {
// First we suspend the mirror...
Workflow.Method suspendMethod = suspendSRDFLinkMethod(system.getId(), source.getId(), target.getId(), true);
// TODO Belongs as a rollback for the detach step
Workflow.Method rollbackMethod = createSRDFVolumePairMethod(system.getId(), source.getId(), target.getId(), null);
String suspendStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, SPLIT_SRDF_MIRRORS_STEP_DESC, waitFor, system.getId(), system.getSystemType(), getClass(), suspendMethod, rollbackMethod, null);
// Second we detach the mirror...
Workflow.Method detachMethod = detachVolumePairMethod(system.getId(), source.getId(), target.getId());
String detachStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, DETACH_SRDF_MIRRORS_STEP_DESC, suspendStep, system.getId(), system.getSystemType(), getClass(), detachMethod, null, null);
// Expand the source and target Volumes
String expandStep = addExpandBlockVolumeSteps(workflow, detachStep, pool, volumeId, size, task);
// resync source and target again
createSyncSteps(workflow, expandStep, source, system);
} else {
if (volumes.size() == 1) {
// split all members the group
Workflow.Method splitMethod = splitSRDFGroupLinkMethod(system.getId(), source.getId(), target.getId(), false);
String splitStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, SPLIT_SRDF_MIRRORS_STEP_DESC, waitFor, system.getId(), system.getSystemType(), getClass(), splitMethod, null, null);
// Second we detach the group...
Workflow.Method detachMethod = detachGroupPairsMethod(system.getId(), source.getId(), target.getId());
Workflow.Method resumeMethod = resumeGroupPairsMethod(system.getId(), source.getId(), target.getId());
String detachMirrorStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, DETACH_SRDF_MIRRORS_STEP_DESC, splitStep, system.getId(), system.getSystemType(), getClass(), detachMethod, resumeMethod, null);
// Expand the source and target Volumes
String expandStep = addExpandBlockVolumeSteps(workflow, detachMirrorStep, pool, volumeId, size, task);
// re-establish again
List<URI> sourceURIs = new ArrayList<URI>();
sourceURIs.add(source.getId());
List<URI> targetURIs = new ArrayList<URI>();
targetURIs.add(target.getId());
Workflow.Method createGroupsMethod = createSrdfCgPairsMethod(system.getId(), sourceURIs, targetURIs, null);
workflow.createStep(CREATE_SRDF_MIRRORS_STEP_GROUP, CREATE_SRDF_MIRRORS_STEP_DESC, expandStep, system.getId(), system.getSystemType(), getClass(), createGroupsMethod, null, null);
} else {
// First we remove the sync pair from Async CG...
Workflow.Method removeAsyncPairMethod = removePairFromGroup(system.getId(), source.getId(), target.getId(), true);
List<URI> sourceUris = new ArrayList<URI>();
sourceUris.add(system.getId());
String removePairFromGroupWorkflowDesc = String.format(REMOVE_SRDF_PAIR_STEP_DESC, target.getSrdfCopyMode());
String detachVolumePairWorkflowDesc = String.format(DETACH_SRDF_PAIR_STEP_DESC, target.getSrdfCopyMode());
Workflow.Method addSyncPairMethod = addVolumePairsToCgMethod(system.getId(), sourceUris, group.getId(), null);
String removeAsyncPairStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, removePairFromGroupWorkflowDesc, waitFor, system.getId(), system.getSystemType(), getClass(), removeAsyncPairMethod, addSyncPairMethod, null);
// split the removed async pair
Workflow.Method suspend = suspendSRDFLinkMethod(system.getId(), source.getId(), target.getId(), true);
Workflow.Method resumeSyncPairMethod = resumeSyncPairMethod(system.getId(), source.getId(), target.getId());
String suspendStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, SPLIT_SRDF_MIRRORS_STEP_DESC, removeAsyncPairStep, system.getId(), system.getSystemType(), getClass(), suspend, resumeSyncPairMethod, null);
// Finally we detach the removed async pair...
Workflow.Method detachAsyncPairMethod = detachVolumePairMethod(system.getId(), source.getId(), target.getId());
Workflow.Method createSyncPairMethod = createSRDFVolumePairMethod(system.getId(), source.getId(), target.getId(), null);
String detachStep = workflow.createStep(DELETE_SRDF_MIRRORS_STEP_GROUP, detachVolumePairWorkflowDesc, suspendStep, system.getId(), system.getSystemType(), getClass(), detachAsyncPairMethod, createSyncPairMethod, null);
// Expand the source and target Volumes
String expandStep = addExpandBlockVolumeSteps(workflow, detachStep, pool, volumeId, size, task);
// create Relationship again
createSrdfCGPairStepsOnPopulatedGroup(source, expandStep, workflow);
}
}
}
}
String successMessage = String.format("Workflow of SRDF Expand Volume %s successfully created", volumeId);
workflow.executePlan(completer, successMessage);
} catch (Exception e) {
log.error("Failed SRDF Expand Volume operation ", e);
completeAsError(completer, DeviceControllerException.errors.jobFailed(e), task);
}
}
use of com.emc.storageos.db.client.model.StorageSystem in project coprhd-controller by CoprHD.
the class SRDFDeviceController method resumeSyncPairStep.
public boolean resumeSyncPairStep(final URI systemURI, final URI sourceURI, final URI targetURI, final boolean onGroup, final String opId) {
log.info("START Resume Sync Pair onGroup={}", onGroup);
TaskCompleter completer = null;
try {
WorkflowStepCompleter.stepExecuting(opId);
StorageSystem system = getStorageSystem(systemURI);
Volume targetVolume = dbClient.queryObject(Volume.class, targetURI);
List<URI> combined = new ArrayList<URI>(Arrays.asList(sourceURI, targetURI));
if (onGroup) {
SRDFUtils.addSRDFCGVolumesForTaskCompleter(sourceURI, dbClient, combined);
}
completer = new SRDFLinkResumeCompleter(combined, opId);
getRemoteMirrorDevice().doResumeLink(system, targetVolume, false, completer);
} catch (Exception e) {
return completeAsError(completer, DeviceControllerException.errors.jobFailed(e), opId);
}
return true;
}
use of com.emc.storageos.db.client.model.StorageSystem in project coprhd-controller by CoprHD.
the class SRDFDeviceController method suspendSrdfGroupStep.
/**
* Method to suspend SRDF group called a workflow step.
*
* @param systemURI Reference to storage system URI
* @param group Reference to RemoteDirectorGroup which represents SRDF group.
* @param sourceVolumes List of source volumes URI
* @param targetVolumes List of target volumes URI
* @param opId The stepId used for completion.
* @return true if suspend is successful else false
*/
public boolean suspendSrdfGroupStep(final URI systemURI, final RemoteDirectorGroup group, final List<URI> sourceVolumes, final List<URI> targetVolumes, String opId) {
log.info("START Suspend SRDF group {} for {}", group.getLabel(), systemURI);
TaskCompleter completer = null;
try {
WorkflowStepCompleter.stepExecuting(opId);
StorageSystem system = getStorageSystem(systemURI);
List<Volume> volumes = utils.getAssociatedVolumesForSRDFGroup(system, group);
Collection<Volume> tgtVolumes = newArrayList(filter(volumes, utils.volumePersonalityPredicate(TARGET)));
if (!tgtVolumes.isEmpty() && tgtVolumes.iterator().hasNext()) {
List<URI> combinedVolumeList = new ArrayList<URI>();
combinedVolumeList.addAll(sourceVolumes);
combinedVolumeList.addAll(targetVolumes);
completer = new SRDFLinkSuspendCompleter(combinedVolumeList, opId);
getRemoteMirrorDevice().doSuspendLink(system, tgtVolumes.iterator().next(), false, false, completer);
} else {
log.info("There are no more volumes in the SRDF group {} {}, so no need to call suspend.", group.getLabel(), group.getId());
WorkflowStepCompleter.stepSucceded(opId);
}
} catch (Exception e) {
return completeAsError(completer, DeviceControllerException.errors.jobFailed(e), opId);
}
return true;
}
Aggregations