Initial support VM and container communication via POD and service IP

Change-Id: Ic87beee6ed122ec5551370c2b6a2789edf8fba5b
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
index 0d72a2b..e058aaa 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
@@ -20,6 +20,7 @@
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.Annotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
@@ -242,6 +243,24 @@
     }
 
     @Override
+    public MacAddress portMacByName(String portName) {
+        if (portName == null) {
+            return null;
+        } else {
+            return macAddress(this.intgBridge, portName);
+        }
+    }
+
+    @Override
+    public PortNumber portNumByName(String portName) {
+        if (portName == null) {
+            return null;
+        } else {
+            return portNumber(this.intgBridge, portName);
+        }
+    }
+
+    @Override
     public MacAddress vlanPortMac() {
         if (vlanIntf == null) {
             return null;
@@ -394,6 +413,25 @@
         return neutronConfig;
     }
 
+    private MacAddress macAddress(DeviceId deviceId, String portName) {
+        Port port = port(deviceId, portName);
+        Annotations annots = port.annotations();
+        return annots != null ? MacAddress.valueOf(annots.value(PORT_MAC)) : null;
+    }
+
+    private PortNumber portNumber(DeviceId deviceId, String portName) {
+        Port port = port(deviceId, portName);
+        return port != null ? port.number() : null;
+    }
+
+    private Port port(DeviceId deviceId, String portName) {
+        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
+        return deviceService.getPorts(deviceId).stream()
+                .filter(p -> p.isEnabled() &&
+                        Objects.equals(p.annotations().value(PORT_NAME), portName))
+                .findAny().orElse(null);
+    }
+
     /**
      * Returns new builder instance.
      *
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
index 8a0e1eb..6396b29 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
@@ -130,6 +130,22 @@
     PortNumber patchPortNum();
 
     /**
+     * Returns the port MAC address with the given patch port name.
+     *
+     * @param portName patch port name
+     * @return port MAC address
+     */
+    MacAddress portMacByName(String portName);
+
+    /**
+     * Returns the port number with the given patch port name.
+     *
+     * @param portName patch port name
+     * @return port number
+     */
+    PortNumber portNumByName(String portName);
+
+    /**
      * Returns the vlan port MAC address.
      *
      * @return mac address; null if vlan port does not exist
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeService.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeService.java
index a692109..8f641f5 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeService.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeService.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacknode.api;
 
+import org.onlab.packet.IpAddress;
 import org.onosproject.event.ListenerService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.openstacknode.api.OpenstackNode.NodeType;
@@ -77,6 +78,14 @@
     OpenstackNode node(DeviceId deviceId);
 
     /**
+     * Returns the node with the specified management IP address.
+     *
+     * @param mgmtIp management IP
+     * @return openstack node
+     */
+    OpenstackNode node(IpAddress mgmtIp);
+
+    /**
      * Adds the vf port to the given openstack node.
      *
      * @param osNode openstack node
diff --git a/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/OpenstackNodeAdapter.java b/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/OpenstackNodeAdapter.java
index 5e6f703..1922ec1 100644
--- a/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/OpenstackNodeAdapter.java
+++ b/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/OpenstackNodeAdapter.java
@@ -94,6 +94,16 @@
     }
 
     @Override
+    public MacAddress portMacByName(String portName) {
+        return null;
+    }
+
+    @Override
+    public PortNumber portNumByName(String portName) {
+        return null;
+    }
+
+    @Override
     public MacAddress vlanPortMac() {
         return null;
     }