private boolean isDisconnectedEachOther(List<String> blackList, List<String> whiteList) {
    VirtualDataCenter myVdc = getLocalVdc();
    Collection<String> addresses = myVdc.queryHostIPAddressesMap().values();
    log.info("local vdc IP addresses:{}", addresses);

    boolean found = false;
    for (String addr : addresses) {
      if (blackList.contains(addr)) {
        log.info("The addr {} is in the blackList {}", addr, blackList);
        found = true;
        break;
      }
    }

    if (found == false) {
      return false; // not disconnected each other
    }

    Collection<List<String>> localBlackLists = dbClient.getBlacklist().values();
    log.info("The localBackLists={}", localBlackLists);
    List<String> localBlackList = new ArrayList();
    for (List<String> list : localBlackLists) {
      localBlackList = list;
    }

    return localBlackList.containsAll(whiteList);
  }
 private void updateBlackListForReconnectedVdc() {
   List<URI> vdcIds = dbClient.queryByType(VirtualDataCenter.class, true);
   dbClient.clearBlackList();
   log.info("After clear, get current black list {}", dbClient.getBlacklist());
   for (URI vdcId : vdcIds) {
     VirtualDataCenter vdc = dbClient.queryObject(VirtualDataCenter.class, vdcId);
     if (vdc.getConnectionStatus() == VirtualDataCenter.ConnectionStatus.DISCONNECTED) {
       log.info("Add vdc {} with status {} to blacklist", vdc.getId(), vdc.getConnectionStatus());
       dbClient.addVdcNodesToBlacklist(vdc);
     }
   }
 }
  @PUT
  @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  public Response syncVdcConfig(VdcConfigSyncParam param) {
    log.info("Acquired gobal lock, vdc {}...", param.getVirtualDataCenters().size());

    VdcConfig.ConfigChangeType type =
        VdcConfig.ConfigChangeType.valueOf(param.getConfigChangeType());
    log.info("Current config change type is {}", type);

    switch (type) {
      case DISCONNECT_VDC:
        String disconntecedvdcId = param.getAssignedVdcId();
        try {
          disconnectVdc(disconntecedvdcId);
        } catch (Exception e) {
          throw GeoException.fatals.disconnectRemoteSyncFailed(disconntecedvdcId, e.getMessage());
        }
        break;
      case RECONNECT_VDC:
        String reconnectVdcId = param.getAssignedVdcId();
        try {
          VirtualDataCenter localVdc = VdcUtil.getLocalVdc();
          // If the local vdc is the one need to be reconnected back, trigger a node repair for
          // geodb
          if (localVdc.getId().toString().equals(reconnectVdcId)) {
            log.info(
                "Perform sync vdc config operation and node repair for the reconnected vdc {}",
                reconnectVdcId);
            VirtualDataCenter reconnVdc =
                dbClient.queryObject(VirtualDataCenter.class, new URI(reconnectVdcId));

            // Update operated local db, make sure all the vdcs in operated vdc'd db have the same
            // status with others.
            log.info("Reconnect ops update local db for operatedVdc");
            updateVdcStatusInDB(param.getVirtualDataCenters());
            log.info("Reconnect ops update local db done");

            // Clean blacklist for reconnected vdc
            log.info("Reconnect ops to clean blacklist for reconnected vdc.");
            updateBlackListForReconnectedVdc();
            log.info("Reconnect ops: new blacklist is {}", dbClient.getBlacklist());

            helper.syncVdcConfig(param.getVirtualDataCenters(), null);

            log.info("Current strategy options is {}", dbClient.getGeoStrategyOptions());
            log.info("Current schema version for Geo is {}", dbClient.getGeoSchemaVersions());

            geoBackgroundTasks.startGeodbNodeRepair();

          } else {
            reconnectVdc(reconnectVdcId);
          }
        } catch (Exception e) {
          throw GeoException.fatals.reconnectRemoteSyncFailed(reconnectVdcId, e.getMessage());
        }
        break;
      default:
        Iterator<URI> srcVdcIdIter = dbClient.queryByType(VirtualDataCenter.class, true).iterator();

        String assignedVdcId = param.getAssignedVdcId();
        String geoEncryptionKey = param.getGeoEncryptionKey();

        // for add-vdc
        if (assignedVdcId != null && geoEncryptionKey != null) {
          log.info("This vdc will be added to a geo system.");
          if (!srcVdcIdIter.hasNext()) {
            throw GeoException.fatals.connectVDCLocalMultipleVDC(assignedVdcId);
          }
          URI srcVdcId = srcVdcIdIter.next();
          // Delete the local vdc record
          VirtualDataCenter existingVdc = dbClient.queryObject(VirtualDataCenter.class, srcVdcId);
          dbClient.markForDeletion(existingVdc);
          log.info(
              "The existing vdc {} has been removed. The current vdc id will be {}.",
              srcVdcId,
              assignedVdcId);

          helper.setGeoEncryptionKey(geoEncryptionKey);
          log.info("geo encryption key has been updated");
          helper.resetStaleLocalObjects();

          dbClient.stopClusterGossiping();
        } else if (assignedVdcId == null && geoEncryptionKey == null) {
          log.info("Sync'ing new vdc info to existing geo system.");
        } else {
          throw GeoException.fatals.remoteVDCGeoEncryptionMissing();
        }

        helper.syncVdcConfig(param.getVirtualDataCenters(), assignedVdcId);

        if (isRemoveOp(param)) {
          log.info("Disable grossip to avoid schema version disagreement errors");
          dbClient.stopClusterGossiping();
        }

        break;
    }
    return Response.ok().build();
  }