/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins; import java.util.List; import java.util.Set; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.ProtectionSystem; import com.emc.storageos.db.client.model.StringMap; import com.emc.storageos.recoverpoint.objectmodel.RPSite; import com.emc.storageos.recoverpoint.responses.RecoverPointStatisticsResponse; import com.emc.storageos.recoverpoint.responses.RecoverPointStatisticsResponse.ProtectionSystemParameters; /** * Helper class used for collecting RecoverPoint statistics. * */ public class RPStatisticsHelper { private static final String NumberOfGroups = "NUMBER_OF_GROUPS"; private static final String NumberOfReplicatingSets = "NUMBER_OF_REPLICATING_SETS"; private static final String RemoteReplicatedArray = "REMOTE_REPLICATED_ARRAY"; private static final String LocalReplicatedArray = "LOCAL_REPLICATED_ARRAY"; private static final String NumberOfWLPS = "NUMBER_OF_WLPS"; private static final String NumberOfClariionHosts = "NUMBER_OF_CLARIION_HOSTS"; private static final String NumberOfGUIDS = "NUMBER_OF_GUIDS"; private static final String TotalNumberOfSplitterLUNs = "TOTAL_NUMBER_OF_SPLITTER_LUNS"; public enum CurrentOrMax { CURRENT_VALUE, MAX_VALUE, } /** * Update the protection system with the metrics associated with making smart * placement decisions. * <p> * Collects the RP System and Site metrics from within the <code>RecoverPointStatisticsResponse</code> object. * * @param rpSystem protection system to update * @param rpStat stat object to reflect in the protection system */ public void updateProtectionSystemMetrics(ProtectionSystem rpSystem, Set<RPSite> rpSites, RecoverPointStatisticsResponse response, DbClient dbClient) { // Update the metrics per cluster for (RPSite site : rpSites) { rpSystem.setCgCount(getParameter(response.getParamList(), NumberOfGroups, CurrentOrMax.CURRENT_VALUE)); rpSystem.setCgCapacity(getParameter(response.getParamList(), NumberOfGroups, CurrentOrMax.MAX_VALUE)); rpSystem.setRsetCount(getParameter(response.getParamList(), NumberOfReplicatingSets, CurrentOrMax.CURRENT_VALUE)); rpSystem.setRsetCapacity(getParameter(response.getParamList(), NumberOfReplicatingSets, CurrentOrMax.MAX_VALUE)); rpSystem.setRemoteReplicationGBCount(getParameter(response.getParamList(), RemoteReplicatedArray, CurrentOrMax.CURRENT_VALUE)); rpSystem.setRemoteReplicationGBCapacity(getParameter(response.getParamList(), RemoteReplicatedArray, CurrentOrMax.MAX_VALUE)); // Site specific entries are in a string map for easy database use // Key: Site ID, Value: Long->String StringMap localRepCountStringMap = new StringMap(); localRepCountStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), LocalReplicatedArray, CurrentOrMax.CURRENT_VALUE, site.getSiteUID())); rpSystem.setSiteLocalReplicationGBCount(localRepCountStringMap); StringMap localRepCapacityStringMap = new StringMap(); localRepCapacityStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), LocalReplicatedArray, CurrentOrMax.MAX_VALUE, site.getSiteUID())); rpSystem.setSiteLocalReplicationGBCapacity(localRepCapacityStringMap); StringMap sitePathCountStringMap = new StringMap(); sitePathCountStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfWLPS, CurrentOrMax.CURRENT_VALUE, site.getSiteUID())); rpSystem.setSitePathCount(sitePathCountStringMap); StringMap sitePathCapacityStringMap = new StringMap(); sitePathCapacityStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfWLPS, CurrentOrMax.MAX_VALUE, site.getSiteUID())); rpSystem.setSitePathCapacity(sitePathCapacityStringMap); StringMap siteVNXSplitterCountStringMap = new StringMap(); siteVNXSplitterCountStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfClariionHosts, CurrentOrMax.CURRENT_VALUE, site.getSiteUID())); rpSystem.setSiteVNXSplitterCount(siteVNXSplitterCountStringMap); StringMap siteVNXSplitterCapacityStringMap = new StringMap(); siteVNXSplitterCapacityStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfClariionHosts, CurrentOrMax.MAX_VALUE, site.getSiteUID())); rpSystem.setSiteVNXSplitterCapacity(siteVNXSplitterCapacityStringMap); StringMap siteVolumeCountStringMap = new StringMap(); siteVolumeCountStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfGUIDS, CurrentOrMax.CURRENT_VALUE, site.getSiteUID())); rpSystem.setSiteVolumeCount(siteVolumeCountStringMap); StringMap siteVolumeCapacityStringMap = new StringMap(); siteVolumeCapacityStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), NumberOfGUIDS, CurrentOrMax.MAX_VALUE, site.getSiteUID())); rpSystem.setSiteVolumeCapacity(siteVolumeCapacityStringMap); StringMap siteVolumesAttachedToSplitterCountStringMap = new StringMap(); siteVolumesAttachedToSplitterCountStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), TotalNumberOfSplitterLUNs, CurrentOrMax.CURRENT_VALUE, site.getSiteUID())); rpSystem.setSiteVolumesAttachedToSplitterCount(siteVolumesAttachedToSplitterCountStringMap); StringMap siteVolumesAttachedToSplitterCapacityStringMap = new StringMap(); siteVolumesAttachedToSplitterCapacityStringMap.put(site.getInternalSiteName(), "" + getParameter(response.getParamList(), TotalNumberOfSplitterLUNs, CurrentOrMax.MAX_VALUE, site.getSiteUID())); rpSystem.setSiteVolumesAttachedToSplitterCapacity(siteVolumesAttachedToSplitterCapacityStringMap); dbClient.persistObject(rpSystem); } } /** * Get a parameter value (current or max) from a RecoverPointStatisticsResponse parameter list * * @param params - list of parameters * @param whichParam - parameter we are interested in * @param whichValue - which value, max or current? * */ private long getParameter(List<RecoverPointStatisticsResponse.ProtectionSystemParameters> params, String whichParam, CurrentOrMax whichValue) { return getParameter(params, whichParam, whichValue, -1); } /** * Get a parameter value (current or max) from a RecoverPointStatisticsResponse parameter list * * @param params - list of parameters * @param whichParam - parameter we are interested in * @param whichValue - which value, max or current? * */ private static long getParameter(List<RecoverPointStatisticsResponse.ProtectionSystemParameters> params, String whichParam, CurrentOrMax whichValue, long siteID) { for (ProtectionSystemParameters monitoredParameter : params) { if (monitoredParameter.parameterName.equalsIgnoreCase(whichParam)) { if (CurrentOrMax.CURRENT_VALUE.equals(whichValue)) { if (siteID == monitoredParameter.siteID || siteID == -1) { return monitoredParameter.currentParameterValue; } } else { return monitoredParameter.parameterLimit; } } } return 0; } }