ONOS-3732 Bandwidth resource registration using netcfg.

- Uses netcfg defined value as available resource if defined,
  else uses port speed as available Bandwidth resource

Change-Id: I2dde9a9194025194ed8785b4608f064debab182b
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
index b72e693..e3e42ac 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
@@ -18,7 +18,9 @@
 import com.google.common.collect.ImmutableSet;
 import org.onlab.packet.MplsLabel;
 import org.onlab.packet.VlanId;
+import org.onlab.util.Bandwidth;
 import org.onlab.util.ItemNotFoundException;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.OchSignal;
@@ -29,17 +31,20 @@
 import org.onosproject.net.behaviour.MplsQuery;
 import org.onosproject.net.behaviour.TributarySlotQuery;
 import org.onosproject.net.behaviour.VlanQuery;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.newresource.ResourceAdminService;
+import org.onosproject.net.newresource.BandwidthCapacity;
 import org.onosproject.net.newresource.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -56,21 +61,25 @@
     private final ResourceAdminService adminService;
     private final DeviceService deviceService;
     private final DriverService driverService;
+    private final NetworkConfigService netcfgService;
     private final ExecutorService executor;
 
+
     /**
      * Creates an instance with the specified ResourceAdminService and ExecutorService.
      *
      * @param adminService instance invoked to register resources
      * @param deviceService {@link DeviceService} to be used
      * @param driverService {@link DriverService} to be used
+     * @param netcfgService {@link NetworkConfigService} to be used.
      * @param executor executor used for processing resource registration
      */
     ResourceDeviceListener(ResourceAdminService adminService, DeviceService deviceService, DriverService driverService,
-                           ExecutorService executor) {
+                           NetworkConfigService netcfgService, ExecutorService executor) {
         this.adminService = checkNotNull(adminService);
         this.deviceService = checkNotNull(deviceService);
         this.driverService = checkNotNull(driverService);
+        this.netcfgService = checkNotNull(netcfgService);
         this.executor = checkNotNull(executor);
     }
 
@@ -121,6 +130,15 @@
         executor.submit(() -> {
             adminService.registerResources(portPath);
 
+            queryBandwidth(device.id(), port.number())
+                .map(bw -> portPath.child(Bandwidth.class, bw.bps()))
+                .map(adminService::registerResources)
+                .ifPresent(success -> {
+                   if (!success) {
+                       log.error("Failed to register Bandwidth for {}", portPath.id());
+                   }
+                });
+
             // for VLAN IDs
             Set<VlanId> vlans = queryVlanIds(device.id(), port.number());
             if (!vlans.isEmpty()) {
@@ -160,6 +178,30 @@
         executor.submit(() -> adminService.unregisterResources(resource));
     }
 
+    /**
+     * Query bandwidth capacity on a port.
+     *
+     * @param did {@link DeviceId}
+     * @param number {@link PortNumber}
+     * @return bandwidth capacity
+     */
+    private Optional<Bandwidth> queryBandwidth(DeviceId did, PortNumber number) {
+        // Check and use netcfg first.
+        ConnectPoint cp = new ConnectPoint(did, number);
+        BandwidthCapacity config = netcfgService.getConfig(cp, BandwidthCapacity.class);
+        if (config != null) {
+            log.trace("Registering configured bandwidth {} for {}/{}", config.capacity(), did, number);
+            return Optional.of(config.capacity());
+        }
+
+        // populate bandwidth value, assuming portSpeed == bandwidth
+        Port port = deviceService.getPort(did, number);
+        if (port != null) {
+            return Optional.of(Bandwidth.mbps(port.portSpeed()));
+        }
+        return Optional.empty();
+    }
+
     private Set<OchSignal> queryLambdas(DeviceId did, PortNumber port) {
         try {
             DriverHandler handler = driverService.createHandler(did);