Listen on k8s port event to create instance port and host

Change-Id: I59ab1f5f422ce2ba8f5432279ceec6d77cd96f06
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
index 4cc6609..2a938e0 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
@@ -44,6 +44,7 @@
     private static final String CLUSTER_NAME = "clusterName";
     private static final String HOSTNAME = "hostname";
     private static final String TYPE = "type";
+    private static final String MODE = "mode";
     private static final String SEGMENT_ID = "segmentId";
     private static final String MANAGEMENT_IP = "managementIp";
     private static final String DATA_IP = "dataIp";
@@ -67,6 +68,7 @@
                 .put(CLUSTER_NAME, node.clusterName())
                 .put(HOSTNAME, node.hostname())
                 .put(TYPE, node.type().name())
+                .put(MODE, node.mode().name())
                 .put(SEGMENT_ID, node.segmentId())
                 .put(STATE, node.state().name())
                 .put(MANAGEMENT_IP, node.managementIp().toString());
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
index 342787c..cf78b6e 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
@@ -61,6 +61,7 @@
 import static org.onosproject.k8snode.api.K8sNode.Type.MASTER;
 import static org.onosproject.k8snode.api.K8sNode.Type.MINION;
 import static org.onosproject.k8snode.api.K8sNodeService.APP_ID;
+import static org.onosproject.k8snode.api.K8sNodeState.ON_BOARDED;
 import static org.onosproject.k8snode.api.K8sNodeState.PRE_ON_BOARD;
 import static org.onosproject.k8snode.util.K8sNodeUtil.k8sClient;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -82,7 +83,7 @@
     private static final String DEFAULT_GATEWAY_IP = "127.0.0.1";
     private static final String DEFAULT_BRIDGE_IP = "127.0.0.1";
 
-    private static final long SLEEP_MS = 3000; // we wait 3s
+    private static final long SLEEP_MS = 10000; // we wait 10s
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
@@ -151,9 +152,22 @@
             return;
         }
 
-        k8sClient.nodes().list().getItems().forEach(n ->
-            k8sNodeAdminService.createNode(buildK8sNode(n, config))
-        );
+        for (Node node : k8sClient.nodes().list().getItems()) {
+            K8sNode k8sNode = buildK8sNode(node, config);
+            k8sNodeAdminService.createNode(k8sNode);
+
+            while (k8sNodeAdminService.node(k8sNode.hostname()).state() != ON_BOARDED) {
+                try {
+                    sleep(SLEEP_MS);
+                } catch (InterruptedException e) {
+                    log.error("Exception caused during on-boarding state checking...");
+                }
+
+                if (k8sNodeAdminService.node(k8sNode.hostname()).state() == ON_BOARDED) {
+                    break;
+                }
+            }
+        }
     }
 
     private void bootstrapK8sHosts(K8sApiConfig config) {
@@ -299,13 +313,9 @@
 
                 bootstrapK8sNodes(config);
 
-                try {
-                    sleep(SLEEP_MS);
-                } catch (InterruptedException e) {
-                    log.error("Exception caused during init state checking...");
+                if (config.infos().size() > 0) {
+                    bootstrapK8sHosts(config);
                 }
-
-                bootstrapK8sHosts(config);
             }
         }
     }
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
index 7e99f47..cec3d2c 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
@@ -354,42 +354,42 @@
         // integration bridge -> external bridge
         PatchDescription brIntExtPatchDesc =
                 DefaultPatchDescription.builder()
-                .deviceId(k8sNode.intgBridgeName())
-                .ifaceName(k8sNode.intgToExtPatchPortName())
-                .peer(k8sNode.extToIntgPatchPortName())
-                .build();
+                        .deviceId(k8sNode.intgBridgeName())
+                        .ifaceName(k8sNode.intgToExtPatchPortName())
+                        .peer(k8sNode.extToIntgPatchPortName())
+                        .build();
 
         // integration bridge -> tunnel bridge
         PatchDescription brIntTunPatchDesc =
                 DefaultPatchDescription.builder()
-                .deviceId(k8sNode.intgBridgeName())
-                .ifaceName(k8sNode.intgToTunPatchPortName())
-                .peer(k8sNode.tunToIntgPatchPortName())
-                .build();
+                        .deviceId(k8sNode.intgBridgeName())
+                        .ifaceName(k8sNode.intgToTunPatchPortName())
+                        .peer(k8sNode.tunToIntgPatchPortName())
+                        .build();
 
         // external bridge -> integration bridge
         PatchDescription brExtIntPatchDesc =
                 DefaultPatchDescription.builder()
-                .deviceId(k8sNode.extBridgeName())
-                .ifaceName(k8sNode.extToIntgPatchPortName())
-                .peer(k8sNode.intgToExtPatchPortName())
-                .build();
+                        .deviceId(k8sNode.extBridgeName())
+                        .ifaceName(k8sNode.extToIntgPatchPortName())
+                        .peer(k8sNode.intgToExtPatchPortName())
+                        .build();
 
         // integration bridge -> local bridge
         PatchDescription brIntLocalPatchDesc =
                 DefaultPatchDescription.builder()
-                .deviceId(k8sNode.intgBridgeName())
-                .ifaceName(k8sNode.intgToLocalPatchPortName())
-                .peer(k8sNode.localToIntgPatchPortName())
-                .build();
+                        .deviceId(k8sNode.intgBridgeName())
+                        .ifaceName(k8sNode.intgToLocalPatchPortName())
+                        .peer(k8sNode.localToIntgPatchPortName())
+                        .build();
 
         // local bridge -> integration bridge
         PatchDescription brLocalIntPatchDesc =
                 DefaultPatchDescription.builder()
-                .deviceId(k8sNode.localBridgeName())
-                .ifaceName(k8sNode.localToIntgPatchPortName())
-                .peer(k8sNode.intgToLocalPatchPortName())
-                .build();
+                        .deviceId(k8sNode.localBridgeName())
+                        .ifaceName(k8sNode.localToIntgPatchPortName())
+                        .peer(k8sNode.intgToLocalPatchPortName())
+                        .build();
 
         InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
         ifaceConfig.addPatchMode(k8sNode.intgToExtPatchPortName(), brIntExtPatchDesc);
@@ -402,10 +402,10 @@
             // tunnel bridge -> integration bridge
             PatchDescription brTunIntPatchDesc =
                     DefaultPatchDescription.builder()
-                    .deviceId(k8sNode.tunBridgeName())
-                    .ifaceName(k8sNode.tunToIntgPatchPortName())
-                    .peer(k8sNode.intgToTunPatchPortName())
-                    .build();
+                            .deviceId(k8sNode.tunBridgeName())
+                            .ifaceName(k8sNode.tunToIntgPatchPortName())
+                            .peer(k8sNode.intgToTunPatchPortName())
+                            .build();
 
             ifaceConfig.addPatchMode(k8sNode.tunToIntgPatchPortName(), brTunIntPatchDesc);
         }