use of com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory in project coprhd-controller by CoprHD.
the class SRDFOperations method performStop.
public void performStop(StorageSystem system, Volume target, TaskCompleter completer) {
log.info("START performStop");
checkTargetHasParentOrFail(target);
AbstractSRDFOperationContextFactory ctxFactory = getContextFactory(system);
ServiceError error = null;
try {
List<Volume> volumes = utils.getAssociatedVolumes(system, target);
Collection<Volume> srcVolumes = newArrayList(filter(volumes, utils.volumePersonalityPredicate(SOURCE)));
Collection<Volume> tgtVolumes = newArrayList(filter(volumes, utils.volumePersonalityPredicate(TARGET)));
ctxFactory.build(SRDFOperation.SUSPEND, target).perform();
boolean isTargetCopyModeActive = target.getSrdfCopyMode() != null && target.getSrdfCopyMode().equals(Mode.ACTIVE.toString());
if (isTargetCopyModeActive && !target.hasConsistencyGroup()) {
Volume source = getSourceVolume(target);
((SRDFLinkStopCompleter) completer).setVolumes(Arrays.asList(source), Arrays.asList(target));
log.info("Source: {}", source.getNativeId());
log.info("Target: {}", target.getNativeId());
// Remove the source and target from the list that will be stopped.
// If tgtVolumes is not empty then after stop(deletepair) resume(establish) will be done
// on rest of the volumes in the SRDF group.
Iterator<Volume> srcIter = srcVolumes.iterator();
while (srcIter.hasNext()) {
if (srcIter.next().getId().equals(source.getId())) {
srcIter.remove();
break;
}
}
Iterator<Volume> tgtIter = tgtVolumes.iterator();
while (tgtIter.hasNext()) {
if (tgtIter.next().getId().equals(target.getId())) {
tgtIter.remove();
break;
}
}
// DELETE_PAIR will stop only one pair
ctxFactory.build(SRDFOperation.DELETE_PAIR, target).perform();
if (!tgtVolumes.isEmpty() && tgtVolumes.iterator().hasNext()) {
// We need to get other pairs back in the original state.
ctxFactory.build(SRDFOperation.ESTABLISH, tgtVolumes.iterator().next()).perform();
}
// If Active SRDF copy mode then refresh storage system and update volume properties
// as target volume wwn changes after stop
ArrayList<URI> volumeURIs = new ArrayList<URI>(Arrays.asList(target.getId()));
refreshStorageSystem(system.getId());
refreshVolumeProperties(system.getId(), volumeURIs);
} else {
((SRDFLinkStopCompleter) completer).setVolumes(srcVolumes, tgtVolumes);
log.info("Sources: {}", Joiner.on(", ").join(transform(srcVolumes, fctnBlockObjectToNativeGuid())));
log.info("Targets: {}", Joiner.on(", ").join(transform(tgtVolumes, fctnBlockObjectToNativeGuid())));
ctxFactory.build(SRDFOperation.DELETE_GROUP_PAIRS, target).perform();
if (isTargetCopyModeActive) {
// If Active SRDF copy mode then refresh storage system and update volume properties
// as target volume wwn changes after stop
ArrayList<URI> volumeURIs = new ArrayList<URI>(Arrays.asList(target.getId()));
for (Volume tgtVolume : tgtVolumes) {
volumeURIs.add(tgtVolume.getId());
}
refreshStorageSystem(system.getId());
refreshVolumeProperties(system.getId(), volumeURIs);
}
}
if (target.hasConsistencyGroup()) {
StorageSystem provider = findProviderWithGroup(target);
cleanAllCgVolumesFromDeviceGroups(tgtVolumes, provider);
}
} catch (RemoteGroupAssociationNotFoundException e) {
log.warn("No remote group association found for {}. It may have already been removed.", target.getId());
} catch (Exception e) {
log.error("Failed to stop srdf link {} {}", target.getSrdfParent().getURI(), e);
StringBuffer sf = new StringBuffer();
sf.append(e.getMessage());
if (target.getSrdfCopyMode() != null && target.getSrdfCopyMode().equals(Mode.ACTIVE.toString()) && !target.hasConsistencyGroup()) {
try {
// Rollback to previous status in case of stop failure
ctxFactory.build(SRDFOperation.ESTABLISH, target).perform();
} catch (Exception e1) {
log.error("Failed to resume srdf link during rollback {} {}", target.getSrdfParent().getURI(), e);
sf.append("Rollback error: ").append(e1.getMessage());
}
}
error = SmisException.errors.jobFailed(sf.toString());
} finally {
if (error == null) {
completer.ready(dbClient);
} else {
completer.error(dbClient, error);
}
}
}
use of com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory in project coprhd-controller by CoprHD.
the class SRDFOperations method getContextFactory.
/**
* Returns the appropriate factory based on the Provider version.
*
* @param system Local or remote system
* @return Concrete factory of AbstractSRDFOperationContextFactory
*/
private AbstractSRDFOperationContextFactory getContextFactory(StorageSystem system) {
AbstractSRDFOperationContextFactory factory = null;
if (system.getUsingSmis80() != null && system.getUsingSmis80()) {
factory = new SRDFOperationContextFactory80();
} else {
factory = new SRDFOperationContextFactory40();
}
factory.setDbClient(dbClient);
factory.setHelper(helper);
factory.setUtils(utils);
return factory;
}
use of com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory in project coprhd-controller by CoprHD.
the class SRDFOperations method performSwap.
public void performSwap(StorageSystem targetSystem, Volume target, TaskCompleter completer) {
log.info("START performSwap");
checkTargetHasParentOrFail(target);
ServiceError error = null;
try {
Volume sourceVolume = getSourceVolume(target);
StorageSystem activeSystem = findProviderWithGroup(target);
Collection<CIMObjectPath> syncPaths = utils.getSynchronizations(activeSystem, sourceVolume, target, false);
CIMInstance firstSync = getInstance(syncPaths.iterator().next(), activeSystem);
AbstractSRDFOperationContextFactory ctxFactory = getContextFactory(activeSystem);
SRDFOperationContext ctx = null;
if (!isFailedOver(firstSync)) {
log.info("Failing over link");
ctx = ctxFactory.build(SRDFOperation.FAIL_OVER, target);
ctx.perform();
}
ctx = ctxFactory.build(SRDFOperation.SWAP, target);
ctx.perform();
log.info("Swapping Volume Pair {} succeeded ", sourceVolume.getId());
log.info("Changing R1 and R2 characteristics after swap");
LinkStatus successLinkStatus = LinkStatus.SWAPPED;
if (LinkStatus.SWAPPED.name().equalsIgnoreCase(target.getLinkStatus())) {
// Already swapped. Move back to CONSISTENT or IN_SYNC.
if (Mode.ASYNCHRONOUS.name().equalsIgnoreCase(target.getSrdfCopyMode())) {
successLinkStatus = LinkStatus.CONSISTENT;
} else {
successLinkStatus = LinkStatus.IN_SYNC;
}
}
changeSRDFVolumeBehaviors(sourceVolume, target, dbClient, successLinkStatus.toString());
log.info("Updating RemoteDirectorGroup after swap");
changeRemoteDirectorGroup(target.getSrdfGroup());
StorageSystem sourceSystemAfterSwap = dbClient.queryObject(StorageSystem.class, target.getStorageController());
// we run all SRDF operations using RDF group's source provider.
// target provider needs to be refreshed to perform any snap/clone operations following swap.
callEMCRefresh(helper, sourceSystemAfterSwap);
// Refresh our view of the target, since it is now the source volume.
target = dbClient.queryObject(Volume.class, sourceVolume.getId());
boolean success = false;
int attempts = 1;
while (!success && attempts <= RESUME_AFTER_SWAP_MAX_ATTEMPTS) {
try {
// Use new context to perform resume operation.
AbstractSRDFOperationContextFactory establishFactory = getContextFactory(activeSystem);
ctx = establishFactory.build(SRDFOperation.ESTABLISH, target);
ctx.appendFilters(new ErrorOnEmptyFilter());
ctx.perform();
success = true;
} catch (WBEMException | NoSynchronizationsFoundException e) {
log.warn(format(RESUME_AFTER_SWAP_EXCEPTION_MSG, attempts, RESUME_AFTER_SWAP_MAX_ATTEMPTS), e);
attempts++;
Thread.sleep(RESUME_AFTER_SWAP_SLEEP);
}
}
if (!success) {
URI sourceId = target.getSrdfParent().getURI();
String msg = format("Failed to resume SRDF link after swap for source: %s", sourceId);
log.error(msg);
error = SmisException.errors.establishAfterSwapFailure(sourceId.toString(), target.getId().toString());
}
} catch (RemoteGroupAssociationNotFoundException e) {
log.warn("No remote group association found for {}. It may have already been removed.", target.getId());
} catch (Exception e) {
log.error("Failed to swap srdf link {}", target.getSrdfParent().getURI(), e);
error = getServiceError(e);
} finally {
if (error == null) {
completer.ready(dbClient);
} else {
completer.error(dbClient, error);
}
}
}
use of com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory in project coprhd-controller by CoprHD.
the class SRDFOperations method performChangeCopyMode.
public void performChangeCopyMode(StorageSystem system, Volume target, TaskCompleter completer) {
log.info("START performChangeCopyMode");
checkTargetHasParentOrFail(target);
AbstractSRDFOperationContextFactory ctxFactory = getContextFactory(system);
ServiceError error = null;
try {
if (target.hasConsistencyGroup()) {
URIQueryResultList tgtVolumeUris = new URIQueryResultList();
dbClient.queryByConstraint(getVolumesByConsistencyGroup(target.getConsistencyGroup()), tgtVolumeUris);
Iterator<URI> tgtVolIterator = tgtVolumeUris.iterator();
List<Volume> tgtVolumes = new ArrayList<>();
while (tgtVolIterator.hasNext()) {
tgtVolumes.add(dbClient.queryObject(Volume.class, tgtVolIterator.next()));
}
log.info("Targets: {}", Joiner.on(", ").join(transform(tgtVolumes, fctnBlockObjectToNativeGuid())));
((SRDFChangeCopyModeTaskCompleter) completer).setTgtVolumes(tgtVolumes);
}
String copyMode = ((SRDFChangeCopyModeTaskCompleter) completer).getNewCopyMode();
if (RemoteDirectorGroup.SupportedCopyModes.ADAPTIVECOPY.name().equalsIgnoreCase(copyMode)) {
ctxFactory.build(SRDFOperation.RESET_TO_ADAPTIVE, target).perform();
} else if (RemoteDirectorGroup.SupportedCopyModes.SYNCHRONOUS.name().equalsIgnoreCase(copyMode)) {
ctxFactory.build(SRDFOperation.RESET_TO_SYNC, target).perform();
} else if (RemoteDirectorGroup.SupportedCopyModes.ASYNCHRONOUS.name().equalsIgnoreCase(copyMode)) {
ctxFactory.build(SRDFOperation.RESET_TO_ASYNC, target).perform();
}
} catch (Exception e) {
log.error("Failed to change copy mode for srdf link {}", target.getSrdfParent().getURI(), e);
error = SmisException.errors.jobFailed(e.getMessage());
} finally {
if (error == null) {
completer.ready(dbClient);
} else {
completer.error(dbClient, error);
}
}
}
use of com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory in project coprhd-controller by CoprHD.
the class SRDFOperations method performFailover.
public void performFailover(StorageSystem system, Volume target, TaskCompleter completer) {
log.info("START performFailover");
checkTargetHasParentOrFail(target);
ServiceError error = null;
try {
Volume sourceVolume = getSourceVolume(target);
StorageSystem sourceSystem = dbClient.queryObject(StorageSystem.class, sourceVolume.getStorageController());
// for 4.6.x CG, only failback and swap are at group level. Failover has to be called at ModifyListSync.
StorageSystem activeSystem = findProviderWithGroup(target);
AbstractSRDFOperationContextFactory ctxFactory = getContextFactory(activeSystem);
SRDFOperationContext ctx = null;
if (!system.getUsingSmis80() && !isFailedOver(activeSystem, sourceVolume, target)) {
log.info("Failing over link");
ctx = ctxFactory.build(SRDFOperation.FAIL_OVER, target);
ctx.perform();
} else {
invokeFailOverStrategy(sourceSystem, target);
}
if (completer instanceof SRDFLinkFailOverCompleter) {
// Re-check the fail over status.
LinkStatus status = null;
if (isFailedOver(activeSystem, sourceVolume, target)) {
status = LinkStatus.FAILED_OVER;
} else {
status = sourceVolume.hasConsistencyGroup() ? LinkStatus.CONSISTENT : LinkStatus.IN_SYNC;
}
((SRDFLinkFailOverCompleter) completer).setLinkStatus(status);
}
} catch (Exception e) {
log.error("Failed to failover srdf link {}", target.getSrdfParent().getURI(), e);
error = SmisException.errors.jobFailed(e.getMessage());
} finally {
if (error == null) {
completer.ready(dbClient);
} else {
completer.error(dbClient, error);
}
}
}
Aggregations