/** Create an external/configured server */
  @Override
  public ServerHeartbeat server(
      String address,
      int port,
      boolean isSSL,
      String clusterId,
      String displayName,
      boolean isDynamic) {
    Objects.requireNonNull(address);
    Objects.requireNonNull(clusterId);

    if (address.isEmpty()) {
      address = "127.0.0.1";
    }

    /*
    if (port <= 0) {
      throw new IllegalArgumentException();
    }
    */

    ClusterHeartbeat cluster = createCluster(clusterId);

    ServerHeartbeat server;

    if (isDynamic) {
      server = cluster.createDynamicServer(address, port, isSSL);
    } else {
      server = cluster.createServer(address, port, isSSL);
    }

    if (displayName != null) {
      server.setDisplayName(displayName);
    }

    if (!isDynamic) {
      cluster.addSeedServer(server);
    }

    return server;
  }
  /** Create an external/configured server */
  @Override
  public ServerHeartbeat serverDyn(
      String address, int port, boolean isSSL, String clusterId, String displayName) {
    Objects.requireNonNull(address);
    Objects.requireNonNull(clusterId);

    /*
    if (port <= 0) {
      throw new IllegalArgumentException();
    }
    */

    ClusterHeartbeat cluster = createCluster(clusterId);

    ServerHeartbeat server = cluster.createServer(address, port, isSSL);

    if (displayName != null) {
      server.setDisplayName(displayName);
    }

    cluster.addDynamicServer(server);

    return server;
  }
  /**
   * Create cluster pods using the configuration as a hint. Both the cluster and cluster_hub pods
   * use this.
   */
  private ServerPod[] buildClusterServers(ClusterHeartbeat cluster, int serverCount) {
    ArrayList<ServerPod> serversPod = new ArrayList<>();

    for (ServerHeartbeat server : cluster.getServers()) {
      ServerPod serverPod = new ServerPod(serversPod.size());
      serversPod.add(serverPod);

      // XXX: need to manage seed servers
      // serverPod.setHintServerId(server.getId());

      // XXX:
      serverPod.setServer(server);
    }

    /*
    if (cluster == _serverSelf.getCluster()) {
      if (serversPod.size() < serverCount && ! isServerPresent(serversPod)) {
        ServerPod serverPod = new ServerPod(serversPod.size());
        serversPod.add(serverPod);

        serverPod.setServer(_serverSelf);
      }
    }
    */

    while (serversPod.size() < serverCount) {
      serversPod.add(new ServerPod(serversPod.size()));
    }

    ServerPod[] serverArray = new ServerPod[serverCount];
    for (int i = 0; i < serverCount; i++) {
      serverArray[i] = serversPod.get(i);
    }

    return serverArray;
  }
  private UpdatePod initClusterPod(ClusterHeartbeat cluster) {
    ServicesAmp rampManager = AmpSystem.currentManager();

    RackHeartbeat rack = cluster.findRack("rack");

    if (rack == null) {
      return null;
    }

    String podName = "cluster." + cluster.id();

    PodBuilderConfig podConfig = _podMap.get(podName);

    if (podConfig != null) {
      return null;
    }

    UpdatePodBuilder podBuilder = new UpdatePodBuilder();

    podBuilder.name("cluster");
    podBuilder.cluster(cluster);

    List<ServerHeartbeat> seedServers = cluster.getServers();

    int count = Math.max(3, seedServers.size());

    ServerPod[] servers = buildClusterServers(cluster, count);

    int index = 0;

    /*
    for (ServerHeartbeat server : cluster.getSeedServers()) {
      // ServerPod server = servers[i];

      ServerBartender serverCluster = server; // serversHint.get(i);

      if (index < servers.length && ! serverCluster.getId().startsWith("127")) {
        //System.out.println("ZOHP: " + serverCluster.getAddress());
        //server.setHintServerId(serverCluster.getHintServerId());
        servers[index++].setHintServerId(serverCluster.getId());
      }
    }
    */
    /*
    for (int i = 0; i < servers.length; i++) {
      ServerPod server = servers[i];

      if (i < seedServers.size()) {
        String hintId = seedServers.get(i).getId();

        if (! hintId.startsWith("127")) {
          server.setHintServerId(hintId);
        }
      }
    }
    */

    podBuilder.pod(servers);

    podBuilder.depth(3);

    podBuilder.primaryCount(count);

    return podBuilder.build();
  }