use of com.emc.storageos.db.client.model.StringSet in project coprhd-controller by CoprHD.
the class NetworkDeviceController method generateExistingZoneWarningMessages.
/**
* Generating warning messages if there are any zoneInfos that won't be deleted because
* their existingZone value is true (and we are removing the last reference.)
* @param zoneInfos -- list of NetworkFCZoneInfo representingzones to be delete.
* @return -- Warning message text (may include information about multiple zones)
*/
private String generateExistingZoneWarningMessages(List<NetworkFCZoneInfo> zoneInfos) {
StringBuilder buf = new StringBuilder();
StringSet zoneNames = new StringSet();
;
// Issue warning for zones that are lastRef but existing, as they won't be removed.
for (NetworkFCZoneInfo zoneInfo : zoneInfos) {
if (zoneInfo.isLastReference() && zoneInfo.isExistingZone()) {
zoneNames.add(zoneInfo.getZoneName());
}
}
if (!zoneNames.isEmpty()) {
buf.append("Zones which will not be deleted because they may be used externally: ");
buf.append(com.google.common.base.Joiner.on(' ').join(zoneNames));
}
return buf.toString();
}
use of com.emc.storageos.db.client.model.StringSet in project coprhd-controller by CoprHD.
the class SRDFDeviceController method createNonCGSRDFVolumes.
protected void createNonCGSRDFVolumes(Workflow workflow, String waitFor, List<VolumeDescriptor> sourceDescriptors, Map<URI, Volume> uriVolumeMap) {
for (VolumeDescriptor sourceDescriptor : sourceDescriptors) {
Volume source = uriVolumeMap.get(sourceDescriptor.getVolumeURI());
// this will be null for normal use cases except vpool change
URI vpoolChangeUri = getVirtualPoolChangeVolume(sourceDescriptors);
log.info("VPoolChange URI {}", vpoolChangeUri);
StringSet srdfTargets = source.getSrdfTargets();
for (String targetStr : srdfTargets) {
URI targetURI = URI.create(targetStr);
Volume target = uriVolumeMap.get(targetURI);
RemoteDirectorGroup group = dbClient.queryObject(RemoteDirectorGroup.class, target.getSrdfGroup());
StorageSystem system = dbClient.queryObject(StorageSystem.class, group.getSourceStorageSystemUri());
Workflow.Method createMethod = createSRDFVolumePairMethod(system.getId(), source.getId(), targetURI, vpoolChangeUri);
Workflow.Method rollbackMethod = rollbackSRDFLinkMethod(system.getId(), source.getId(), targetURI, false);
// Ensure CreateElementReplica steps are executed sequentially (CQ613404)
waitFor = workflow.createStep(CREATE_SRDF_MIRRORS_STEP_GROUP, CREATE_SRDF_MIRRORS_STEP_DESC, waitFor, system.getId(), system.getSystemType(), getClass(), createMethod, rollbackMethod, null);
}
}
}
use of com.emc.storageos.db.client.model.StringSet in project coprhd-controller by CoprHD.
the class SRDFDeviceController method createNonCGSrdfPairStepsOnPopulatedGroup.
/**
* This method creates steps to create SRDF pairs in a populated SRDF group.
*
* @param sourceDescriptors list of source volume descriptors
* @param targetDescriptors list of target volume descriptors
* @param group reference to RemoteDirectorGroup
* @param uriVolumeMap map of volume URI to volume object
* @param waitFor String waitFor of previous step, we wait on this to complete
* @param workflow Reference to Workflow
* @return stepId
*/
private String createNonCGSrdfPairStepsOnPopulatedGroup(List<VolumeDescriptor> sourceDescriptors, List<VolumeDescriptor> targetDescriptors, RemoteDirectorGroup group, Map<URI, Volume> uriVolumeMap, String waitFor, Workflow workflow) {
StorageSystem system = dbClient.queryObject(StorageSystem.class, group.getSourceStorageSystemUri());
URI vpoolChangeUri = getVirtualPoolChangeVolume(sourceDescriptors);
log.info("VPoolChange URI {}", vpoolChangeUri);
List<URI> sourceURIs = VolumeDescriptor.getVolumeURIs(sourceDescriptors);
List<URI> targetURIs = new ArrayList<>();
for (URI sourceURI : sourceURIs) {
Volume source = uriVolumeMap.get(sourceURI);
StringSet srdfTargets = source.getSrdfTargets();
for (String targetStr : srdfTargets) {
URI targetURI = URI.create(targetStr);
targetURIs.add(targetURI);
}
}
Mode SRDFMode = getSRDFMode(sourceDescriptors, uriVolumeMap);
/*
* Invoke Suspend on the SRDF group as more ACTIVE pairs cannot added until all other
* existing pairs are in NOT-READY state
*/
// Suspend All the pairs in RDF Group only if its change Virtual Pool operation, the reason being the format flag introduced in Trinity
// would wipe data on the source volumes. Data in source volumes is only possible during change Virtual Pool operations, hence going ahead with
// suspending all the pairs.
String suspendGroupStep = waitFor;
if (Mode.ACTIVE.equals(SRDFMode) && !NullColumnValueGetter.isNullURI(vpoolChangeUri)) {
Method suspendGroupMethod = suspendSRDFGroupMethod(system.getId(), group, sourceURIs, targetURIs);
Method resumeRollbackMethod = resumeSRDFGroupMethod(system.getId(), group, sourceURIs, targetURIs);
suspendGroupStep = workflow.createStep(CREATE_SRDF_ACTIVE_VOLUME_PAIR_STEP_GROUP, SUSPEND_SRDF_MIRRORS_STEP_DESC, waitFor, system.getId(), system.getSystemType(), getClass(), suspendGroupMethod, resumeRollbackMethod, null);
}
/*
* Invoke CreateListReplica with all source/target pairings.
*/
Method createListMethod = createListReplicasMethod(system.getId(), sourceURIs, targetURIs, vpoolChangeUri, false);
// false here because we want to rollback individual links not the entire (pre-existing) group.
Method rollbackMethod = rollbackSRDFLinksMethod(system.getId(), sourceURIs, targetURIs, false, !NullColumnValueGetter.isNullURI(vpoolChangeUri));
String createListReplicaStep = workflow.createStep(CREATE_SRDF_ACTIVE_VOLUME_PAIR_STEP_GROUP, CREATE_SRDF_ACTIVE_VOLUME_PAIR_STEP_DESC, suspendGroupStep, system.getId(), system.getSystemType(), getClass(), createListMethod, rollbackMethod, null);
String resumeGroupStep = createListReplicaStep;
/*
* Invoke Resume on the SRDF group to get all pairs back in the READY state.
*/
if (Mode.ACTIVE.equals(SRDFMode) && !NullColumnValueGetter.isNullURI(vpoolChangeUri)) {
Method resumeGroupMethod = resumeSRDFGroupMethod(system.getId(), group, sourceURIs, targetURIs);
resumeGroupStep = workflow.createStep(CREATE_SRDF_ACTIVE_VOLUME_PAIR_STEP_GROUP, RESUME_SRDF_MIRRORS_STEP_DESC, createListReplicaStep, system.getId(), system.getSystemType(), getClass(), resumeGroupMethod, rollbackMethodNullMethod(), null);
}
return resumeGroupStep;
}
use of com.emc.storageos.db.client.model.StringSet in project coprhd-controller by CoprHD.
the class SRDFDeviceController method addStepsForExpandVolume.
// TODO : JIRA CTRL-5335 SRDF expand needs to go via BlockOrchestrationController. Close this JIRA.
@Override
public String addStepsForExpandVolume(Workflow workflow, String waitFor, List<VolumeDescriptor> descriptors, String task) {
TaskCompleter completer = null;
descriptors = VolumeDescriptor.filterByType(descriptors, VolumeDescriptor.Type.SRDF_SOURCE);
if (descriptors.isEmpty()) {
return waitFor;
}
if (descriptors.size() > 1) {
throw WorkflowException.exceptions.workflowConstructionError("SRDFDeviceController.addStepsForExpandVolume only supports one source volume");
}
VolumeDescriptor descriptor = descriptors.get(0);
Long size = descriptor.getVolumeSize();
List<URI> uris = VolumeDescriptor.getVolumeURIs(descriptors);
URI volumeId = uris.get(0);
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, source.getPool(), volumeId, size, task);
// resync source and target again
waitFor = 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, source.getPool(), 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);
waitFor = 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, source.getPool(), volumeId, size, task);
// create Relationship again
waitFor = createSrdfCGPairStepsOnPopulatedGroup(source, expandStep, workflow);
}
}
}
}
} catch (Exception e) {
log.error("Failed SRDF Expand Volume operation ", e);
completeAsError(completer, DeviceControllerException.errors.jobFailed(e), task);
throw e;
}
return waitFor;
}
use of com.emc.storageos.db.client.model.StringSet 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);
}
}
Aggregations