CORD-2288: Allow adding ServicePort after OF port is added to bridge

Change-Id: I3b66c3e7cfdd49d702a9d49c153639fa80505fe2
diff --git a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
index ee178f5..74017c8 100644
--- a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
+++ b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
@@ -30,6 +30,7 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
 import org.onosproject.net.HostLocation;
@@ -58,6 +59,7 @@
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.ExecutorService;
+import java.util.stream.StreamSupport;
 
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
@@ -278,6 +280,11 @@
             });
         }
 
+        private boolean hasPort(Device device, String portName) {
+            return deviceService.getPorts(device.id()).stream()
+                    .anyMatch(p -> p.annotations().value(PORT_NAME).equals(portName));
+        }
+
         private void handle(ServiceNetworkEvent event) {
             switch (event.type()) {
                 case SERVICE_PORT_CREATED:
@@ -285,8 +292,22 @@
                     log.debug("Processing service port {}", event.servicePort());
                     PortId portId = event.servicePort().id();
                     Instance instance = getInstance(portId);
-                    if (instance != null) {
-                        addInstance(instance.host().location());
+                    if (instance == null) {
+                        String portName = event.servicePort().name();
+
+                        Optional<Device> device =
+                                StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
+                                        .filter(d -> hasPort(d, portName))
+                                        .findAny();
+
+                        Optional<Port> port = device.flatMap(d -> deviceService.getPorts(d.id()).stream()
+                                .filter(p -> p.annotations().value(PORT_NAME) != null)
+                                .filter(p -> p.annotations().value(PORT_NAME).equals(portName))
+                                .findAny());
+
+                        if (device.isPresent() && port.isPresent()) {
+                            addInstance(new ConnectPoint(device.get().id(), port.get().number()));
+                        }
                     }
                     break;
                 case SERVICE_PORT_REMOVED: