Check node init status when probing node health through REST API

Support to inject controller IP address to API config.

Change-Id: Iece8a84b698ef0da9803f11d473257c84e5adc4d
(cherry picked from commit 6a08072a2c1c3094818268ebf22ffa82f9713125)
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtListApiConfigsCommand.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtListApiConfigsCommand.java
index d01c33a..5b9c268 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtListApiConfigsCommand.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtListApiConfigsCommand.java
@@ -33,7 +33,7 @@
         description = "Lists all KubeVirt API server configs registered to the service")
 public class KubevirtListApiConfigsCommand extends AbstractShellCommand {
 
-    private static final String FORMAT = "%-10s%-25s%-10s%-10s";
+    private static final String FORMAT = "%-10s%-20s%-10s%-25s%-10s";
 
     @Override
     protected void doExecute() throws Exception {
@@ -43,10 +43,14 @@
         if (outputJson()) {
             print("%s", json(config));
         } else {
-            print(FORMAT, "Scheme", "IpAddress", "Port", "State");
+            print(FORMAT, "Scheme", "Server IP", "Port", "Controller IP", "State");
+            String controllerIp = "N/A";
             if (config != null) {
+                if (config.controllerIp() != null) {
+                    controllerIp = config.controllerIp().toString();
+                }
                 print(FORMAT, config.scheme().name(), config.ipAddress().toString(),
-                        config.port(), config.state().name());
+                        config.port(), controllerIp, config.state().name());
             } else {
                 print("Kubevirt config not found!");
             }
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
index aa2bfa1..9fc2099 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
@@ -43,6 +43,7 @@
     private static final String CLIENT_KEY_DATA = "clientKeyData";
     private static final String SERVICE_FQDN = "serviceFqdn";
     private static final String API_SERVER_FQDN = "apiServerFqdn";
+    private static final String CONTROLLER_IP = "controllerIp";
 
     private static final String MISSING_MESSAGE = " is required in KubevirtApiConfig";
 
@@ -89,6 +90,10 @@
             node.put(API_SERVER_FQDN, entity.apiServerFqdn());
         }
 
+        if (entity.controllerIp() != null) {
+            node.put(CONTROLLER_IP, entity.controllerIp().toString());
+        }
+
         return node;
     }
 
@@ -116,6 +121,7 @@
         JsonNode clientKeyDataJson = json.get(CLIENT_KEY_DATA);
         JsonNode serviceFqdn = json.get(SERVICE_FQDN);
         JsonNode apiServerFqdn = json.get(API_SERVER_FQDN);
+        JsonNode controllerIp = json.get(CONTROLLER_IP);
 
         String token = "";
         String caCertData = "";
@@ -176,6 +182,10 @@
             builder.apiServerFqdn(apiServerFqdn.asText());
         }
 
