Initial support for multi kubernetes clusters for k8s nodes

Change-Id: I6ca132898f8e157e0583de38a637fdc135f21d6f
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 dc8d030..cbc62e6 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
@@ -16,11 +16,17 @@
 package org.onosproject.k8snode.api;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang.StringUtils;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
 
 import java.util.Objects;
+import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
+import static org.onosproject.k8snode.api.K8sApiConfig.Mode.NORMAL;
 import static org.onosproject.k8snode.api.K8sApiConfig.Scheme.HTTPS;
 
 /**
@@ -30,7 +36,13 @@
 
     private static final String NOT_NULL_MSG = "API Config % cannot be null";
 
+    private static final int SHORT_NAME_LENGTH = 10;
+
+    private final String clusterName;
+    private final int segmentId;
+    private final IpPrefix extNetworkCidr;
     private final Scheme scheme;
+    private final Mode mode;
     private final IpAddress ipAddress;
     private final int port;
     private final State state;
@@ -38,18 +50,45 @@
     private final String caCertData;
     private final String clientCertData;
     private final String clientKeyData;
+    private final Set<HostNodesInfo> infos;
 
-    private DefaultK8sApiConfig(Scheme scheme, IpAddress ipAddress, int port,
-                                State state, String token, String caCertData,
-                                String clientCertData, String clientKeyData) {
+    private DefaultK8sApiConfig(String clusterName, int segmentId, IpPrefix extNetworkCidr,
+                                Scheme scheme, IpAddress ipAddress, int port,
+                                Mode mode, State state, String token, String caCertData,
+                                String clientCertData, String clientKeyData, Set<HostNodesInfo> infos) {
+        this.clusterName = clusterName;
+        this.segmentId = segmentId;
+        this.extNetworkCidr = extNetworkCidr;
         this.scheme = scheme;
         this.ipAddress = ipAddress;
         this.port = port;
+        this.mode = mode;
         this.state = state;
         this.token = token;
         this.caCertData = caCertData;
         this.clientCertData = clientCertData;
         this.clientKeyData = clientKeyData;
+        this.infos = infos;
+    }
+
+    @Override
+    public String clusterName() {
+        return clusterName;
+    }
+
+    @Override
+    public String clusterShortName() {
+        return StringUtils.substring(clusterName, 0, SHORT_NAME_LENGTH);
+    }
+
+    @Override
+    public int segmentId() {
+        return segmentId;
+    }
+
+    @Override
+    public IpPrefix extNetworkCidr() {
+        return extNetworkCidr;
     }
 
     @Override
@@ -73,16 +112,26 @@
     }
 
     @Override
+    public Mode mode() {
+        return mode;
+    }
+
+    @Override
     public K8sApiConfig updateState(State newState) {
         return new Builder()
+                .clusterName(clusterName)
+                .segmentId(segmentId)
+                .extNetworkCidr(extNetworkCidr)
                 .scheme(scheme)
                 .ipAddress(ipAddress)
                 .port(port)
                 .state(newState)
+                .mode(mode)
                 .token(token)
                 .caCertData(caCertData)
                 .clientCertData(clientCertData)
                 .clientKeyData(clientKeyData)
+                .infos(infos)
                 .build();
     }
 
@@ -107,6 +156,11 @@
     }
 
     @Override
+    public Set<HostNodesInfo> infos() {
+        return ImmutableSet.copyOf(infos);
+    }
+
+    @Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -117,31 +171,41 @@
         DefaultK8sApiConfig that = (DefaultK8sApiConfig) o;
         return port == that.port &&
                 scheme == that.scheme &&
+                clusterName.equals(that.clusterName) &&
+                segmentId == that.segmentId &&
+                extNetworkCidr == that.extNetworkCidr &&
                 ipAddress.equals(that.ipAddress) &&
+                mode == that.mode &&
                 state == that.state &&
                 token.equals(that.token) &&
                 caCertData.equals(that.caCertData) &&
                 clientCertData.equals(that.clientCertData) &&
-                clientKeyData.equals(that.clientKeyData);
+                clientKeyData.equals(that.clientKeyData) &&
+                infos.equals(that.infos);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(scheme, ipAddress, port, state, token, caCertData,
-                clientCertData, clientKeyData);
+        return Objects.hash(clusterName, segmentId, extNetworkCidr, scheme, ipAddress,
+                port, mode, state, token, caCertData, clientCertData, clientKeyData, infos);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+                .add("clusterName", clusterName)
+                .add("segmentID", segmentId)
+                .add("extNetworkCIDR", extNetworkCidr)
                 .add("scheme", scheme)
                 .add("ipAddress", ipAddress)
                 .add("port", port)
+                .add("mode", mode)
                 .add("state", state)
                 .add("token", token)
                 .add("caCertData", caCertData)
                 .add("clientCertData", clientCertData)
                 .add("clientKeyData", clientKeyData)
+                .add("infos", infos)
                 .toString();
     }
 
@@ -156,7 +220,11 @@
 
     public static final class Builder implements K8sApiConfig.Builder {
 
+        private String clusterName;
+        private int segmentId;
+        private IpPrefix extNetworkCidr;
         private Scheme scheme;
+        private Mode mode;
         private IpAddress ipAddress;
         private int port;
         private State state;
@@ -164,6 +232,7 @@
         private String caCertData;
         private String clientCertData;
         private String clientKeyData;
+        private Set<HostNodesInfo> infos;
 
         @Override
         public K8sApiConfig build() {
@@ -177,8 +246,38 @@
                 checkArgument(clientKeyData != null, NOT_NULL_MSG, "clientKeyData");
             }
 
-            return new DefaultK8sApiConfig(scheme, ipAddress, port, state, token,
-                    caCertData, clientCertData, clientKeyData);
+            if (StringUtils.isEmpty(clusterName)) {
+                clusterName = DEFAULT_CLUSTER_NAME;
+            }
+
+            if (mode == null) {
+                mode = NORMAL;
+            }
+
+            if (infos == null) {
+                infos = ImmutableSet.of();
+            }
+
+            return new DefaultK8sApiConfig(clusterName, segmentId, extNetworkCidr, scheme, ipAddress,
+                    port, mode, state, token, caCertData, clientCertData, clientKeyData, infos);
+        }
+
+        @Override
+        public Builder clusterName(String clusterName) {
+            this.clusterName = clusterName;
+            return this;
+        }
+
+        @Override
+        public Builder segmentId(int segmentId) {
+            this.segmentId = segmentId;
+            return this;
+        }
+
+        @Override
+        public K8sApiConfig.Builder extNetworkCidr(IpPrefix extNetworkCidr) {
+            this.extNetworkCidr = extNetworkCidr;
+            return this;
         }
 
         @Override
@@ -206,6 +305,12 @@
         }
 
         @Override
+        public K8sApiConfig.Builder mode(Mode mode) {
+            this.mode = mode;
+            return this;
+        }
+
+        @Override
         public Builder token(String token) {
             this.token = token;
             return this;
@@ -228,5 +333,11 @@
             this.clientKeyData = clientKeyData;
             return this;
         }
+
+        @Override
+        public K8sApiConfig.Builder infos(Set<HostNodesInfo> infos) {
+            this.infos = infos;
+            return this;
+        }
     }
 }