@Override
  public List<ClusterParticipant> getClusterParticipants() throws IOException {
    if (helixParticipants == null) {
      helixParticipants = new ArrayList<>();
      try {
        List<String> zkConnectStrs =
            ClusterMapUtils.parseDcJsonAndPopulateDcInfo(clusterMapConfig.clusterMapDcsZkConnectStrings)
                .get(clusterMapConfig.clusterMapDatacenterName)
                .getZkConnectStrs();
        boolean isSoleParticipant = zkConnectStrs.size() == 1;
        for (String zkConnectStr : zkConnectStrs) {
          helixParticipants.add(
              new HelixParticipant(getClusterMap(), clusterMapConfig, helixFactory, metricRegistry, zkConnectStr,
                  isSoleParticipant));
        }
      } catch (JSONException e) {
        throw new IOException("Received JSON exception while parsing ZKInfo json string", e);
      }
    }
    return helixParticipants;
  }
Ctor exposed for testing purpose
@param clusterMapConfig the {@link ClusterMapConfig} to specify cluster configuration parameters.
@param helixFactory the {@link HelixFactory} that helps get reference of HelixManager and HelixAdmin.
ambry-clustermap/src/main/java/com/github/ambry/clustermap/HelixClusterAgentsFactory.java