Supports Mm5 Interface in  KubevirtNode app.
  - Adds datacenter and cluster id parameter to KubevirtApiConfig
  - Implements related REST API web resource

Change-Id: Ib1b6cbc1dbbe11def4d97d78c2e74b5eeec560dc
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfig.java
index 1cf58ed..753d360 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfig.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfig.java
@@ -41,6 +41,8 @@
     private final String serviceFqdn;
     private final String apiServerFqdn;
     private final IpAddress controllerIp;
+    private final String datacenterId;
+    private final String clusterId;
 
     /**
      * Default constructor for Kubevirt API config.
@@ -56,13 +58,15 @@
      * @param serviceFqdn       service FQDN
      * @param apiServerFqdn     API server FQDN
      * @param controllerIp      controller IP address
+     * @param datacenterId      datacenter Id
+     * @param clusterId         cluster Id
      */
     private DefaultKubevirtApiConfig(Scheme scheme, IpAddress ipAddress,
-                                    int port, State state,
-                                    String token, String caCertData,
-                                    String clientCertData, String clientKeyData,
-                                    String serviceFqdn, String apiServerFqdn,
-                                    IpAddress controllerIp) {
+                                     int port, State state,
+                                     String token, String caCertData,
+                                     String clientCertData, String clientKeyData,
+                                     String serviceFqdn, String apiServerFqdn,
+                                     IpAddress controllerIp, String datacenterId, String clusterId) {
         this.scheme = scheme;
         this.ipAddress = ipAddress;
         this.port = port;
@@ -74,6 +78,8 @@
         this.serviceFqdn = serviceFqdn;
         this.apiServerFqdn = apiServerFqdn;
         this.controllerIp = controllerIp;
+        this.datacenterId = datacenterId;
+        this.clusterId = clusterId;
     }
 
     @Override
@@ -110,6 +116,8 @@
                 .serviceFqdn(serviceFqdn)
                 .apiServerFqdn(apiServerFqdn)
                 .controllerIp(controllerIp)
+                .datacenterId(datacenterId)
+                .clusterId(clusterId)
                 .build();
     }
 
@@ -127,6 +135,8 @@
                 .serviceFqdn(serviceFqdn)
                 .apiServerFqdn(apiServerFqdn)
                 .controllerIp(controllerIp)
+                .datacenterId(datacenterId)
+                .clusterId(clusterId)
                 .build();
     }
 
@@ -144,6 +154,8 @@
                 .serviceFqdn(serviceFqdn)
                 .apiServerFqdn(apiServerFqdn)
                 .controllerIp(controllerIp)
+                .datacenterId(datacenterId)
+                .clusterId(clusterId)
                 .build();
     }
 
@@ -183,6 +195,16 @@
     }
 
     @Override
+    public String datacenterId() {
+        return datacenterId;
+    }
+
+    @Override
+    public String clusterId() {
+        return clusterId;
+    }
+
+    @Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -198,14 +220,16 @@
                 clientKeyData.equals(that.clientKeyData) &&
                 Objects.equals(serviceFqdn, that.serviceFqdn) &&
                 Objects.equals(apiServerFqdn, that.apiServerFqdn) &&
-                Objects.equals(controllerIp, that.controllerIp);
+                Objects.equals(controllerIp, that.controllerIp) &&
+                Objects.equals(datacenterId, that.datacenterId) &&
+                Objects.equals(clusterId, that.clusterId);
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(scheme, ipAddress, port, state, token,
                 caCertData, clientCertData, clientKeyData, serviceFqdn,
-                apiServerFqdn, controllerIp);
+                apiServerFqdn, controllerIp, datacenterId, clusterId);
     }
 
     @Override
@@ -222,6 +246,8 @@
                 .add("serviceFqdn", serviceFqdn)
                 .add("apiServerFqdn", apiServerFqdn)
                 .add("controllerIp", controllerIp)
