Add VM name field in kubevirt port object, expose via CLI and REST

Change-Id: I0ac84073fa7692862314fdf8862b4e3a256dd2d8
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java
index 5752436..1ce747e 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java
@@ -59,7 +59,7 @@
         ports.sort(Comparator.comparing(KubevirtPort::networkId));
 
         String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH,
-                CLI_MAC_ADDRESS_LENGTH, CLI_IP_ADDRESSES_LENGTH));
+                CLI_NAME_LENGTH, CLI_MAC_ADDRESS_LENGTH, CLI_IP_ADDRESSES_LENGTH));
 
         if (!Strings.isNullOrEmpty(networkId)) {
             ports.removeIf(port -> !port.networkId().equals(networkId));
@@ -68,9 +68,11 @@
         if (outputJson()) {
             print("%s", json(ports));
         } else {
-            print(format, "Network", "MAC Address", "Fixed IPs");
+            print(format, "VM Name", "Network", "MAC Address", "Fixed IPs");
             for (KubevirtPort port: ports) {
                 print(format,
+                        StringUtils.substring(port.vmName(), 0,
+                                CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                         StringUtils.substring(port.networkId(), 0,
                                 CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                         StringUtils.substring(port.macAddress().toString(), 0,
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
index a388227..281855e 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
@@ -36,6 +36,7 @@
 
     private final Logger log = getLogger(getClass());
 
+    private static final String VM_NAME = "vmName";
     private static final String NETWORK_ID = "networkId";
     private static final String MAC_ADDRESS = "macAddress";
     private static final String IP_ADDRESS = "ipAddress";
@@ -50,6 +51,7 @@
         checkNotNull(port, "Kubevirt port cannot be null");
 
         ObjectNode result = context.mapper().createObjectNode()
+                .put(VM_NAME, port.vmName())
                 .put(NETWORK_ID, port.networkId())
                 .put(MAC_ADDRESS, port.macAddress().toString());
 
@@ -82,6 +84,9 @@
             return null;
         }
 
+        String vmName = nullIsIllegal(json.get(VM_NAME).asText(),
+                VM_NAME + MISSING_MESSAGE);
+
         String networkId = nullIsIllegal(json.get(NETWORK_ID).asText(),
                 NETWORK_ID + MISSING_MESSAGE);
 
@@ -89,6 +94,7 @@
                 MAC_ADDRESS + MISSING_MESSAGE);
 
         KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
+                .vmName(vmName)
                 .networkId(networkId)
                 .macAddress(MacAddress.valueOf(macAddress));
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
index 8f38c4a..e48bb18 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
@@ -224,8 +224,11 @@
                 return;
             }
 
+            String vmName = parseVmName(resource);
+
             parseMacAddresses(resource).forEach((mac, net) -> {
                 KubevirtPort port = DefaultKubevirtPort.builder()
+                        .vmName(vmName)
                         .macAddress(mac)
                         .networkId(net)
                         .build();
@@ -249,8 +252,11 @@
                 return;
             }
 
+            String vmName = parseVmName(resource);
+
             parseMacAddresses(resource).forEach((mac, net) -> {
                 KubevirtPort port = DefaultKubevirtPort.builder()
+                        .vmName(vmName)
                         .macAddress(mac)
                         .networkId(net)
                         .build();
@@ -288,6 +294,22 @@
             return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
         }
 
+        private String parseVmName(String resource) {
+            String vmName = null;
+            try {
+                ObjectMapper mapper = new ObjectMapper();
+                JsonNode json = mapper.readTree(resource);
+                JsonNode nameJson = json.get(METADATA).get(NAME);
+                if (nameJson != null) {
+                    vmName = nameJson.asText();
+                }
+            } catch (IOException e) {
+                log.error("Failed to parse kubevirt VM name");
+            }
+
+            return vmName;
+        }
+
         private Map<String, IpAddress> parseIpAddresses(String resource) {
             try {
                 ObjectMapper mapper = new ObjectMapper();
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index a60bd0a..b49bbcc 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -89,9 +89,9 @@
     private static final String MAC = "mac";
     private static final String IPS = "ips";
     private static final String BR_INT = "br-int";
+    private static final String METADATA = "metadata";
     private static final String STATUS = "status";
     private static final String INTERFACES = "interfaces";
-    private static final String IP_ADDRESS = "ipAddress";
     private static final String NODE_NAME = "nodeName";
 
     /**
@@ -343,6 +343,7 @@
             JsonNode json = mapper.readTree(resource);
             JsonNode statusJson = json.get(STATUS);
             ArrayNode interfacesJson = (ArrayNode) statusJson.get(INTERFACES);
+            String vmName = parseResourceName(resource);
 
             KubevirtPort.Builder builder = DefaultKubevirtPort.builder();
             String nodeName = parseVmiNodeName(resource);
@@ -365,7 +366,8 @@
                     // FIXME: we do not update IP address, as learning IP address
                     // requires much more time due to the lag from VM agent
                     String mac = interfaceJson.get(MAC).asText();
-                    builder.macAddress(MacAddress.valueOf(mac))
+                    builder.vmName(vmName)
+                            .macAddress(MacAddress.valueOf(mac))
                             .networkId(network.networkId());
                     ports.add(builder.build());
                 }