Add flow support to the Polatis SNMP driver

Change-Id: I150e174acd54c945c95ca9a1885f1f6313d44ce9
diff --git a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDeviceDescription.java b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDeviceDescription.java
index ff2862d..8d7ec4e 100644
--- a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDeviceDescription.java
+++ b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDeviceDescription.java
@@ -17,8 +17,10 @@
 package org.onosproject.drivers.polatis.snmp;
 
 import com.google.common.collect.Lists;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
@@ -28,6 +30,12 @@
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 
 import org.onlab.packet.ChassisId;
+import org.onlab.util.Frequency;
+import org.onlab.util.Spectrum;
+
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.VariableBinding;
+import org.snmp4j.util.TableEvent;
 
 import org.slf4j.Logger;
 
@@ -37,7 +45,9 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
+import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription;
 import static org.onosproject.drivers.polatis.snmp.PolatisSnmpUtility.getOid;
+import static org.onosproject.drivers.polatis.snmp.PolatisSnmpUtility.getTable;
 
 /**
  * Representation of device information and ports via SNMP for all Polatis
@@ -53,6 +63,12 @@
     private static final String PRODUCT_CODE_OID = ".1.3.6.1.4.1.26592.2.1.2.2.1.0";
     private static final String SERIAL_NUMBER_OID = ".1.3.6.1.4.1.26592.2.1.2.2.2.0";
 
+    private static final String PORT_ENTRY_OID = ".1.3.6.1.4.1.26592.2.2.2.1.2";
+    private static final String PORT_PATCH_OID = PORT_ENTRY_OID + ".1.2";
+    private static final String PORT_CURRENT_STATE_OID = PORT_ENTRY_OID + ".1.3";
+
+    public static final int POLATIS_NUM_OF_WAVELENGTHS = 39;
+
     private final Logger log = getLogger(getClass());
 
     /**
@@ -76,7 +92,7 @@
         try {
             hardwareVersion = hardwareVersion();
         } catch (IOException e) {
-            log.error("Error reading hardware version for device {} exception {}", deviceId, e);
+            log.error("Error reading hardware version for device {} exception ", deviceId, e);
         }
 
         String softwareVersion = DEFAULT_DESCRIPTION_DATA;
@@ -106,9 +122,55 @@
      */
     @Override
     public List<PortDescription> discoverPortDetails() {
-        // TODO: Implement me
-        return Lists.newLinkedList();
-        // return ImmutableList.copyOf(this.getPorts());
+        List<PortDescription> ports = Lists.newArrayList();
+        List<TableEvent> events;
+        DeviceId deviceId = handler().data().deviceId();
+
+        try {
+            OID[] columnOIDs = {new OID(PORT_CURRENT_STATE_OID)};
+            events = getTable(handler(), columnOIDs);
+        } catch (IOException e) {
+            log.error("Error reading ports table for device {} exception {}", deviceId, e);
+            return ports;
+        }
+
+        if (events == null) {
+            log.error("Error reading ports table for device {}", deviceId);
+            return ports;
+        }
+
+        for (TableEvent event : events) {
+            if (event == null) {
+                log.error("Error reading event for device {}", deviceId);
+                continue;
+            }
+            VariableBinding[] columns = event.getColumns();
+            if (columns == null) {
+                log.error("Error reading columns for device {} event {}", deviceId, event);
+                continue;
+            }
+
+            VariableBinding portColumn = columns[0];
+            if (portColumn == null) {
+                continue;
+            }
+
+            int port = event.getIndex().last();
+            boolean enabled = (portColumn.getVariable().toInt() == 1);
+            PortNumber portNumber = PortNumber.portNumber(port);
+            DefaultAnnotations annotations = DefaultAnnotations.builder().build();
+            double opticalBand = Spectrum.O_BAND_MIN.asGHz() - Spectrum.L_BAND_MAX.asGHz();
+            Frequency opticalGrid = Frequency.ofGHz(opticalBand / POLATIS_NUM_OF_WAVELENGTHS);
+            PortDescription p = omsPortDescription(portNumber,
+                    enabled,
+                    Spectrum.O_BAND_MIN,
+                    Spectrum.L_BAND_MAX,
+                    opticalGrid,
+                    annotations);
+            ports.add(p);
+        }
+
+        return ports;
     }
 
     private String hardwareVersion() throws IOException {