/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package models.virtualpool; import static com.emc.vipr.client.core.util.ResourceUtils.asString; import static com.emc.vipr.client.core.util.ResourceUtils.name; import static com.emc.vipr.client.core.util.ResourceUtils.uri; import static com.emc.vipr.client.core.util.ResourceUtils.uris; import java.net.URI; import java.util.List; import jobs.vipr.ConnectedBlockVirtualPoolsCall; import models.SizeUnit; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import play.data.validation.Required; import play.data.validation.Validation; import util.MessagesUtils; import util.VirtualArrayUtils; import util.VirtualPoolUtils; import com.emc.storageos.model.vpool.ProtectionCopyPolicy; import com.emc.storageos.model.vpool.VirtualPoolProtectionVirtualArraySettingsParam; public class RPCopyForm { public static final int JOURNAL_MIN_SIZE_IN_GB = 10; public static final String JOURNAL_SIZE_MIN = "min"; public static final String JOURNAL_DEFAULT_MULTIPLIER = "0.25"; @Required public String virtualArray; public String virtualArrayName; public String virtualPool; public String virtualPoolName; public String journalVArray; public String journalVArrayName; public String journalVPool; public String journalVPoolName; public String journalSize; public SizeUnit journalSizeUnit; public String formattedJournalSize; public boolean isEnabled() { return StringUtils.isNotBlank(virtualArray); } public void validate(String formName) { Validation.valid(formName, this); if (!isValidJournalSize(journalSize, journalSizeUnit)) { Validation.addError(formName + ".journalSize", "validation.invalid"); } } public void load(VirtualPoolProtectionVirtualArraySettingsParam copy) { String none = MessagesUtils.get("common.none"); virtualArray = asString(copy.getVarray()); virtualArrayName = StringUtils.defaultString(name(VirtualArrayUtils.getVirtualArray(virtualArray)), none); virtualPool = asString(copy.getVpool()); virtualPoolName = StringUtils.defaultString(name(VirtualPoolUtils.getBlockVirtualPool(virtualPool)), none); journalVArray = asString(copy.getCopyPolicy().getJournalVarray()); journalVArrayName = StringUtils.defaultString(name(VirtualArrayUtils.getVirtualArray(journalVArray)), none); journalVPool = asString(copy.getCopyPolicy().getJournalVpool()); journalVPoolName = StringUtils.defaultString(name(VirtualPoolUtils.getBlockVirtualPool(journalVPool)), none); journalSizeUnit = parseJournalSizeUnit(copy.getCopyPolicy().getJournalSize()); journalSize = parseJournalSize(copy.getCopyPolicy().getJournalSize(), journalSizeUnit); formattedJournalSize = getFormattedJournalSize(); } public VirtualPoolProtectionVirtualArraySettingsParam write() { VirtualPoolProtectionVirtualArraySettingsParam param = new VirtualPoolProtectionVirtualArraySettingsParam(); param.setCopyPolicy(new ProtectionCopyPolicy(getFormattedJournalSize())); param.setCopyPolicy(new ProtectionCopyPolicy(getFormattedJournalSize(), uri(journalVArray), uri(journalVPool))); param.setVarray(uri(virtualArray)); param.setVpool(uri(virtualPool)); return param; } public String getFormattedJournalSize() { return formatJournalSize(journalSize, journalSizeUnit); } public ConnectedBlockVirtualPoolsCall recoverPointVirtualPools() { List<URI> varrayIds = StringUtils.isNotBlank(virtualArray) ? uris(virtualArray) : uris(); return new ConnectedBlockVirtualPoolsCall(varrayIds); } public ConnectedBlockVirtualPoolsCall recoverPointJournalVirtualPools() { List<URI> varrayIds = StringUtils.isNotBlank(journalVArray) ? uris(journalVArray) : uris(); return new ConnectedBlockVirtualPoolsCall(varrayIds); } public static SizeUnit parseJournalSizeUnit(String value) { if (StringUtils.isBlank(value) || StringUtils.equalsIgnoreCase(value, JOURNAL_SIZE_MIN)) { // Defaults the dropdown to GB even if the value is empty or 'min' return SizeUnit.GB; } for (SizeUnit unit : SizeUnit.values()) { if (StringUtils.endsWithIgnoreCase(value, unit.name())) { return unit; } } return SizeUnit.Bytes; } public static String parseJournalSize(String value, SizeUnit unit) { String unitStr = StringUtils.lowerCase(unit.name()); String journalSize = StringUtils.replace(StringUtils.lowerCase(value), unitStr, ""); return StringUtils.trim(journalSize); } public static String formatJournalSize(String value, SizeUnit unit) { if (StringUtils.isBlank(value)) { return null; } else if (StringUtils.equalsIgnoreCase(value, JOURNAL_SIZE_MIN)) { return JOURNAL_SIZE_MIN; } else if (unit == SizeUnit.x) { // Check for a valid double double val = NumberUtils.toDouble(value, -1); if (val < 0) { return null; } return value + unit.name(); } else { // Check for a valid integer int val = NumberUtils.toInt(value, -1); if (val < 0) { return null; } if (convertToGB(val, unit) < JOURNAL_MIN_SIZE_IN_GB) { // invalid journal size return null; } return (unit != SizeUnit.Bytes) ? value + unit.name() : value; } } public static double convertToGB(int value, SizeUnit unit) { double sizeInGB = 0.0; if (unit == null || SizeUnit.Bytes.equals(unit)) { sizeInGB = value / 1024 / 1024; } else if (SizeUnit.MB.equals(unit)) { sizeInGB = value / 1024; } else if (SizeUnit.GB.equals(unit)) { sizeInGB = value; } else if (SizeUnit.TB.equals(unit)) { sizeInGB = value * 1024; } return sizeInGB; } public static boolean isValidJournalSize(String value, SizeUnit unit) { if (StringUtils.isNotBlank(value)) { return formatJournalSize(value, unit) != null; } else { return true; } } }