+                .add("datacenterId", datacenterId)
+                .add("clusterId", clusterId)
                 .toString();
     }
 
@@ -247,6 +273,8 @@
         private String serviceFqdn;
         private String apiServerFqdn;
         private IpAddress controllerIp;
+        private String datacenterId;
+        private String clusterId;
 
         @Override
         public KubevirtApiConfig build() {
@@ -262,7 +290,7 @@
 
             return new DefaultKubevirtApiConfig(scheme, ipAddress, port, state,
                     token, caCertData, clientCertData, clientKeyData, serviceFqdn,
-                    apiServerFqdn, controllerIp);
+                    apiServerFqdn, controllerIp, datacenterId, clusterId);
         }
 
         @Override
@@ -330,5 +358,17 @@
             this.controllerIp = controllerIp;
             return this;
         }
+
+        @Override
+        public Builder datacenterId(String datacenterId) {
+            this.datacenterId = datacenterId;
+            return this;
+        }
+
+        @Override
+        public Builder clusterId(String clusterId) {
+            this.clusterId = clusterId;
+            return this;
+        }
     }
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtApiConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtApiConfig.java
index 74ad4cb..c56c9b6 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtApiConfig.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtApiConfig.java
@@ -154,6 +154,20 @@
     IpAddress controllerIp();
 
     /**
+     * Returns the datacenter id.
+     *
+     * @return datacenter id.
+     */
+    String datacenterId();
+
+    /**
+     * Returns the cluster id.
+     *
+     * @return cluster id.
+     */
+    String clusterId();
+
+    /**
      * Builder of new API config entity.
      */
     interface Builder {
@@ -252,5 +266,21 @@
          * @return Kubevirt API config builder
          */
         Builder controllerIp(IpAddress controllerIp);
+
+        /**
+         * Returns kubevirt API server config builder with the supplied datacenter id.
+         *
+         * @param datacenteId datacenter id
+         * @return Kubevirt API config builder
+         */
+        Builder datacenterId(String datacenteId);
+
+        /**
+         * Returns kubevirt API server config builder with the supplied cluster id.
+         *
+         * @param clusterId cluster id
+         * @return Kubevirt API config builder
+         */
+        Builder clusterId(String clusterId);
     }
 }
diff --git a/apps/kubevirt-node/api/src/test/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfigTest.java b/apps/kubevirt-node/api/src/test/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfigTest.java
index 7b98323..486e0dc 100644
--- a/apps/kubevirt-node/api/src/test/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfigTest.java
+++ b/apps/kubevirt-node/api/src/test/java/org/onosproject/kubevirtnode/api/DefaultKubevirtApiConfigTest.java
@@ -62,6 +62,13 @@
     private static final IpAddress CONTROLLER_IP_1 = IpAddress.valueOf("127.0.0.1");
     private static final IpAddress CONTROLLER_IP_2 = IpAddress.valueOf("169.254.169.254");
 
+    private static final String DATACENTER_ID_1 = "BD";
+    private static final String DATACENTER_ID_2 = "SS";
+
+    private static final String CLUSTER_ID_1 = "BD-CT-01";
+    private static final String CLUSTER_ID_2 = "SS-CT-01";
+
+
     private KubevirtApiConfig config1;
     private KubevirtApiConfig sameAsConfig1;
     private KubevirtApiConfig config2;
@@ -91,6 +98,8 @@
                 .serviceFqdn(SERVICE_FQDN_1)
                 .apiServerFqdn(API_SERVER_FQDN_1)
                 .controllerIp(CONTROLLER_IP_1)
+                .datacenterId(DATACENTER_ID_1)
+                .clusterId(CLUSTER_ID_1)
                 .build();
 
         sameAsConfig1 = DefaultKubevirtApiConfig.builder()
@@ -105,6 +114,8 @@
                 .serviceFqdn(SERVICE_FQDN_1)
                 .apiServerFqdn(API_SERVER_FQDN_1)
                 .controllerIp(CONTROLLER_IP_1)
