Manage k8s API config life cycle, bootstrap k8s node using k8s client

Change-Id: I9926c6d4903da514b66a3bcbe05358c605c9cc1a
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sApiConfig.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sApiConfig.java
index 157763f..48f6b13 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sApiConfig.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sApiConfig.java
@@ -33,17 +33,19 @@
     private final Scheme scheme;
     private final IpAddress ipAddress;
     private final int port;
+    private final State state;
     private final String token;
     private final String caCertData;
     private final String clientCertData;
     private final String clientKeyData;
 
     private DefaultK8sApiConfig(Scheme scheme, IpAddress ipAddress, int port,
-                                String token, String caCertData,
+                                State state, String token, String caCertData,
                                 String clientCertData, String clientKeyData) {
         this.scheme = scheme;
         this.ipAddress = ipAddress;
         this.port = port;
+        this.state = state;
         this.token = token;
         this.caCertData = caCertData;
         this.clientCertData = clientCertData;
@@ -66,6 +68,25 @@
     }
 
     @Override
+    public State state() {
+        return state;
+    }
+
+    @Override
+    public K8sApiConfig updateState(State newState) {
+        return new Builder()
+                .scheme(scheme)
+                .ipAddress(ipAddress)
+                .port(port)
+                .state(newState)
+                .token(token)
+                .caCertData(caCertData)
+                .clientCertData(clientCertData)
+                .clientKeyData(clientKeyData)
+                .build();
+    }
+
+    @Override
     public String token() {
         return token;
     }
@@ -97,6 +118,7 @@
         return port == that.port &&
                 scheme == that.scheme &&
                 ipAddress.equals(that.ipAddress) &&
+                state == that.state &&
                 token.equals(that.token) &&
                 caCertData.equals(that.caCertData) &&
                 clientCertData.equals(that.clientCertData) &&
@@ -105,7 +127,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(scheme, ipAddress, port, token, caCertData,
+        return Objects.hash(scheme, ipAddress, port, state, token, caCertData,
                 clientCertData, clientKeyData);
     }
 
@@ -115,6 +137,7 @@
                 .add("scheme", scheme)
                 .add("ipAddress", ipAddress)
                 .add("port", port)
+                .add("state", state)
                 .add("token", token)
                 .add("caCertData", caCertData)
                 .add("clientCertData", clientCertData)
@@ -136,6 +159,7 @@
         private Scheme scheme;
         private IpAddress ipAddress;
         private int port;
+        private State state;
         private String token;
         private String caCertData;
         private String clientCertData;
@@ -145,6 +169,7 @@
         public K8sApiConfig build() {
             checkArgument(scheme != null, NOT_NULL_MSG, "scheme");
             checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
+            checkArgument(state != null, NOT_NULL_MSG, "state");
 
             if (scheme == HTTPS) {
                 checkArgument(token != null, NOT_NULL_MSG, "token");
@@ -153,7 +178,7 @@
                 checkArgument(clientKeyData != null, NOT_NULL_MSG, "clientKeyData");
             }
 
-            return new DefaultK8sApiConfig(scheme, ipAddress, port, token,
+            return new DefaultK8sApiConfig(scheme, ipAddress, port, state, token,
                     caCertData, clientCertData, clientKeyData);
         }
 
@@ -176,6 +201,12 @@
         }
 
         @Override
+        public Builder state(State state) {
+            this.state = state;
+            return this;
+        }
+
+        @Override
         public Builder token(String token) {
             this.token = token;
             return this;
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
index 76b845c..3e26a50 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
@@ -90,6 +90,18 @@
     }
 
     @Override
+    public K8sNode updateIntgBridge(DeviceId deviceId) {
+        return new Builder()
+                .hostname(hostname)
+                .type(type)
+                .intgBridge(deviceId)
+                .managementIp(managementIp)
+                .dataIp(dataIp)
+                .state(state)
+                .build();
+    }
+
+    @Override
     public IpAddress managementIp() {
         return managementIp;
     }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sApiConfig.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sApiConfig.java
