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: