SNMP based device and flow rule provider for Lumentum SDN ROADMs.

ONOS-3690 and ONOS-3842

Change-Id: If00ba70fa26e01924c225596c52a5ffb24987cc2
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
index 316b3ba..56e3b6a 100644
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
+++ b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
@@ -32,9 +32,13 @@
 import org.onlab.packet.ChassisId;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.behaviour.PortDiscovery;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
 import org.onosproject.net.device.DeviceProvider;
@@ -120,6 +124,7 @@
         //TODO refactor, no hardcoding in provider, device information should be in drivers
         providers.put("1.3.6.1.4.1.18070.2.2", new Bti7000DeviceDescriptionProvider());
         providers.put("1.3.6.1.4.1.20408", new NetSnmpDeviceDescriptionProvider());
+        providers.put("1.3.6.1.4.562.73.6", new LumentumDeviceDescriptionProvider());
     }
 
     @Activate
@@ -341,9 +346,12 @@
                 DeviceId did = getDeviceId();
                 ChassisId cid = new ChassisId();
 
+                SparseAnnotations annotations = DefaultAnnotations.builder()
+                        .set(AnnotationKeys.PROTOCOL, SCHEME.toUpperCase())
+                        .build();
 
                 DeviceDescription desc = new DefaultDeviceDescription(
-                        did.uri(), Device.Type.OTHER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cid);
+                        did.uri(), Device.Type.OTHER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cid, annotations);
 
                 desc = populateDescriptionFromDevice(did, desc);
 
@@ -353,6 +361,18 @@
                 providerService.deviceConnected(did, desc);
                 log.info("Done with Device Info Creation on ONOS core. Device Info: "
                         + device.deviceInfo() + " " + did.uri().toString());
+
+                // Do port discovery if driver supports it
+                Device d = deviceService.getDevice(did);
+                if (d.is(PortDiscovery.class)) {
+                    PortDiscovery portConfig = d.as(PortDiscovery.class);
+                    if (portConfig != null) {
+                        providerService.updatePorts(did, portConfig.getPorts());
+                    }
+                } else {
+                    log.warn("No port discovery behaviour for device {}", did);
+                }
+
                 delay(EVENTINTERVAL);
             } catch (URISyntaxException e) {
                 log.error("Syntax Error while creating URI for the device: "
@@ -373,8 +393,8 @@
                 String ipAddress = deviceComponents[1];
                 String port = deviceComponents[2];
 
-           ISnmpConfiguration config = new V2cSnmpConfiguration();
-            config.setPort(Integer.parseInt(port));
+                ISnmpConfiguration config = new V2cSnmpConfiguration();
+                config.setPort(Integer.parseInt(port));
 
                 try (ISnmpSession session = sessionFactory.createSession(config, ipAddress)) {
                     // Each session will be auto-closed.