/* * 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.collections.CollectionUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import com.emc.storageos.model.vpool.BlockVirtualPoolProtectionParam; import com.emc.storageos.model.vpool.BlockVirtualPoolProtectionUpdateParam; import com.emc.storageos.model.vpool.BlockVirtualPoolRestRep; import com.emc.storageos.model.vpool.BlockVirtualPoolUpdateParam; import com.emc.storageos.model.vpool.ProtectionCopyPolicy; import com.emc.storageos.model.vpool.ProtectionSourcePolicy; import com.emc.storageos.model.vpool.RaidLevelAssignments; import com.emc.storageos.model.vpool.RaidLevelChanges; 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.VirtualPoolProtectionRPChanges; 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.VirtualPoolRemoteProtectionUpdateParam; import com.emc.storageos.model.vpool.VirtualPoolRemoteProtectionVirtualArraySettingsParam; import com.google.common.collect.Sets; public class BlockVirtualPoolUpdateBuilder extends VirtualPoolUpdateBuilder { private static final String NO_AUTO_TIER_POLICY = "none"; private final BlockVirtualPoolRestRep oldVirtualPool; private final BlockVirtualPoolUpdateParam virtualPool; public BlockVirtualPoolUpdateBuilder(BlockVirtualPoolRestRep oldVirtualPool) { this(oldVirtualPool, new BlockVirtualPoolUpdateParam()); } protected BlockVirtualPoolUpdateBuilder(BlockVirtualPoolRestRep oldVirtualPool, BlockVirtualPoolUpdateParam virtualPool) { super(oldVirtualPool, virtualPool); this.oldVirtualPool = oldVirtualPool; this.virtualPool = virtualPool; } @Override public BlockVirtualPoolRestRep getOldVirtualPool() { return oldVirtualPool; } @Override public BlockVirtualPoolUpdateParam getVirtualPoolUpdate() { return virtualPool; } public BlockVirtualPoolUpdateBuilder setMinPaths(int paths) { virtualPool.setMinPaths(paths); return this; } public BlockVirtualPoolUpdateBuilder setMaxPaths(int paths) { virtualPool.setMaxPaths(paths); return this; } public BlockVirtualPoolUpdateBuilder setPathsPerInitiator(int paths) { virtualPool.setPathsPerInitiator(paths); return this; } public BlockVirtualPoolUpdateBuilder setHostIOLimitBandwidth(int limit) { virtualPool.setHostIOLimitBandwidth(limit); return this; } public BlockVirtualPoolUpdateBuilder setHostIOLimitIOPs(int limit) { virtualPool.setHostIOLimitIOPs(limit); return this; } public BlockVirtualPoolUpdateBuilder setPlacementPolicy(String placementPolicy) { String policyName = StringUtils.defaultIfBlank(placementPolicy, VirtualPoolPlacementPolicy.DEFAULT); String oldPolicyName = StringUtils.defaultIfBlank(oldVirtualPool.getPlacementPolicy(), VirtualPoolPlacementPolicy.DEFAULT); if (!StringUtils.equals(policyName, oldPolicyName)) { virtualPool.setPlacementPolicy(policyName); } return this; } public BlockVirtualPoolUpdateBuilder setCompressionEnabled(boolean compressionEnabled) { virtualPool.setCompressionEnabled(compressionEnabled); return this; } public BlockVirtualPoolUpdateBuilder setAutoTieringPolicyName(String autoTieringPolicyName) { String policyName = StringUtils.defaultIfBlank(autoTieringPolicyName, NO_AUTO_TIER_POLICY); String oldPolicyName = StringUtils.defaultIfBlank(oldVirtualPool.getAutoTieringPolicyName(), NO_AUTO_TIER_POLICY); if (!StringUtils.equals(policyName, oldPolicyName)) { virtualPool.setAutoTieringPolicyName(StringUtils.defaultString(autoTieringPolicyName)); } return this; } public BlockVirtualPoolUpdateBuilder setDriveType(String driveType) { String newDriveType = StringUtils.defaultIfEmpty(driveType, DriveTypes.NONE); String oldDriveType = StringUtils.defaultIfEmpty(oldVirtualPool.getDriveType(), DriveTypes.NONE); if (!StringUtils.equals(newDriveType, oldDriveType)) { virtualPool.setDriveType(newDriveType); } return this; } public BlockVirtualPoolUpdateBuilder setExpandable(boolean expandable) { if (!ObjectUtils.equals(expandable, oldVirtualPool.getExpandable())) { virtualPool.setExpandable(expandable); } return this; } public BlockVirtualPoolUpdateBuilder setFastExpansion(boolean fastExpansion) { if (!ObjectUtils.equals(fastExpansion, oldVirtualPool.getFastExpansion())) { virtualPool.setFastExpansion(fastExpansion); } return this; } public BlockVirtualPoolUpdateBuilder setThinVolumePreAllocationPercentage(Integer percent) { if (!ObjectUtils.equals(percent, oldVirtualPool.getThinVolumePreAllocationPercentage())) { virtualPool.setThinVolumePreAllocationPercentage(percent); } return this; } public BlockVirtualPoolUpdateBuilder setUniquePolicyNames(boolean uniquePolicyNames) { if (!ObjectUtils.equals(uniquePolicyNames, oldVirtualPool.getUniquePolicyNames())) { virtualPool.setUniquePolicyNames(uniquePolicyNames); } return this; } public BlockVirtualPoolUpdateBuilder setMultiVolumeConsistency(boolean multiVolumeConsistency) { if (!ObjectUtils.equals(multiVolumeConsistency, oldVirtualPool.getMultiVolumeConsistent())) { virtualPool.setMultiVolumeConsistency(multiVolumeConsistency); } return this; } @SuppressWarnings("unchecked") public BlockVirtualPoolUpdateBuilder setRaidLevels(Collection<String> newValues) { Set<String> oldValues = oldVirtualPool.getRaidLevels(); Set<String> add = Sets.newHashSet(CollectionUtils.subtract(newValues, oldValues)); Set<String> remove = Sets.newHashSet(CollectionUtils.subtract(oldValues, newValues)); RaidLevelChanges changes = new RaidLevelChanges(); if (!add.isEmpty()) { changes.setAdd(new RaidLevelAssignments(add)); } if (!remove.isEmpty()) { changes.setRemove(new RaidLevelAssignments(remove)); } virtualPool.setRaidLevelChanges(changes); return this; } protected BlockVirtualPoolProtectionUpdateParam getProtection() { if (virtualPool.getProtection() == null) { virtualPool.setProtection(new BlockVirtualPoolProtectionUpdateParam()); } return virtualPool.getProtection(); } private Integer getOldMaxSnapshots() { VirtualPoolProtectionSnapshotsParam snapshots = getSnapshots(oldVirtualPool); return snapshots != null ? snapshots.getMaxSnapshots() : null; } public BlockVirtualPoolUpdateBuilder setSnapshots(Integer maxSnapshots) { if (!ObjectUtils.equals(maxSnapshots, getOldMaxSnapshots())) { getProtection().setSnapshots(new VirtualPoolProtectionSnapshotsParam(maxSnapshots)); } return this; } private Integer getOldMaxCopies() { VirtualPoolProtectionMirrorParam continuousCopies = getContinuousCopies(oldVirtualPool); return continuousCopies != null ? continuousCopies.getMaxMirrors() : null; } private URI getOldCopyVirtualPool() { VirtualPoolProtectionMirrorParam continuousCopies = getContinuousCopies(oldVirtualPool); return continuousCopies != null ? continuousCopies.getVpool() : null; } public BlockVirtualPoolUpdateBuilder setContinuousCopies(Integer maxCopies, URI virtualPoolId) { if (!ObjectUtils.equals(maxCopies, getOldMaxCopies()) || !ObjectUtils.equals(virtualPoolId, getOldCopyVirtualPool())) { getProtection().setContinuousCopies(new VirtualPoolProtectionMirrorParam(maxCopies, virtualPoolId)); } return this; } protected VirtualPoolRemoteProtectionUpdateParam getRemoteCopies() { if (getProtection().getRemoteCopies() == null) { getProtection().setRemoteCopies(new VirtualPoolRemoteProtectionUpdateParam()); } return getProtection().getRemoteCopies(); } public BlockVirtualPoolUpdateBuilder disableRemoteCopies() { getProtection().setRemoteCopies(new VirtualPoolRemoteProtectionUpdateParam()); Set<VirtualPoolRemoteProtectionVirtualArraySettingsParam> noCopies = Sets.newHashSet(); setRemoteCopies(noCopies); return this; } protected VirtualPoolProtectionRPChanges getRecoverPoint() { if (getProtection().getRecoverPoint() == null) { getProtection().setRecoverPoint(new VirtualPoolProtectionRPChanges()); } return getProtection().getRecoverPoint(); } public BlockVirtualPoolUpdateBuilder disableRecoverPoint() { getProtection().setRecoverPoint(new VirtualPoolProtectionRPChanges()); Set<VirtualPoolProtectionVirtualArraySettingsParam> noCopies = Sets.newHashSet(); setRecoverPointCopies(noCopies); return this; } public BlockVirtualPoolUpdateBuilder setRecoverPointJournalSize(String journalSize) { if (journalSize != null) { if (getProtectionSourcePolicy() == null) { getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy()); } getProtectionSourcePolicy().setJournalSize(journalSize); } return this; } public BlockVirtualPoolUpdateBuilder setRecoverPointRemoteCopyMode(String remoteCopyMode) { if (remoteCopyMode != null) { if (getProtectionSourcePolicy() == null) { getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy()); } getProtectionSourcePolicy().setRemoteCopyMode(remoteCopyMode); } return this; } public BlockVirtualPoolUpdateBuilder setJournalVarrayAndVpool(URI journalVarray, URI journalVpool) { if (getProtectionSourcePolicy() == null) { getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy()); } getProtectionSourcePolicy().setJournalVarray(journalVarray); getProtectionSourcePolicy().setJournalVpool(journalVpool); return this; } public BlockVirtualPoolUpdateBuilder setStandByJournalVArrayVpool(URI standbyJournalVarray, URI standbyJournalVpool) { if (getProtectionSourcePolicy() == null) { getRecoverPoint().setSourcePolicy(new ProtectionSourcePolicy()); } getProtectionSourcePolicy().setStandbyJournalVarray(standbyJournalVarray); getProtectionSourcePolicy().setStandbyJournalVpool(standbyJournalVpool); return this; } public BlockVirtualPoolUpdateBuilder 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(); } @SuppressWarnings("unchecked") public BlockVirtualPoolUpdateBuilder setRecoverPointCopies( Collection<VirtualPoolProtectionVirtualArraySettingsParam> newValues) { Set<VirtualPoolProtectionVirtualArraySettingsParam> oldValues = getRecoverPointCopies(oldVirtualPool); getRecoverPoint().getAdd().addAll(CollectionUtils.subtract(newValues, oldValues)); getRecoverPoint().getRemove().addAll(CollectionUtils.subtract(oldValues, newValues)); return this; } public BlockVirtualPoolUpdateBuilder addRecoverPointCopy(URI virtualArrayId, URI virtualPoolId, String journalSize) { getRecoverPoint().getAdd().add(createRecoverPointCopy(virtualArrayId, virtualPoolId, journalSize)); return this; } public BlockVirtualPoolUpdateBuilder removeRecoverPointCopy(URI virtualArrayId, URI virtualPoolId, String journalSize) { getRecoverPoint().getRemove().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 BlockVirtualPoolUpdateBuilder addRemoteCopy(URI virtualArrayId, URI virtualPoolId, String copyMode) { getRemoteCopies().getAdd().add(createRemoteCopy(virtualArrayId, virtualPoolId, copyMode)); return this; } public BlockVirtualPoolUpdateBuilder removeRemoteCopy(URI virtualArrayId, URI virtualPoolId, String copyMode) { getRemoteCopies().getRemove().add(createRemoteCopy(virtualArrayId, virtualPoolId, copyMode)); return this; } @SuppressWarnings("unchecked") public BlockVirtualPoolUpdateBuilder setRemoteCopies( Collection<VirtualPoolRemoteProtectionVirtualArraySettingsParam> newValues) { List<VirtualPoolRemoteProtectionVirtualArraySettingsParam> oldValues = getRemoteCopySettings(oldVirtualPool); getRemoteCopies().getAdd().addAll(CollectionUtils.subtract(newValues, oldValues)); getRemoteCopies().getRemove().addAll(CollectionUtils.subtract(oldValues, newValues)); return this; } public VirtualPoolRemoteProtectionVirtualArraySettingsParam createRemoteCopy(URI virtualArrayId, URI virtualPoolId, String copyMode) { VirtualPoolRemoteProtectionVirtualArraySettingsParam param = new VirtualPoolRemoteProtectionVirtualArraySettingsParam(); param.setRemoteCopyMode(copyMode); param.setVarray(virtualArrayId); param.setVpool(virtualPoolId); return param; } public BlockVirtualPoolUpdateBuilder setHighAvailability(String type, Boolean enableCrossConnect, URI virtualArrayId, URI virtualPoolId, Boolean activeProtectionAtHASite, Boolean metroPoint) { VirtualPoolHighAvailabilityParam highAvailability = new VirtualPoolHighAvailabilityParam(); if (HighAvailability.isVplexDistributed(type) || HighAvailability.isVplexLocal(type)) { highAvailability.setType(type); highAvailability.setAutoCrossConnectExport(enableCrossConnect); if (HighAvailability.isVplexDistributed(type)) { VirtualArrayVirtualPoolMapEntry value = new VirtualArrayVirtualPoolMapEntry(); value.setVirtualArray(virtualArrayId); value.setVirtualPool(defaultURI(virtualPoolId)); value.setActiveProtectionAtHASite(activeProtectionAtHASite); highAvailability.setHaVirtualArrayVirtualPool(value); highAvailability.setMetroPoint(metroPoint); } } virtualPool.setHighAvailability(highAvailability); return this; } public BlockVirtualPoolUpdateBuilder disableHighAvailability() { setHighAvailability(null, false, null, null, false, false); 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 VirtualPoolRemoteMirrorProtectionParam getRemoteCopies(BlockVirtualPoolProtectionParam protection) { return protection != null ? protection.getRemoteCopies() : 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(); } 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 BlockVirtualPoolUpdateBuilder setDedupCapable(boolean dedupCapable) { virtualPool.setDedupCapable(dedupCapable); return this; } public Boolean getDedupCapable(boolean dedupCapable) { return virtualPool.getDedupCapable(); } }