ONOS-6626 OFAgent - return port info in PortDescStatsReply and PortStatus messages

Change-Id: I79201784f533dae34d8274fe2fb54e259e8a4a48
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
index e23cb81..59a2b2c 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
@@ -33,8 +33,10 @@
 import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
 import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
+import org.onosproject.incubator.net.virtual.VirtualPort;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -157,10 +159,19 @@
         return ImmutableSet.copyOf(ofSwitches);
     }
 
+    @Override
+    public Set<Port> ports(NetworkId networkId, DeviceId deviceId) {
+        Set<Port> ports = virtualNetService.getVirtualPorts(networkId, deviceId)
+                .stream()
+                .collect(Collectors.toSet());
+        return ImmutableSet.copyOf(ports);
+    }
+
     private void addOFSwitch(NetworkId networkId, DeviceId deviceId) {
         OFSwitch ofSwitch = DefaultOFSwitch.of(
                 dpidWithDeviceId(deviceId),
-                DEFAULT_CAPABILITIES);
+                DEFAULT_CAPABILITIES, networkId, deviceId,
+                virtualNetService.getServiceDirectory());
         ofSwitchMap.put(deviceId, ofSwitch);
         log.info("Added virtual OF switch for {}", deviceId);
 
@@ -289,6 +300,7 @@
 
         @Override
         public void event(VirtualNetworkEvent event) {
+            log.trace("Vnet event {}", event);
             switch (event.type()) {
                 case VIRTUAL_DEVICE_ADDED:
                     eventExecutor.execute(() -> {
@@ -312,14 +324,46 @@
                 case NETWORK_UPDATED:
                 case NETWORK_REMOVED:
                 case NETWORK_ADDED:
+                    break;
                 case VIRTUAL_PORT_ADDED:
+                    eventExecutor.execute(() -> {
+                        OFSwitch ofSwitch = ofSwitch(event.virtualPort());
+                        if (ofSwitch != null) {
+                            ofSwitch.processPortAdded(event.virtualPort());
+                            log.debug("Virtual port {} added to network {}",
+                                      event.virtualPort(),
+                                      event.subject());
+                        }
+                    });
+                    break;
                 case VIRTUAL_PORT_UPDATED:
+                    break;
                 case VIRTUAL_PORT_REMOVED:
+                    eventExecutor.execute(() -> {
+                        OFSwitch ofSwitch = ofSwitch(event.virtualPort());
+                        if (ofSwitch != null) {
+                            ofSwitch.processPortRemoved(event.virtualPort());
+                            log.debug("Virtual port {} removed from network {}",
+                                      event.virtualPort(),
+                                      event.subject());
+                        }
+                    });
+                    break;
                 default:
                     // do nothing
                     break;
             }
         }
+
+        private OFSwitch ofSwitch(VirtualPort virtualPort) {
+            OFSwitch ofSwitch = ofSwitchMap.get(virtualPort.element().id());
+            if (ofSwitch == null) {
+                log.warn("Switch does not exist for port {}", virtualPort);
+            } else {
+                log.trace("Switch exists for port {}", virtualPort);
+            }
+            return ofSwitch;
+        }
     }
 
     private class InternalOFAgentListener implements OFAgentListener {