index 0c63733..62d050d 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sApiConfig.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sApiConfig.java
@@ -38,6 +38,21 @@
     }
 
     /**
+     * Lists of API server connectivity states.
+     */
+    enum State {
+        /**
+         * Signifies that client is connected to k8s API server.
+         */
+        CONNECTED,
+
+        /**
+         * Signifies that client is dis-connected from k8s API server.
+         */
+        DISCONNECTED,
+    }
+
+    /**
      * Returns the authentication scheme.
      *
      * @return authentication scheme
@@ -59,6 +74,21 @@
     int port();
 
     /**
+     * Returns the connectivity state to kubernetes API server.
+     *
+     * @return connectivity state to kubernetes API server
+     */
+    State state();
+
+    /**
+     * Returns new kubernetes API config instance with given state.
+     *
+     * @param newState updated state
+     * @return updated kubernetes API config
+     */
+    K8sApiConfig updateState(State newState);
+
+    /**
      * Returns the token used for authenticating to API server.
      *
      * @return token value
@@ -123,6 +153,14 @@
         Builder port(int port);
 
         /**
+         * Returns kubernetes API server config builder with supplied state.
+         *
+         * @param state connectivity state
+         * @return kubernetes API config builder
+         */
+        Builder state(State state);
+
+        /**
          * Returns kubernetes API server config builder with supplied token.
          *
          * @param token token for authentication
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
index 4abc2cb..671b37a 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
@@ -68,6 +68,14 @@
     DeviceId intgBridge();
 
     /**
+     * Returns new kubernetes node instance with given integration bridge.
+     *
+     * @param deviceId  integration bridge device ID
+     * @return updated kubernetes node
+     */
+    K8sNode updateIntgBridge(DeviceId deviceId);
+
+    /**
      * Returns the management network IP address of the node.
      *
      * @return ip address
diff --git a/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sApiConfigTest.java b/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sApiConfigTest.java
index 55e56f1..4abac0f 100644
--- a/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sApiConfigTest.java
+++ b/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sApiConfigTest.java
@@ -25,6 +25,8 @@
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 import static org.onosproject.k8snode.api.K8sApiConfig.Scheme.HTTP;
 import static org.onosproject.k8snode.api.K8sApiConfig.Scheme.HTTPS;
+import static org.onosproject.k8snode.api.K8sApiConfig.State.CONNECTED;
+import static org.onosproject.k8snode.api.K8sApiConfig.State.DISCONNECTED;
 
 /**
  * Unit tests for DefaultK8sApiConfig.
@@ -73,6 +75,7 @@
                 .scheme(SCHEME_1)
                 .ipAddress(IP_ADDRESS_1)
                 .port(PORT_1)
+                .state(CONNECTED)
                 .token(TOKEN_1)
                 .caCertData(CA_CERT_DATA_1)
                 .clientCertData(CLIENT_CERT_DATA_1)
@@ -83,6 +86,7 @@
                 .scheme(SCHEME_1)
                 .ipAddress(IP_ADDRESS_1)
                 .port(PORT_1)
+                .state(CONNECTED)
                 .token(TOKEN_1)
                 .caCertData(CA_CERT_DATA_1)
                 .clientCertData(CLIENT_CERT_DATA_1)
@@ -93,6 +97,7 @@
                 .scheme(SCHEME_2)
                 .ipAddress(IP_ADDRESS_2)
                 .port(PORT_2)
+                .state(DISCONNECTED)
                 .token(TOKEN_2)
                 .caCertData(CA_CERT_DATA_2)
                 .clientCertData(CLIENT_CERT_DATA_2)
@@ -120,6 +125,7 @@
         assertEquals(SCHEME_1, config.scheme());
         assertEquals(IP_ADDRESS_1, config.ipAddress());
         assertEquals(PORT_1, config.port());
+        assertEquals(CONNECTED, config.state());
         assertEquals(TOKEN_1, config.token());
         assertEquals(CA_CERT_DATA_1, config.caCertData());
         assertEquals(CLIENT_CERT_DATA_1, config.clientCertData());