Add OTN device and ports

Change-Id: I18f3376d1466077e95d7324a27a660302f0123b3
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index 346ddb7..59c2df0 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -54,6 +54,7 @@
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.OchSignal;
 import org.onosproject.net.OduSignalType;
+import org.onosproject.net.OtuSignalType;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
@@ -67,6 +68,7 @@
 import org.onosproject.net.device.OchPortDescription;
 import org.onosproject.net.device.OduCltPortDescription;
 import org.onosproject.net.device.OmsPortDescription;
+import org.onosproject.net.device.OtuPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.device.PortStatistics;
 import org.onosproject.net.provider.AbstractProvider;
@@ -492,13 +494,15 @@
          */
         private List<PortDescription> buildPortDescriptions(OpenFlowSwitch sw) {
             final List<PortDescription> portDescs = new ArrayList<>(sw.getPorts().size());
-            if (!(Device.Type.ROADM.equals(sw.deviceType()))) {
+            if (!((Device.Type.ROADM.equals(sw.deviceType())) ||
+                    (Device.Type.OTN.equals(sw.deviceType())))) {
                   sw.getPorts().forEach(port -> portDescs.add(buildPortDescription(port)));
             }
 
             OpenFlowOpticalSwitch opsw;
             switch (sw.deviceType()) {
                 case ROADM:
+                case OTN:
                     opsw = (OpenFlowOpticalSwitch) sw;
                     List<OFPortDesc> ports = opsw.getPorts();
                     LOG.debug("SW ID {} , ETH- ODU CLT Ports {}", opsw.getId(), ports);
@@ -578,6 +582,24 @@
             return buildPortDescription(ptype, (OFExpPort) port);
         }
 
+        private boolean matchingOtuPortSignalTypes(OFPortOpticalTransportSignalType sigType,
+                OduSignalType oduSignalType) {
+            switch (sigType) {
+            case OTU2:
+                if (oduSignalType == OduSignalType.ODU2) {
+                    return true;
+                }
+                break;
+            case OTU4:
+                if (oduSignalType == OduSignalType.ODU4) {
+                    return true;
+                }
+                break;
+            default:
+                break;
+            }
+            return false;
+        }
         /**
          * Build a portDescription from a given a port description describing some
          * Optical port.
@@ -622,8 +644,25 @@
                 break;
             case OTU2:
             case OTU4:
-                  LOG.error("Signal tpye OTU2/4 not supported yet ", port.toString());
-                  break;
+                entry = firstProp.getFeatures().get(0).getValue().get(0);
+                layerClass =  entry.getLayerClass();
+                if (!OFPortOpticalTransportLayerClass.ODU.equals(layerClass)) {
+                    LOG.error("Unsupported layer Class {} ", layerClass);
+                    return null;
+                }
+
+                // convert to ONOS OduSignalType
+                OduSignalType oduSignalTypeOtuPort = OpenFlowDeviceValueMapper.
+                        lookupOduSignalType((byte) entry.getSignalType());
+                if (!matchingOtuPortSignalTypes(sigType, oduSignalTypeOtuPort)) {
+                    LOG.error("Wrong oduSignalType {} for OTU Port sigType {} ", oduSignalTypeOtuPort, sigType);
+                    return null;
+                }
+                OtuSignalType otuSignalType =
+                        ((sigType == OFPortOpticalTransportSignalType.OTU2) ? OtuSignalType.OTU2 :
+                            OtuSignalType.OTU4);
+                portDes = new OtuPortDescription(portNo, enabled, otuSignalType, annotations);
+                break;
             default:
                 break;
             }