+                .datacenterId(DATACENTER_ID_1)
+                .clusterId(CLUSTER_ID_1)
                 .build();
 
         config2 = DefaultKubevirtApiConfig.builder()
@@ -119,6 +130,8 @@
                 .serviceFqdn(SERVICE_FQDN_2)
                 .apiServerFqdn(API_SERVER_FQDN_2)
                 .controllerIp(CONTROLLER_IP_2)
+                .datacenterId(DATACENTER_ID_2)
+                .clusterId(CLUSTER_ID_2)
                 .build();
     }
 
@@ -150,5 +163,7 @@
         assertEquals(SERVICE_FQDN_1, config.serviceFqdn());
         assertEquals(API_SERVER_FQDN_1, config.apiServerFqdn());
         assertEquals(CONTROLLER_IP_1, config.controllerIp());
+        assertEquals(DATACENTER_ID_1, config.datacenterId());
+        assertEquals(CLUSTER_ID_1, config.clusterId());
     }
 }
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 5b9c268..75d4ced 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%-20s%-10s%-25s%-10s";
+    private static final String FORMAT = "%-10s%-20s%-10s%-25s%-10s%-20s%-20s";
 
     @Override
     protected void doExecute() throws Exception {
@@ -43,14 +43,14 @@
         if (outputJson()) {
             print("%s", json(config));
         } else {
-            print(FORMAT, "Scheme", "Server IP", "Port", "Controller IP", "State");
+            print(FORMAT, "Scheme", "Server IP", "Port", "Controller IP", "State", "Datacenter ID", "Cluster ID");
             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(), controllerIp, config.state().name());
+                        config.port(), controllerIp, config.state().name(), config.datacenterId(), config.clusterId());
             } 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 9fc2099..e79843f 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
@@ -44,6 +44,8 @@
     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 DATACENTER_ID = "datacenterId";
+    private static final String CLUSTER_ID = "clusterId";
 
     private static final String MISSING_MESSAGE = " is required in KubevirtApiConfig";
 
@@ -53,7 +55,9 @@
                 .put(SCHEME, entity.scheme().name())
                 .put(IP_ADDRESS, entity.ipAddress().toString())
                 .put(PORT, entity.port())
-                .put(STATE, entity.state().name());
+                .put(STATE, entity.state().name())
+                .put(DATACENTER_ID, entity.datacenterId())
+                .put(CLUSTER_ID, entity.clusterId());
 
         if (entity.scheme() == HTTPS) {
             node.put(CA_CERT_DATA, entity.caCertData())
@@ -122,6 +126,8 @@
         JsonNode serviceFqdn = json.get(SERVICE_FQDN);
         JsonNode apiServerFqdn = json.get(API_SERVER_FQDN);
         JsonNode controllerIp = json.get(CONTROLLER_IP);
+        JsonNode datacenterId = json.get(DATACENTER_ID);
+        JsonNode clusterId = json.get(CLUSTER_ID);
 
         String token = "";
         String caCertData = "";
@@ -186,6 +192,14 @@
             builder.controllerIp(IpAddress.valueOf(controllerIp.asText()));
         }
 
+        if (datacenterId != null) {
+            builder.datacenterId(datacenterId.asText());
+        }
+
+        if (clusterId != null) {
+            builder.clusterId(clusterId.asText());
+        }
+
         return builder.build();
     }
 }
diff --git a/apps/kubevirt-node/app/src/main/resources/definitions/KubevirtApiConfig.json b/apps/kubevirt-node/app/src/main/resources/definitions/KubevirtApiConfig.json
index 4e0800d..88c5520 100644
--- a/apps/kubevirt-node/app/src/main/resources/definitions/KubevirtApiConfig.json
+++ b/apps/kubevirt-node/app/src/main/resources/definitions/KubevirtApiConfig.json
@@ -5,7 +5,9 @@
     "segmentId",
     "scheme",
     "ipAddress",
