Allow static lambda and port mappings (ONOS-2067).
Fix bug in device resource store.

Change-Id: I219a4de9ec803b3d142a6b957868f64dc599fa24
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/ConfigProvider.java b/web/api/src/main/java/org/onosproject/rest/resources/ConfigProvider.java
index 55a14f3..296337f 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/ConfigProvider.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/ConfigProvider.java
@@ -214,15 +214,28 @@
     private void parsePorts(DeviceId deviceId, JsonNode nodes) {
         List<PortDescription> ports = new ArrayList<>();
         for (JsonNode node : nodes) {
-            ports.add(parsePort(node));
+            ports.add(parsePort(deviceId, node));
         }
         deviceProviderService.updatePorts(deviceId, ports);
     }
 
     // Parses the given node with port information.
-    private PortDescription parsePort(JsonNode node) {
+    private PortDescription parsePort(DeviceId deviceId, JsonNode node) {
         Port.Type type = Port.Type.valueOf(node.path("type").asText("COPPER"));
-        PortNumber port = portNumber(node.path("port").asLong(0));
+        // TL1-based ports have a name
+        PortNumber port = null;
+        if (node.has("name")) {
+            for (Port p : deviceService.getPorts(deviceId)) {
+                if (p.number().name().equals(node.get("name").asText())) {
+                    port = p.number();
+                    break;
+                }
+            }
+        } else {
+            port = portNumber(node.path("port").asLong(0));
+        }
+
+        checkNotNull(port);
         String portName = Strings.emptyToNull(port.name());
         SparseAnnotations annotations  = null;
         if (portName != null) {
@@ -239,6 +252,22 @@
                 return new OmsPortDescription(port, node.path("enabled").asBoolean(true),
                                               CENTER, CENTER.add(TOTAL),
                                               Frequency.ofGHz(100), annotations);
+            case ODUCLT:
+                annotations = annotations(node.get("annotations"));
+                OduCltPort oduCltPort = (OduCltPort) deviceService.getPort(deviceId, port);
+                return new OduCltPortDescription(port, node.path("enabled").asBoolean(true),
+                        oduCltPort.signalType(), annotations);
+            case OCH:
+                annotations = annotations(node.get("annotations"));
+                OchPort ochPort = (OchPort) deviceService.getPort(deviceId, port);
+                return new OchPortDescription(port, node.path("enabled").asBoolean(true),
+                        ochPort.signalType(), ochPort.isTunable(),
+                        ochPort.lambda(), annotations);
+            case OMS:
+                annotations = annotations(node.get("annotations"));
+                OmsPort omsPort = (OmsPort) deviceService.getPort(deviceId, port);
+                return new OmsPortDescription(port, node.path("enabled").asBoolean(true),
+                        omsPort.minFrequency(), omsPort.maxFrequency(), omsPort.grid(), annotations);
             default:
                 log.warn("{}: Unsupported Port Type");
         }