protected BlockVirtualPoolRestRep doSave() {
   BlockVirtualPoolRestRep virtualPool;
   if (isNew()) {
     BlockVirtualPoolBuilder builder = apply(new BlockVirtualPoolBuilder());
     virtualPool = VirtualPoolUtils.create(builder.getVirtualPool());
     this.id = ResourceUtils.stringId(virtualPool);
   } else {
     BlockVirtualPoolRestRep oldVirtualPool = VirtualPoolUtils.getBlockVirtualPool(id);
     BlockVirtualPoolUpdateBuilder builder =
         apply(new BlockVirtualPoolUpdateBuilder(oldVirtualPool));
     virtualPool = VirtualPoolUtils.update(id, builder.getVirtualPoolUpdate());
     List<NamedRelatedResourceRep> matchingPools =
         VirtualPoolUtils.refreshMatchingPools(virtualPool);
     Logger.info(
         "Refreshed Block Virtual Pool '%s' matching pools: %d",
         virtualPool.getName(), matchingPools.size());
   }
   virtualPool = saveStoragePools(virtualPool);
   return virtualPool;
 }
  protected void doLoad(BlockVirtualPoolRestRep virtualPool) {
    loadCommon(virtualPool);
    minPaths = virtualPool.getMinPaths();
    maxPaths = virtualPool.getMaxPaths();
    initiatorPaths = virtualPool.getPathsPerInitiator();
    driveType = virtualPool.getDriveType();
    autoTierPolicy = virtualPool.getAutoTieringPolicyName();
    expandable = virtualPool.getExpandable();
    fastExpansion = virtualPool.getFastExpansion();
    multiVolumeConsistency = virtualPool.getMultiVolumeConsistent();
    thinPreAllocationPercent = virtualPool.getThinVolumePreAllocationPercentage();
    uniqueAutoTierPolicyNames = virtualPool.getUniquePolicyNames();
    raidLevels = defaultSet(virtualPool.getRaidLevels());
    hostIOLimitBandwidth = virtualPool.getHostIOLimitBandwidth();
    hostIOLimitIOPs = virtualPool.getHostIOLimitIOPs();

    VirtualPoolHighAvailabilityParam highAvailabilityType = virtualPool.getHighAvailability();
    if (highAvailabilityType != null
        && HighAvailability.isHighAvailability(highAvailabilityType.getType())) {
      highAvailability = highAvailabilityType.getType();
      if (highAvailability.equals(HighAvailability.VPLEX_LOCAL)) {
        protectSourceSite = true;
      }
      enableAutoCrossConnExport = highAvailabilityType.getAutoCrossConnectExport();
      if (highAvailabilityType.getHaVirtualArrayVirtualPool() != null) {
        haVirtualArray =
            asString(highAvailabilityType.getHaVirtualArrayVirtualPool().getVirtualArray());
        haVirtualPool =
            asString(highAvailabilityType.getHaVirtualArrayVirtualPool().getVirtualPool());

        Boolean activeProtectionAtHASite =
            Boolean.TRUE.equals(
                highAvailabilityType.getHaVirtualArrayVirtualPool().getActiveProtectionAtHASite());
        Boolean metroPoint = Boolean.TRUE.equals(highAvailabilityType.getMetroPoint());
        if (metroPoint) {
          protectSourceSite = true;
          protectHASite = true;
          if (activeProtectionAtHASite) {
            activeSite = HighAvailability.VPLEX_HA.toString();
          } else {
            activeSite = HighAvailability.VPLEX_SOURCE.toString();
            protectSourceSite = true;
          }
        } else {
          protectHASite = activeProtectionAtHASite;
          protectSourceSite = !protectHASite;
        }
      } else {
        protectSourceSite = true;
      }
    } else {
      protectSourceSite = true;
    }

    BlockVirtualPoolProtectionParam protection = virtualPool.getProtection();
    if (protection != null) {
      if (protection.getSnapshots() != null) {
        maxSnapshots = protection.getSnapshots().getMaxSnapshots();
      }
      if (protection.getContinuousCopies() != null) {
        maxContinuousCopies = protection.getContinuousCopies().getMaxMirrors();
        continuousCopyVirtualPool = asString(protection.getContinuousCopies().getVpool());
      }

      VirtualPoolProtectionRPParam recoverPoint = protection.getRecoverPoint();
      if (recoverPoint != null) {
        remoteProtection = ProtectionSystemTypes.RECOVERPOINT;
        ProtectionSourcePolicy sourcePolicy = recoverPoint.getSourcePolicy();
        if (sourcePolicy != null) {
          String journalSize = sourcePolicy.getJournalSize();
          rpJournalSizeUnit = RPCopyForm.parseJournalSizeUnit(journalSize);
          rpJournalSize =
              StringUtils.defaultIfBlank(
                  RPCopyForm.parseJournalSize(journalSize, rpJournalSizeUnit),
                  RPCopyForm.JOURNAL_SIZE_MIN);
          rpRemoteCopyMode = sourcePolicy.getRemoteCopyMode();
          rpRpoValue = sourcePolicy.getRpoValue();
          rpRpoType = sourcePolicy.getRpoType();
          if (protectHASite != null
              && protectSourceSite != null
              && protectHASite
              && protectSourceSite) {
            // Backend will take care of swapping
            // if(activeSite.equalsIgnoreCase(HighAvailability.VPLEX_SOURCE)){
            sourceJournalVArray = asString(sourcePolicy.getJournalVarray());
            sourceJournalVPool = asString(sourcePolicy.getJournalVpool());
            haJournalVArray = asString(sourcePolicy.getStandbyJournalVarray());
            haJournalVPool = asString(sourcePolicy.getStandbyJournalVpool());
          } else {
            if (protectHASite != null && protectHASite) {
              haJournalVArray = asString(sourcePolicy.getJournalVarray());
              haJournalVPool = asString(sourcePolicy.getJournalVpool());
            } else if (protectSourceSite != null && protectSourceSite) {
              sourceJournalVArray = asString(sourcePolicy.getJournalVarray());
              sourceJournalVPool = asString(sourcePolicy.getJournalVpool());
            }
          }
        }

        List<RPCopyForm> rpCopyForms = Lists.newArrayList();
        for (VirtualPoolProtectionVirtualArraySettingsParam copy : recoverPoint.getCopies()) {
          RPCopyForm rpCopy = new RPCopyForm();
          rpCopy.load(copy);
          rpCopyForms.add(rpCopy);
        }
        rpCopies = rpCopyForms.toArray(new RPCopyForm[0]);
        rpCopiesJson = new Gson().toJson(rpCopies);
      }
      VirtualPoolRemoteMirrorProtectionParam srdf = protection.getRemoteCopies();
      if (srdf != null) {
        remoteProtection = ProtectionSystemTypes.SRDF;

        List<SrdfCopyForm> copyForms = Lists.newArrayList();
        for (VirtualPoolRemoteProtectionVirtualArraySettingsParam copy :
            srdf.getRemoteCopySettings()) {
          srdfCopyMode = copy.getRemoteCopyMode();

          SrdfCopyForm srdfCopyForm = new SrdfCopyForm();
          srdfCopyForm.load(copy);
          copyForms.add(srdfCopyForm);
        }
        srdfCopies = copyForms.toArray(new SrdfCopyForm[0]);
        Gson gson = new Gson();
        srdfCopiesJson = gson.toJson(srdfCopies);
      } else {
        srdfCopiesJson = "[]";
      }
    }
  }