/** * Create Initiator Target LUN Mapping as an extension in volume object * * @param volume - volume in which ITL to be added * @param exportMask - exportMask in which the volume is to be added * @param targetLunId - integer value of host LUN id on which volume is accessible. */ private void storeITLMappingInVolume( Map<URI, Integer> volumeToTargetLunMap, ExportMask exportMask) { log.debug("START - createITLMappingInVolume"); for (URI volumeURI : volumeToTargetLunMap.keySet()) { Integer targetLunId = volumeToTargetLunMap.get(volumeURI); Volume volume = dbClient.queryObject(Volume.class, volumeURI); StringSetMap zoningMap = exportMask.getZoningMap(); Set<String> zoningMapKeys = zoningMap.keySet(); int initiatorIndex = 0; for (String initiator : zoningMapKeys) { Initiator initiatorObj = dbClient.queryObject(Initiator.class, URI.create(initiator)); String initiatorWWPN = initiatorObj.getInitiatorPort().replaceAll(CinderConstants.COLON, ""); StringSet targetPorts = zoningMap.get(initiator); int targetIndex = 0; for (String target : targetPorts) { StoragePort targetPort = dbClient.queryObject(StoragePort.class, URI.create(target)); String targetPortWWN = targetPort.getPortNetworkId().replaceAll(CinderConstants.COLON, ""); // Format is - <InitiatorWWPN>-<TargetWWPN>-<LunId> String itl = initiatorWWPN + "-" + targetPortWWN + "-" + String.valueOf(targetLunId); // ITL keys will be formed as ITL-00, ITL-01, ITL-10, ITL-11 so on String itlKey = CinderConstants.PREFIX_ITL + String.valueOf(initiatorIndex) + String.valueOf(targetIndex); log.info(String.format("Adding ITL %s with key %s", itl, itlKey)); StringMap extensionsMap = volume.getExtensions(); if (null == extensionsMap) { extensionsMap = new StringMap(); extensionsMap.put(itlKey, itl); volume.setExtensions(extensionsMap); } else { volume.getExtensions().put(itlKey, itl); } targetIndex++; } initiatorIndex++; } dbClient.updateAndReindexObject(volume); } log.debug("END - createITLMappingInVolume"); }
/** * get the DB metrics for each data mover or VDM * * @param storageSystem * @param dbClient * @param dmFsMountMap * @param dmCapacityMap * @param vdmFsMountMap * @param vdmCapacityMap */ private void prepareDBMetrics( StorageSystem storageSystem, DbClient dbClient, final Map<String, List<String>> dmFsMountMap, final Map<String, Long> dmCapacityMap, final Map<String, List<String>> vdmFsMountMap, final Map<String, Long> vdmCapacityMap) { List<VirtualNAS> modifiedVNas = new ArrayList<VirtualNAS>(); List<PhysicalNAS> modifiedPNas = new ArrayList<PhysicalNAS>(); for (Entry<String, List<String>> eachNas : dmFsMountMap.entrySet()) { _logger.info(" Computing metrics for data mover {} ", eachNas.getKey()); // Get Physical NAS from db!! PhysicalNAS pNAS = findPhysicalNasByNativeId(storageSystem, dbClient, eachNas.getKey()); List<VirtualNAS> vNasList = new ArrayList<VirtualNAS>(); if (null != pNAS) { URIQueryResultList virtualNASUris = new URIQueryResultList(); dbClient.queryByConstraint( ContainmentConstraint.Factory.getVirtualNASByParentConstraint(pNAS.getId()), virtualNASUris); Long totalDmObjects = 0L; Long totalDmCapacity = 0L; Iterator<URI> virtualNASIter = virtualNASUris.iterator(); while (virtualNASIter.hasNext()) { // Get Each vNAS on Physical NAS VirtualNAS virtualNAS = dbClient.queryObject(VirtualNAS.class, virtualNASIter.next()); if (virtualNAS != null && !virtualNAS.getInactive()) { vNasList.add(virtualNAS); int vNasObjects = 0; if (vdmFsMountMap.get(virtualNAS.getNativeId()) != null) { vNasObjects = vdmFsMountMap.get(virtualNAS.getNativeId()).size(); totalDmObjects = totalDmObjects + vNasObjects; } Long vNasCapacity = 0L; if (vdmCapacityMap.get(virtualNAS.getNativeId()) != null) { vNasCapacity = vdmCapacityMap.get(virtualNAS.getNativeId()); totalDmCapacity = totalDmCapacity + vNasCapacity; } // Update dbMetrics for vNAS!! StringMap vNasDbMetrics = virtualNAS.getMetrics(); vNasDbMetrics.put(MetricsKeys.storageObjects.name(), String.valueOf(vNasObjects)); vNasDbMetrics.put(MetricsKeys.usedStorageCapacity.name(), String.valueOf(vNasCapacity)); modifiedVNas.add(virtualNAS); } } if (dmFsMountMap.get(pNAS.getNativeId()) != null) { totalDmObjects = totalDmObjects + dmFsMountMap.get(pNAS.getNativeId()).size(); } if (dmCapacityMap.get(pNAS.getNativeId()) != null) { totalDmCapacity = totalDmCapacity + dmCapacityMap.get(pNAS.getNativeId()); } for (VirtualNAS vNas : vNasList) { // Update dbMetrics for vNAS!! StringMap vNasDbMetrics = vNas.getMetrics(); long StorageObj = MetricsKeys.getLong(MetricsKeys.storageObjects, vNas.getMetrics()); double percentageLoad = ((double) StorageObj / totalDmObjects) * 100; vNasDbMetrics.put(MetricsKeys.percentLoad.name(), String.valueOf(percentageLoad)); } StringMap pNasDbMetrics = pNAS.getMetrics(); pNasDbMetrics.put(MetricsKeys.storageObjects.name(), String.valueOf(totalDmObjects)); pNasDbMetrics.put(MetricsKeys.usedStorageCapacity.name(), String.valueOf(totalDmCapacity)); long maxObjects = MetricsKeys.getLong(MetricsKeys.maxStorageObjects, pNasDbMetrics); long maxCapacity = MetricsKeys.getLong(MetricsKeys.maxStorageCapacity, pNasDbMetrics); double percentageLoad = ((double) totalDmObjects / maxObjects) * 100; pNasDbMetrics.put(MetricsKeys.percentLoad.name(), String.valueOf(percentageLoad)); if (totalDmObjects >= maxObjects || totalDmCapacity >= maxCapacity) { pNasDbMetrics.put(MetricsKeys.overLoaded.name(), "true"); // All vNas under should be updated!!! for (VirtualNAS vNas : vNasList) { // Update dbMetrics for vNAS!! StringMap vNasDbMetrics = vNas.getMetrics(); vNasDbMetrics.put(MetricsKeys.overLoaded.name(), "true"); } } else { pNasDbMetrics.put(MetricsKeys.overLoaded.name(), "false"); // All vNas under should be updated!!! for (VirtualNAS vNas : vNasList) { // Update dbMetrics for vNAS!! StringMap vNasDbMetrics = vNas.getMetrics(); vNasDbMetrics.put(MetricsKeys.overLoaded.name(), "false"); } } modifiedPNas.add(pNAS); } // Update the db if (!modifiedVNas.isEmpty()) { dbClient.persistObject(modifiedVNas); } if (!modifiedPNas.isEmpty()) { dbClient.persistObject(modifiedPNas); } } return; }
static void putInteger(MetricsKeys key, Integer value, StringMap map) { map.put(key.name(), value.toString()); }
static void putLong(MetricsKeys key, Long value, StringMap map) { map.put(key.name(), value.toString()); }
public static void putBoolean(MetricsKeys key, Boolean value, StringMap map) { map.put(key.name(), value.toString()); }
public static void putDouble(MetricsKeys key, Double value, StringMap map) { map.put(key.name(), value.toString()); }