-    "port"
+    "port",
+    "datacenterId",
+    "clusterId"
   ],
   "properties": {
     "clusterName": {
@@ -27,6 +29,14 @@
     "port": {
       "type": "integer",
       "example": 6443
+    },
+    "datacenterId": {
+      "type": "string",
+      "example": "BD"
+    },
+    "clusterId": {
+      "type": "string",
+      "example": "BD-MEH-CT01"
     }
   }
 }
\ No newline at end of file
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 16af906..06dfd48 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
@@ -89,7 +89,10 @@
                 .serviceFqdn("kubevirt.edgestack.svc.cluster.local")
                 .apiServerFqdn("kubernetes.default.svc.cluster.local")
                 .controllerIp(IpAddress.valueOf("127.0.0.1"))
+                .datacenterId("BD")
+                .clusterId("BD-MEH-CT01")
                 .build();
+
         ObjectNode configJson = kubevirtApiConfigCodec.encode(config, context);
         assertThat(configJson, matchesKubevirtApiConfig(config));
     }
@@ -113,6 +116,9 @@
         assertEquals("kubevirt.edgestack.svc.cluster.local", config.serviceFqdn());
         assertEquals("kubernetes.default.svc.cluster.local", config.apiServerFqdn());
         assertEquals("127.0.0.1", config.controllerIp().toString());
+        assertEquals("BD", config.datacenterId());
+        assertEquals("BD-MEH-CT01", config.clusterId());
+
     }
 
     private KubevirtApiConfig getKubevirtApiConfig(String resourceName) throws IOException {
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/impl/KubevirtApiConfigManagerTest.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/impl/KubevirtApiConfigManagerTest.java
index 0e5db34..98a6b1e 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/impl/KubevirtApiConfigManagerTest.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/impl/KubevirtApiConfigManagerTest.java
@@ -74,12 +74,16 @@
                 .ipAddress(IpAddress.valueOf("10.10.10.2"))
                 .port(6443)
                 .state(DISCONNECTED)
+                .datacenterId("BD")
+                .clusterId("BD-MEH-CT01")
                 .build();
         apiConfig2 = DefaultKubevirtApiConfig.builder()
                 .scheme(KubevirtApiConfig.Scheme.HTTP)
                 .ipAddress(IpAddress.valueOf("10.10.10.3"))
                 .port(6443)
                 .state(DISCONNECTED)
+                .datacenterId("BD")
+                .clusterId("BD-MEH-CT01")
                 .build();
 
         configStore = new DistributedKubevirtApiConfigStore();
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResourceTest.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResourceTest.java
index e6d1034..5a72b49 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResourceTest.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResourceTest.java
@@ -87,6 +87,8 @@
                 .caCertData("caCertData")
                 .clientCertData("clientCertData")
                 .clientKeyData("clientKeyData")
+                .datacenterId("DB")
+                .clusterId("BD-MEH-CT01")
                 .build();
     }
 
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 b95c29a..5f48d0a 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
@@ -8,5 +8,7 @@
   "clientKeyData": "clientKeyData",
   "serviceFqdn": "kubevirt.edgestack.svc.cluster.local",
   "apiServerFqdn": "kubernetes.default.svc.cluster.local",
-  "controllerIp": "127.0.0.1"
+  "controllerIp": "127.0.0.1",
+  "datacenterId": "BD",
+  "clusterId": "BD-MEH-CT01"
 }
\ 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 7a5c5f5..b256cc4 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
@@ -6,5 +6,7 @@
   "caCertData": "caCertData",
   "clientCertData": "clientCertData",
   "clientKeyData": "clientKeyData",
-  "controllerIp": "127.0.0.1"
+  "controllerIp": "127.0.0.1",
+  "datacenterId": "BD",
+  "clusterId": "BD-MEH-CT01"
 }
\ No newline at end of file