/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.smis.srdf;
import static com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory.SRDFOperation.DELETE_PAIR;
import static com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory.SRDFOperation.SPLIT;
import static com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory.SRDFOperation.SUSPEND;
import static com.emc.storageos.volumecontroller.impl.smis.srdf.AbstractSRDFOperationContextFactory.SRDFOperation.SUSPEND_CONS_EXEMPT;
import java.util.Arrays;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.volumecontroller.impl.smis.SRDFOperations;
import com.emc.storageos.volumecontroller.impl.smis.SRDFOperations.Mode;
import com.emc.storageos.volumecontroller.impl.smis.srdf.collectors.ActiveSynchronizationsOnlyFilter;
import com.emc.storageos.volumecontroller.impl.smis.srdf.collectors.CollectorStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.ChangeModeToAdaptiveStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.ChangeModeToAsyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.ChangeModeToSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.DetachGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.DetachStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.EstablishGroupActiveStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.EstablishGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.EstablishStorageActiveStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.EstablishStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.ExecutorStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailMechanismGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailMechanismStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailbackGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailbackStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailoverGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.FailoverStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.RestoreGroupActiveSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.RestoreGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.RestoreStorageActiveSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.RestoreStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SplitGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SplitStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SuspendGroupActiveStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SuspendGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SuspendStorageActiveStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SuspendStorageSyncsStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SuspendWithConsExemptStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SwapGroupSyncStrategy;
import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.SwapStorageSyncsStrategy;
/**
* Created by bibbyi1 on 4/8/2015.
*/
public class SRDFOperationContextFactory80 extends AbstractSRDFOperationContextFactory {
@Override
public SRDFOperationContext build(SRDFOperation operation, Volume target) {
SRDFOperationContext ctx = new SRDFOperationContext();
// Always set the target volume.
ctx.setTarget(target);
// With 8.x Provider, groups are accessible from either Provider.
ctx.setProviderFinder(findProviderFactory().anyReachable(target));
// Determine how to collect synchronization instances
CollectorStrategy collectorStrategy = null;
if (SUSPEND_CONS_EXEMPT.equals(operation) || DELETE_PAIR.equals(operation)) {
collectorStrategy = collectorFactory().getSingleCollector();
} else {
collectorStrategy = collectorFactory().getCollector(target, true);
}
ctx.setCollector(collectorStrategy);
if (SUSPEND_CONS_EXEMPT.equals(operation) && !isAsync(target)) {
// suspend+cons_exempt not valid for Sync with/without CG
operation = SUSPEND;
}
if (isPausingOperation(operation)) {
ctx.appendFilters(new ActiveSynchronizationsOnlyFilter(utils));
}
boolean activeMode = Mode.ACTIVE.equals(Mode.valueOf(target.getSrdfCopyMode()));
// Determine how to build the SMI-S arguments
ExecutorStrategy executorStrategy = null;
switch (operation) {
case FAIL_MECHANISM:
if (target.hasConsistencyGroup()) {
executorStrategy = new FailMechanismGroupSyncStrategy(helper);
} else {
executorStrategy = new FailMechanismStorageSyncsStrategy(helper);
}
break;
case SUSPEND:
if (target.hasConsistencyGroup()) {
if (activeMode) {
executorStrategy = new SuspendGroupActiveStrategy(helper);
} else {
executorStrategy = new SuspendGroupSyncStrategy(helper);
}
} else {
if (activeMode) {
executorStrategy = new SuspendStorageActiveStrategy(helper);
} else {
executorStrategy = new SuspendStorageSyncsStrategy(helper);
}
}
break;
case SUSPEND_CONS_EXEMPT:
executorStrategy = new SuspendWithConsExemptStrategy(helper);
break;
case SPLIT:
if (target.hasConsistencyGroup()) {
executorStrategy = new SplitGroupSyncStrategy(helper);
} else {
executorStrategy = new SplitStorageSyncsStrategy(helper);
}
break;
case ESTABLISH:
if (target.hasConsistencyGroup()) {
if (activeMode) {
executorStrategy = new EstablishGroupActiveStrategy(helper);
} else {
executorStrategy = new EstablishGroupSyncStrategy(helper);
}
} else {
if (activeMode) {
executorStrategy = new EstablishStorageActiveStrategy(helper);
} else {
executorStrategy = new EstablishStorageSyncsStrategy(helper);
}
}
break;
case FAIL_OVER:
if (target.hasConsistencyGroup()) {
executorStrategy = new FailoverGroupSyncStrategy(helper);
} else {
executorStrategy = new FailoverStorageSyncsStrategy(helper);
}
break;
case FAIL_BACK:
if (target.hasConsistencyGroup()) {
executorStrategy = new FailbackGroupSyncStrategy(helper);
} else {
executorStrategy = new FailbackStorageSyncsStrategy(helper);
}
break;
case RESTORE:
if (target.hasConsistencyGroup()) {
if (activeMode) {
executorStrategy = new RestoreGroupActiveSyncStrategy(helper);
} else {
executorStrategy = new RestoreGroupSyncStrategy(helper);
}
} else {
if (activeMode) {
executorStrategy = new RestoreStorageActiveSyncsStrategy(helper);
} else {
executorStrategy = new RestoreStorageSyncsStrategy(helper);
}
}
break;
case SWAP:
if (target.hasConsistencyGroup()) {
executorStrategy = new SwapGroupSyncStrategy(helper);
} else {
executorStrategy = new SwapStorageSyncsStrategy(helper);
}
break;
case DELETE_GROUP_PAIRS:
if (target.hasConsistencyGroup()) {
executorStrategy = new DetachGroupSyncStrategy(helper);
} else {
executorStrategy = new DetachStorageSyncsStrategy(helper);
}
break;
case DELETE_PAIR:
executorStrategy = new DetachStorageSyncsStrategy(helper);
break;
case RESET_TO_ADAPTIVE:
executorStrategy = new ChangeModeToAdaptiveStrategy(helper);
break;
case RESET_TO_ASYNC:
executorStrategy = new ChangeModeToAsyncStrategy(helper);
break;
case RESET_TO_SYNC:
executorStrategy = new ChangeModeToSyncStrategy(helper);
break;
}
ctx.setExecutor(executorStrategy);
return ctx;
}
private boolean isAsync(Volume target) {
return SRDFOperations.Mode.ASYNCHRONOUS.toString().equalsIgnoreCase(target.getSrdfCopyMode());
}
private boolean isAsyncWithoutCG(Volume target) {
return isAsync(target) && !target.hasConsistencyGroup();
}
private boolean isPausingOperation(SRDFOperation operation) {
return Arrays.asList(SPLIT, SUSPEND, SUSPEND_CONS_EXEMPT).contains(operation);
}
}