CORD-248 Provide host management network connectivity to a VM

Change-Id: I6f632e118bd11f4f469aae0476d2d35fc2b7c3eb
diff --git a/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java b/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
index df3d336..c45fef3 100644
--- a/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
+++ b/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
@@ -28,6 +28,7 @@
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipService;
 import org.onosproject.cluster.NodeId;
+import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.behaviour.BridgeDescription;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
 import org.onosproject.net.behaviour.InterfaceConfig;
@@ -73,6 +74,7 @@
 
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -314,12 +316,9 @@
             log.warn("Failed to get node for {}", deviceId);
             return null;
         }
-        Port port = deviceService.getPorts(deviceId).stream()
-                .filter(p -> portName(p).contains(node.dataIface()) &&
-                        p.isEnabled())
-                .findFirst().orElse(null);
 
-        return port == null ? null : port.number();
+        Optional<PortNumber> port = getPortNumber(deviceId, node.dataIface());
+        return port.isPresent() ? port.get() : null;
     }
 
     /**
@@ -344,11 +343,39 @@
      * @return port number
      */
     public PortNumber tunnelPort(DeviceId deviceId) {
-        Port port = deviceService.getPorts(deviceId).stream()
-                .filter(p -> portName(p).contains(DEFAULT_TUNNEL))
-                .findFirst().orElse(null);
+        Optional<PortNumber> port = getPortNumber(deviceId, DEFAULT_TUNNEL);
+        return port.isPresent() ? port.get() : null;
+    }
 
-        return port == null ? null : port.number();
+    /**
+     * Returns host management interface port number if exists.
+     *
+     * @param deviceId integration bridge device id
+     * @return port number; null if it does not exist
+     */
+    public PortNumber hostManagementPort(DeviceId deviceId) {
+        CordVtnNode node = nodeByBridgeId(deviceId);
+        if (node == null) {
+            log.warn("Failed to get node for {}", deviceId);
+            return null;
+        }
+
+        if (node.hostMgmtIface().isPresent()) {
+            Optional<PortNumber> port = getPortNumber(deviceId, node.hostMgmtIface().get());
+            return port.isPresent() ? port.get() : null;
+        } else {
+            return null;
+        }
+    }
+
+    private Optional<PortNumber> getPortNumber(DeviceId deviceId, String portName) {
+        PortNumber port = deviceService.getPorts(deviceId).stream()
+                .filter(p -> p.annotations().value(AnnotationKeys.PORT_NAME).equals(portName) &&
+                        p.isEnabled())
+                .map(Port::number)
+                .findAny()
+                .orElse(null);
+        return Optional.ofNullable(port);
     }
 
     /**
@@ -398,8 +425,7 @@
             ovsdbClient.disconnect();
         }
 
-        pipeline.initPipeline(node, dataPort(node.integrationBridgeId()),
-                              tunnelPort(node.integrationBridgeId()));
+        pipeline.initPipeline(node);
 
         // adds existing instances to the host list
         deviceService.getPorts(node.integrationBridgeId()).stream()