[NO ISSUE] Expose public address / ports for CC services

Change-Id: I61f8988b32f13a1eba029fa7120d6e753aacc151
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2704
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
index 6faa8dd..8953bec 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
@@ -215,8 +215,8 @@
         clusterIPC.start();
         clientIPC.start();
         webServer.start();
-        info = new ClusterControllerInfo(ccId, ccConfig.getClientListenAddress(), ccConfig.getClientListenPort(),
-                webServer.getListeningPort());
+        info = new ClusterControllerInfo(ccId, ccConfig.getClientPublicAddress(), ccConfig.getClientPublicPort(),
+                ccConfig.getConsolePublicPort());
         timer.schedule(sweeper, 0, ccConfig.getHeartbeatPeriodMillis());
         jobLog.open();
         startApplication();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
index 889e140..f83df6e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
@@ -45,14 +45,19 @@
     public enum Option implements IOption {
         APP_CLASS(STRING, (String) null),
         ADDRESS(STRING, InetAddress.getLoopbackAddress().getHostAddress()),
+        PUBLIC_ADDRESS(STRING, ADDRESS),
         CLUSTER_LISTEN_ADDRESS(STRING, ADDRESS),
         CLUSTER_LISTEN_PORT(INTEGER, 1099),
-        CLUSTER_PUBLIC_ADDRESS(STRING, CLUSTER_LISTEN_ADDRESS),
+        CLUSTER_PUBLIC_ADDRESS(STRING, PUBLIC_ADDRESS),
         CLUSTER_PUBLIC_PORT(INTEGER, CLUSTER_LISTEN_PORT),
         CLIENT_LISTEN_ADDRESS(STRING, ADDRESS),
         CLIENT_LISTEN_PORT(INTEGER, 1098),
+        CLIENT_PUBLIC_ADDRESS(STRING, PUBLIC_ADDRESS),
+        CLIENT_PUBLIC_PORT(INTEGER, CLIENT_LISTEN_PORT),
         CONSOLE_LISTEN_ADDRESS(STRING, ADDRESS),
         CONSOLE_LISTEN_PORT(INTEGER, 16001),
+        CONSOLE_PUBLIC_ADDRESS(STRING, PUBLIC_ADDRESS),
+        CONSOLE_PUBLIC_PORT(INTEGER, CONSOLE_LISTEN_PORT),
         HEARTBEAT_PERIOD(LONG, 10000L), // TODO (mblow): add time unit
         HEARTBEAT_MAX_MISSES(INTEGER, 5),
         PROFILE_DUMP_PERIOD(INTEGER, 0),
@@ -118,6 +123,10 @@
                     return "Application CC main class";
                 case ADDRESS:
                     return "Default bind address for all services on this cluster controller";
+                case PUBLIC_ADDRESS:
+                    return "Default public address that other processes should use to contact this cluster controller. "
+                            + "All services will advertise this address unless a service-specific public address is "
+                            + "supplied.";
                 case CLUSTER_LISTEN_ADDRESS:
                     return "Sets the IP Address to listen for connections from NCs";
                 case CLUSTER_LISTEN_PORT:
@@ -130,10 +139,18 @@
                     return "Sets the IP Address to listen for connections from clients";
                 case CLIENT_LISTEN_PORT:
                     return "Sets the port to listen for connections from clients";
+                case CLIENT_PUBLIC_ADDRESS:
+                    return "The IP Address which clients should use to connect";
+                case CLIENT_PUBLIC_PORT:
+                    return "The port which clients should use to connect";
                 case CONSOLE_LISTEN_ADDRESS:
                     return "Sets the listen address for the Cluster Controller";
                 case CONSOLE_LISTEN_PORT:
                     return "Sets the http port for the Cluster Controller)";
+                case CONSOLE_PUBLIC_ADDRESS:
+                    return "Sets the address on which to contact the http console for the Cluster Controller";
+                case CONSOLE_PUBLIC_PORT:
+                    return "Sets the port on which to contact the http console for the Cluster Controller)";
                 case HEARTBEAT_PERIOD:
                     return "Sets the time duration between two heartbeats from each node controller in milliseconds";
                 case HEARTBEAT_MAX_MISSES:
@@ -261,6 +278,22 @@
         configManager.set(Option.CLIENT_LISTEN_PORT, clientListenPort);
     }
 
+    public String getClientPublicAddress() {
+        return getAppConfig().getString(Option.CLIENT_PUBLIC_ADDRESS);
+    }
+
+    public void setClientPublicAddress(String clientPublicAddress) {
+        configManager.set(Option.CLIENT_PUBLIC_ADDRESS, clientPublicAddress);
+    }
+
+    public int getClientPublicPort() {
+        return getAppConfig().getInt(Option.CLIENT_PUBLIC_PORT);
+    }
+
+    public void setClientPublicPort(int clientPublicPort) {
+        configManager.set(Option.CLIENT_PUBLIC_PORT, clientPublicPort);
+    }
+
     public int getConsoleListenPort() {
         return getAppConfig().getInt(Option.CONSOLE_LISTEN_PORT);
     }
@@ -269,6 +302,14 @@
         configManager.set(Option.CONSOLE_LISTEN_PORT, consoleListenPort);
     }
 
+    public int getConsolePublicPort() {
+        return getAppConfig().getInt(Option.CONSOLE_PUBLIC_PORT);
+    }
+
+    public void setConsolePublicPort(int consolePublicPort) {
+        configManager.set(Option.CONSOLE_PUBLIC_PORT, consolePublicPort);
+    }
+
     public long getHeartbeatPeriodMillis() {
         return getAppConfig().getLong(Option.HEARTBEAT_PERIOD);
     }