+        if (controllerIp != null) {
+            builder.controllerIp(IpAddress.valueOf(controllerIp.asText()));
+        }
+
         return builder.build();
     }
 }
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
index de45151..3408ed1 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
@@ -303,21 +303,23 @@
     private void createBridge(KubevirtNode node, String bridgeName, DeviceId devId) {
         Device device = deviceService.getDevice(node.ovsdb());
 
-        IpAddress serverIp;
+        IpAddress controllerIp = apiConfigService.apiConfig().controllerIp();
         String serviceFqdn = apiConfigService.apiConfig().serviceFqdn();
         IpAddress serviceIp = null;
 
-        if (serviceFqdn != null) {
-            serviceIp = resolveHostname(serviceFqdn);
+        if (controllerIp == null) {
+            if (serviceFqdn != null) {
+                serviceIp = resolveHostname(serviceFqdn);
+            }
+
+            if (serviceIp != null) {
+                controllerIp = serviceIp;
+            } else {
+                controllerIp = apiConfigService.apiConfig().ipAddress();
+            }
         }
 
-        if (serviceIp != null) {
-            serverIp = serviceIp;
-        } else {
-            serverIp = apiConfigService.apiConfig().ipAddress();
-        }
-
-        ControllerInfo controlInfo = new ControllerInfo(serverIp, DEFAULT_OFPORT, DEFAULT_OF_PROTO);
+        ControllerInfo controlInfo = new ControllerInfo(controllerIp, DEFAULT_OFPORT, DEFAULT_OF_PROTO);
         List<ControllerInfo> controllers = Lists.newArrayList(controlInfo);
 
         String dpid = devId.toString().substring(DPID_BEGIN);
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
index c3861f7..b659ec6 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
@@ -23,6 +23,7 @@
 import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeAdminService;
+import org.onosproject.kubevirtnode.api.KubevirtNodeService;
 import org.onosproject.kubevirtnode.api.KubevirtNodeState;
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
@@ -281,11 +282,28 @@
     @Path("healthz")
     public Response healthz() {
         KubevirtApiConfigService configService = get(KubevirtApiConfigService.class);
-        KubevirtApiConfig config = configService.apiConfig();
+        KubevirtNodeService nodeService = get(KubevirtNodeService.class);
 
         // TODO: we need to add more health check items
+        boolean allInit = true;
+        KubevirtApiConfig config = configService.apiConfig();
+
+        if (nodeService.nodes().size() == 0) {
+            allInit = false;
+        } else {
+            for (KubevirtNode node : nodeService.nodes()) {
+                if (node.state() != INIT) {
+                    allInit = false;
+                }
+            }
+        }
+
+        String result = ERROR;
+        if (config != null && !allInit) {
+            result = OK;
+        }
+
         ObjectNode jsonResult = mapper().createObjectNode();
-        String result = config != null ? OK : ERROR;
         jsonResult.put(API_CONFIG, result);
         return ok(jsonResult).build();
     }
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
index 32a4505..16af906 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
@@ -88,6 +88,7 @@
                 .clientKeyData("clientKeyData")
                 .serviceFqdn("kubevirt.edgestack.svc.cluster.local")
                 .apiServerFqdn("kubernetes.default.svc.cluster.local")
+                .controllerIp(IpAddress.valueOf("127.0.0.1"))
                 .build();
         ObjectNode configJson = kubevirtApiConfigCodec.encode(config, context);
         assertThat(configJson, matchesKubevirtApiConfig(config));
@@ -111,6 +112,7 @@
         assertEquals("clientKeyData", config.clientKeyData());
         assertEquals("kubevirt.edgestack.svc.cluster.local", config.serviceFqdn());
         assertEquals("kubernetes.default.svc.cluster.local", config.apiServerFqdn());
+        assertEquals("127.0.0.1", config.controllerIp().toString());
     }
 
     private KubevirtApiConfig getKubevirtApiConfig(String resourceName) throws IOException {
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
index 52c488c..2163f12 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
@@ -37,6 +37,7 @@
     private static final String CLIENT_KEY_DATA = "clientKeyData";
     private static final String SERVICE_FQDN = "serviceFqdn";
     private static final String API_SERVER_FQDN = "apiServerFqdn";
+    private static final String CONTROLLER_IP = "controllerIp";
 
     private KubevirtApiConfigJsonMatcher(KubevirtApiConfig kubevirtApiConfig) {
         this.kubevirtApiConfig = kubevirtApiConfig;
@@ -142,6 +143,17 @@
             }
         }
 
+        // Controller IP
+        JsonNode jsonControllerIp = jsonNode.get(CONTROLLER_IP);
+        String controllerIp = kubevirtApiConfig.controllerIp().toString();
+
+        if (jsonControllerIp != null) {
+            if (!jsonControllerIp.asText().equals(controllerIp)) {
+                description.appendText("controller IP was " + jsonControllerIp);
+                return false;
+            }
+        }
+
         return true;
     }
 
diff --git a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
index b19c9e4..b95c29a 100644
--- a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
+++ b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
@@ -7,5 +7,6 @@
   "clientCertData": "clientCertData",
   "clientKeyData": "clientKeyData",
   "serviceFqdn": "kubevirt.edgestack.svc.cluster.local",
-  "apiServerFqdn": "kubernetes.default.svc.cluster.local"
+  "apiServerFqdn": "kubernetes.default.svc.cluster.local",
+  "controllerIp": "127.0.0.1"
 }
\ No newline at end of file
diff --git a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/web/kubevirt-api-config.json b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/web/kubevirt-api-config.json
index f706cc3..7a5c5f5 100644
--- a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/web/kubevirt-api-config.json
+++ b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/web/kubevirt-api-config.json
@@ -5,5 +5,6 @@
   "token": "token",
   "caCertData": "caCertData",
   "clientCertData": "clientCertData",
-  "clientKeyData": "clientKeyData"
+  "clientKeyData": "clientKeyData",
+  "controllerIp": "127.0.0.1"
 }
\ No newline at end of file