private Map<String, Map<String, Map<String, String>>> generatePartitionOverrideFromConfigFile(
      String adminConfigFilePath) throws IOException {
    Map<String, Map<String, String>> partitionOverrideInfos = new HashMap<>();
    long maxPartitionId = staticClusterMap.getAllPartitionIds(null)
        .stream()
        .map(p -> Long.parseLong(p.toPathString()))
        .max(Comparator.comparing(Long::valueOf))
        .get();
    String partitionStr = readStringFromFile(adminConfigFilePath);
    for (String partitionName : partitionStr.split(",")) {
      partitionName = partitionName.trim();
      if (partitionName.isEmpty()) {
        continue;
      }
      // if it is not numeric, it should throw exception when parsing long.
      long id = Long.parseLong(partitionName);
      if (id < 0 || id > maxPartitionId) {
        throw new IllegalArgumentException("Partition id is not in valid range: 0 - " + maxPartitionId);
      }
      Map<String, String> partitionProperties = new HashMap<>();
      partitionProperties.put(PARTITION_STATE, READ_ONLY_STR);
      partitionOverrideInfos.put(partitionName, partitionProperties);
    }
    Map<String, Map<String, Map<String, String>>> partitionOverrideByDc = new HashMap<>();
    for (String dc : dataCenterToZkAddress.keySet()) {
      partitionOverrideByDc.put(dc, partitionOverrideInfos);
    }
    return partitionOverrideByDc;
  }
Generate partition override map a static config file. It requires file to be a list of partition ids (separated by
comma). These partitions will be overridden to READ_ONLY state.
@param adminConfigFilePath the path to config file
@return the constructed partitionOverrideInfos by dc. The format is as follows.
"mapFields": {
   "0": {
     "state": "RO"
   },
   "1": {
     "state": "RO"
   }
}
@throws IOException
ambry-clustermap/src/main/java/com/github/ambry/clustermap/HelixBootstrapUpgradeUtil.java