/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package util.builders;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import models.DriveTypes;
import models.HighAvailability;
import models.VirtualPoolPlacementPolicy;
import org.apache.commons.lang.StringUtils;
import com.emc.storageos.model.vpool.BlockVirtualPoolParam;
import com.emc.storageos.model.vpool.BlockVirtualPoolProtectionParam;
import com.emc.storageos.model.vpool.BlockVirtualPoolRestRep;
import com.emc.storageos.model.vpool.ProtectionCopyPolicy;
import com.emc.storageos.model.vpool.ProtectionSourcePolicy;
import com.emc.storageos.model.vpool.VirtualPoolHighAvailabilityParam;
import com.emc.storageos.model.vpool.VirtualPoolHighAvailabilityParam.VirtualArrayVirtualPoolMapEntry;
import com.emc.storageos.model.vpool.VirtualPoolProtectionMirrorParam;
import com.emc.storageos.model.vpool.VirtualPoolProtectionRPParam;
import com.emc.storageos.model.vpool.VirtualPoolProtectionSnapshotsParam;
import com.emc.storageos.model.vpool.VirtualPoolProtectionVirtualArraySettingsParam;
import com.emc.storageos.model.vpool.VirtualPoolRemoteMirrorProtectionParam;
import com.emc.storageos.model.vpool.VirtualPoolRemoteProtectionVirtualArraySettingsParam;
import com.google.common.collect.Sets;
public class BlockVirtualPoolBuilder extends VirtualPoolBuilder {
private final BlockVirtualPoolParam virtualPool;
public BlockVirtualPoolBuilder() {
this(new BlockVirtualPoolParam());
}
public BlockVirtualPoolBuilder(BlockVirtualPoolParam virtualPool) {
super(virtualPool);
this.virtualPool = virtualPool;
}
@Override
public BlockVirtualPoolParam getVirtualPool() {
return virtualPool;
}
public BlockVirtualPoolBuilder setHostIOLimitBandwidth(int limit) {
virtualPool.setHostIOLimitBandwidth(limit);
return this;
}
public BlockVirtualPoolBuilder setHostIOLimitIOPs(int limit) {
virtualPool.setHostIOLimitIOPs(limit);
return this;
}
public BlockVirtualPoolBuilder setPlacementPolicy(String placementPolicy) {
String policyName = StringUtils.defaultIfBlank(placementPolicy, VirtualPoolPlacementPolicy.DEFAULT);
virtualPool.setPlacementPolicy(policyName);
return this;
}
public BlockVirtualPoolBuilder setMinPaths(int paths) {
virtualPool.setMinPaths(paths);
return this;
}
public BlockVirtualPoolBuilder setMaxPaths(int paths) {
virtualPool.setMaxPaths(paths);
return this;
}
public BlockVirtualPoolBuilder setPathsPerInitiator(int paths) {
virtualPool.setPathsPerInitiator(paths);
return this;
}
public BlockVirtualPoolBuilder setAutoTieringPolicyName(String autoTieringPolicyName) {
virtualPool.setAutoTieringPolicyName(StringUtils.trimToNull(autoTieringPolicyName));
return this;
}
public BlockVirtualPoolBuilder setCompressionEnabled(boolean compressionEnabled) {
virtualPool.setCompressionEnabled(compressionEnabled);
return this;
}
public BlockVirtualPoolBuilder setDriveType(String driveType) {
virtualPool.setDriveType(StringUtils.defaultIfEmpty(driveType, DriveTypes.NONE));
return this;
}
public BlockVirtualPoolBuilder setExpandable(boolean expandable) {
virtualPool.setExpandable(expandable);
return this;
}
public BlockVirtualPoolBuilder setFastExpansion(boolean fastExpansion) {
virtualPool.setFastExpansion(fastExpansion);
return this;
}
public BlockVirtualPoolBuilder setThinVolumePreAllocationPercentage(Integer percent) {
virtualPool.setThinVolumePreAllocationPercentage(percent);
return this;
}
public BlockVirtualPoolBuilder setUniquePolicyNames(boolean uniquePolicyNames) {
virtualPool.setUniquePolicyNames(uniquePolicyNames);
return this;
}
public BlockVirtualPoolBuilder setMultiVolumeConsistency(boolean multiVolumeConsistency) {
virtualPool.setMultiVolumeConsistency(multiVolumeConsistency);
return this;
}
public BlockVirtualPoolBuilder setRaidLevels(Collection<String> raidLevels) {
if (raidLevels != null) {
virtualPool.setRaidLevels(Sets.newHashSet(raidLevels));
}
else {
virtualPool.setRaidLevels(Sets.<String> newHashSet());
}
return this;
}
protected BlockVirtualPoolProtectionParam getProtection() {
if (virtualPool.getProtection() == null) {
virtualPool.setProtection(new BlockVirtualPoolProtectionParam());
}
return virtualPool.getProtection();
}
public BlockVirtualPoolBuilder setSnapshots(Integer maxSnapshots) {
getProtection().setSnapshots(new VirtualPoolProtectionSnapshotsParam(maxSnapshots));
return this;
}
public BlockVirtualPoolBuilder setContinuousCopies(Integer maxCopies, URI virtualPoolId) {
getProtection().setContinuousCopies(new VirtualPoolProtectionMirrorParam(maxCopies, virtualPoolId));
return this;
}
protected VirtualPoolProtectionRPParam getRecoverPoint() {
if (getProtection().getRecoverPoint() == null) {
getProtection().setRecoverPoint(new VirtualPoolProtectionRPParam());
}
return getProtection().getRecoverPoint();
}
public BlockVirtualPoolBuilder disableRecoverPoint() {
getProtection().setRecoverPoint(new VirtualPoolProtectionRPParam());
return this;
}
public BlockVirtualPoolBuilder enableRecoverPoint(String journalSize) {
return setRecoverPointJournalSize(journalSize);
}
public BlockVirtualPoolBuilder setRecoverPointJournalSize(String journalSize) {
if (journalSize != null) {
if (getProtectionSourcePolicy() == null) {
getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy());
}
getProtectionSourcePolicy().setJournalSize(journalSize);
}
return this;
}
public BlockVirtualPoolBuilder setRecoverPointRemoteCopyMode(String remoteCopyMode) {
if (remoteCopyMode != null) {
if (getProtectionSourcePolicy() == null) {
getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy());
}
getProtectionSourcePolicy().setRemoteCopyMode(remoteCopyMode);
}
return this;
}
public BlockVirtualPoolBuilder setRecoverPointRpo(Long value, String type) {
if (value != null) {
if (getProtectionSourcePolicy() == null) {
getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy());
}
getProtectionSourcePolicy().setRpoValue(value);
getProtectionSourcePolicy().setRpoType(type);
}
return this;
}
protected ProtectionSourcePolicy getProtectionSourcePolicy() {
return getRecoverPoint().getSourcePolicy();
}
public BlockVirtualPoolBuilder setJournalVarrayAndVpool(URI journalVarray, URI journalVpool) {
if (getProtectionSourcePolicy() == null) {
getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy());
}
getProtectionSourcePolicy().setJournalVarray(journalVarray);
getProtectionSourcePolicy().setJournalVpool(journalVpool);
return this;
}
public BlockVirtualPoolBuilder setStandByJournalVArrayVpool(URI standbyJournalVarray, URI standbyJournalVpool) {
if (getProtectionSourcePolicy() == null) {
getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy());
}
getProtectionSourcePolicy().setStandbyJournalVarray(standbyJournalVarray);
getProtectionSourcePolicy().setStandbyJournalVpool(standbyJournalVpool);
return this;
}
public BlockVirtualPoolBuilder setRecoverPointCopies(
Collection<VirtualPoolProtectionVirtualArraySettingsParam> recoverPointCopies) {
getRecoverPoint().setCopies(Sets.newHashSet(recoverPointCopies));
return this;
}
public BlockVirtualPoolBuilder addRecoverPointCopy(URI virtualArrayId, URI virtualPoolId, String journalSize) {
getRecoverPoint().getCopies().add(createRecoverPointCopy(virtualArrayId, virtualPoolId, journalSize));
return this;
}
public VirtualPoolProtectionVirtualArraySettingsParam createRecoverPointCopy(URI virtualArrayId, URI virtualPoolId,
String journalSize) {
VirtualPoolProtectionVirtualArraySettingsParam param = new VirtualPoolProtectionVirtualArraySettingsParam();
param.setCopyPolicy(new ProtectionCopyPolicy(journalSize));
param.setVarray(virtualArrayId);
param.setVpool(virtualPoolId);
return param;
}
public BlockVirtualPoolBuilder setHighAvailability(String type, Boolean enableCrossConnect, URI virtualArrayId,
URI virtualPoolId, Boolean activeProtectionAtHASite, Boolean metroPoint) {
VirtualPoolHighAvailabilityParam highAvailability = new VirtualPoolHighAvailabilityParam();
if (HighAvailability.isHighAvailability(type)) {
highAvailability.setType(type);
highAvailability.setAutoCrossConnectExport(enableCrossConnect);
if (HighAvailability.isVplexDistributed(type)) {
VirtualArrayVirtualPoolMapEntry value = new VirtualArrayVirtualPoolMapEntry();
value.setVirtualArray(virtualArrayId);
value.setVirtualPool(virtualPoolId);
value.setActiveProtectionAtHASite(activeProtectionAtHASite);
highAvailability.setHaVirtualArrayVirtualPool(value);
highAvailability.setMetroPoint(metroPoint);
}
}
virtualPool.setHighAvailability(highAvailability);
return this;
}
public BlockVirtualPoolBuilder disableHighAvailability() {
virtualPool.setHighAvailability(null);
return this;
}
public static BlockVirtualPoolProtectionParam getProtection(BlockVirtualPoolRestRep virtualPool) {
return virtualPool != null ? virtualPool.getProtection() : null;
}
public static VirtualPoolProtectionSnapshotsParam getSnapshots(BlockVirtualPoolRestRep virtualPool) {
return getSnapshots(getProtection(virtualPool));
}
public static VirtualPoolProtectionMirrorParam getContinuousCopies(BlockVirtualPoolRestRep virtualPool) {
return getContinuousCopies(getProtection(virtualPool));
}
public static VirtualPoolProtectionRPParam getRecoverPoint(BlockVirtualPoolRestRep virtualPool) {
return getRecoverPoint(getProtection(virtualPool));
}
public static VirtualPoolProtectionSnapshotsParam getSnapshots(BlockVirtualPoolProtectionParam protection) {
return protection != null ? protection.getSnapshots() : null;
}
public static VirtualPoolProtectionMirrorParam getContinuousCopies(BlockVirtualPoolProtectionParam protection) {
return protection != null ? protection.getContinuousCopies() : null;
}
public static VirtualPoolProtectionRPParam getRecoverPoint(BlockVirtualPoolProtectionParam protection) {
return protection != null ? protection.getRecoverPoint() : null;
}
public static Set<VirtualPoolProtectionVirtualArraySettingsParam> getRecoverPointCopies(
BlockVirtualPoolRestRep virtualPool) {
return getRecoverPointCopies(getProtection(virtualPool));
}
public static Set<VirtualPoolProtectionVirtualArraySettingsParam> getRecoverPointCopies(
BlockVirtualPoolProtectionParam protection) {
return getRecoverPointCopies(getRecoverPoint(protection));
}
public static Set<VirtualPoolProtectionVirtualArraySettingsParam> getRecoverPointCopies(
VirtualPoolProtectionRPParam recoverPoint) {
if (recoverPoint != null) {
return recoverPoint.getCopies();
}
return Collections.emptySet();
}
protected VirtualPoolRemoteMirrorProtectionParam getRemoteCopies() {
if (getProtection().getRemoteCopies() == null) {
getProtection().setRemoteCopies(new VirtualPoolRemoteMirrorProtectionParam());
}
return getProtection().getRemoteCopies();
}
public static VirtualPoolRemoteMirrorProtectionParam getRemoteCopies(BlockVirtualPoolProtectionParam protection) {
return protection != null ? protection.getRemoteCopies() : null;
}
public BlockVirtualPoolBuilder setRemoteCopies(List<VirtualPoolRemoteProtectionVirtualArraySettingsParam> newValues) {
getRemoteCopies().setRemoteCopySettings(newValues);
return this;
}
public static List<VirtualPoolRemoteProtectionVirtualArraySettingsParam> getRemoteCopySettings(
BlockVirtualPoolRestRep virtualPool) {
return getRemoteCopySettings(getProtection(virtualPool));
}
public static List<VirtualPoolRemoteProtectionVirtualArraySettingsParam> getRemoteCopySettings(
BlockVirtualPoolProtectionParam protection) {
return getRemoteCopySettings(getRemoteCopies(protection));
}
public static List<VirtualPoolRemoteProtectionVirtualArraySettingsParam> getRemoteCopySettings(
VirtualPoolRemoteMirrorProtectionParam remoteCopies) {
if (remoteCopies != null) {
return remoteCopies.getRemoteCopySettings();
}
return Collections.emptyList();
}
public BlockVirtualPoolBuilder setDedupCapable(boolean dedupCapable) {
virtualPool.setDedupCapable(dedupCapable);
return this;
}
public Boolean getDedupCapable(boolean dedupCapable) {
return virtualPool.getDedupCapable();
}
}