/**
   * 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;
  }
Пример #3
0
 static void putInteger(MetricsKeys key, Integer value, StringMap map) {
   map.put(key.name(), value.toString());
 }
Пример #4
0
 static void putLong(MetricsKeys key, Long value, StringMap map) {
   map.put(key.name(), value.toString());
 }
Пример #5
0
 public static void putBoolean(MetricsKeys key, Boolean value, StringMap map) {
   map.put(key.name(), value.toString());
 }
Пример #6
0
 public static void putDouble(MetricsKeys key, Double value, StringMap map) {
   map.put(key.name(), value.toString());
 }