add a common folder for mutualized functions 41/73541/6
authorShweta V <sv111y@att.com>
Wed, 20 Dec 2017 10:23:09 +0000 (11:23 +0100)
committerguillaume.lambert <guillaume.lambert@orange.com>
Mon, 16 Jul 2018 20:42:04 +0000 (22:42 +0200)
Co-Authored-By: Dhruv Bhardwaj <db929a@att.com>
Co-Authored-By: Shweta Vachhani <sv111y@att.com>
Co-Authored-By: Masha Dorfman <>
Co-Authored-By: Archana Soundararajan <as7463@att.com>
Co-Authored-By: Juraj Veverka <Juraj.Veverka@pantheon.tech>
Co-Authored-By: Samuel Kontri <samuel.kontris@pantheon.sk>
Co-Authored-By: Andrej Zan <andrej.zan@pantheon.sk>
Co-Authored-By: Milan Fratrik <>
Co-authored-by: Martial COULIBALY <martial.coulibaly@gfi.fr>
Change-Id: I1b41bb54a2e5ba05797b67a629c72a38d31d1819
Signed-off-by: Shweta <sv111y@att.com>
Signed-off-by: Martial COULIBALY <martial.coulibaly@gfi.fr>
22 files changed:
common/pom.xml [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/InstanceIdentifiers.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/NetworkUtils.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/OperationResult.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/ResponseCodes.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/Timeouts.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransaction.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManager.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerImpl.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaceException.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java [new file with mode: 0644]
common/src/main/resources/org/opendaylight/blueprint/common-blueprint.xml [new file with mode: 0644]
common/src/test/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerTest.java [new file with mode: 0644]
common/src/test/java/org/opendaylight/transportpce/common/test/TransportPCETest.java [new file with mode: 0644]
common/src/test/resources/sample-config-ROADM.xml [new file with mode: 0644]
pom.xml

diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644 (file)
index 0000000..f14ae53
--- /dev/null
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!-- Copyright © 2016 Orange and others. All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
+    and is available at http://www.eclipse.org/legal/epl-v10.html -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.opendaylight.odlparent</groupId>
+        <artifactId>bundle-parent</artifactId>
+        <version>3.1.0</version>
+        <relativePath />
+    </parent>
+
+    <groupId>org.opendaylight.transportpce</groupId>
+    <artifactId>transportpce-common</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.controller</groupId>
+                <artifactId>mdsal-artifacts</artifactId>
+                <version>1.7.3-SNAPSHOT</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.netconf</groupId>
+                <artifactId>netconf-artifacts</artifactId>
+                <version>1.4.3-SNAPSHOT</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.12.3-SNAPSHOT</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>transportpce-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-topology</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-network-2015-06-08</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.netconf</groupId>
+            <artifactId>sal-netconf-connector</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}.ordmodels</groupId>
+            <artifactId>transportpce-ordmodels-device</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- Testing Dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/InstanceIdentifiers.java b/common/src/main/java/org/opendaylight/transportpce/common/InstanceIdentifiers.java
new file mode 100644 (file)
index 0000000..e883923
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class InstanceIdentifiers {
+
+    public static final InstanceIdentifier<Topology> NETCONF_TOPOLOGY_II =
+            InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, new TopologyKey(
+                    new TopologyId(TopologyNetconf.QNAME.getLocalName())));
+
+    public static final InstanceIdentifier<Network> UNDERLAY_NETWORK_II = InstanceIdentifier
+            .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))).build();
+
+    public static final InstanceIdentifier<Network> OVERLAY_NETWORK_II = InstanceIdentifier
+            .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
+
+    public static final InstanceIdentifier<Network> CLLI_NETWORK_II = InstanceIdentifier
+            .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))).build();
+
+    private InstanceIdentifiers() {
+        // Instance should be not created
+    }
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/NetworkUtils.java b/common/src/main/java/org/opendaylight/transportpce/common/NetworkUtils.java
new file mode 100644 (file)
index 0000000..ded1ce3
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright © 2016 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common;
+
+public final class NetworkUtils {
+
+    private NetworkUtils() {
+    }
+
+    public static final String CLLI_NETWORK_ID = "clli-network";
+    public static final String UNDERLAY_NETWORK_ID = "openroadm-network";
+    public static final String OVERLAY_NETWORK_ID = "openroadm-topology";
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/OperationResult.java b/common/src/main/java/org/opendaylight/transportpce/common/OperationResult.java
new file mode 100644 (file)
index 0000000..2506d06
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common;
+
+public class OperationResult {
+
+    private final boolean success;
+    private final String resultMessage;
+
+    protected OperationResult(boolean success, String resultMessage) {
+        this.success = success;
+        this.resultMessage = resultMessage;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public String getResultMessage() {
+        return resultMessage;
+    }
+
+    public static OperationResult failed(String message) {
+        return new OperationResult(false, message);
+    }
+
+    public static OperationResult ok(String message) {
+        return new OperationResult(true, message);
+    }
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/ResponseCodes.java b/common/src/main/java/org/opendaylight/transportpce/common/ResponseCodes.java
new file mode 100644 (file)
index 0000000..435afd3
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright © 2016 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common;
+
+public class ResponseCodes {
+
+    public static final String RESPONSE_FAILED = "500";
+    public static final String RESPONSE_OK = "200";
+    public static final String FINAL_ACK_YES = "Yes";
+    public static final String FINAL_ACK_NO = "No";
+
+    public static final String SUCCESS_RESULT = "Success";
+    public static final String FAILED_RESULT = "Failed";
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java b/common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java
new file mode 100644 (file)
index 0000000..e45d993
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright © 2016 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common;
+
+public class StringConstants {
+
+    public static final String OPENROADM_DEVICE_MODEL_NAME = "org-openroadm-device";
+    public static final String DEFAULT_NETCONF_NODEID = "controller-config";
+
+    private StringConstants() {
+        // hiding the default constructor
+    }
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/Timeouts.java b/common/src/main/java/org/opendaylight/transportpce/common/Timeouts.java
new file mode 100644 (file)
index 0000000..c8051c6
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common;
+
+import java.util.concurrent.TimeUnit;
+
+public final class Timeouts {
+    public static final long DATASTORE_READ = 1000;
+    public static final long DATASTORE_WRITE = 1000;
+    public static final long DATASTORE_DELETE = 1000;
+
+    // TODO remove '* 2' when renderer and olm is running in parallel
+    public static final long RENDERING_TIMEOUT = 240000 * 2;
+    public static final long OLM_TIMEOUT = 240000 * 2;
+
+    public static final long SERVICE_ACTIVATION_TEST_RETRY_TIME = 20000;
+
+    /**
+     * Device read timeout in seconds.
+     */
+    public static final long DEVICE_READ_TIMEOUT = 240;
+    public static final TimeUnit DEVICE_READ_TIMEOUT_UNIT = TimeUnit.SECONDS;
+
+    public static final long DEVICE_WRITE_TIMEOUT = 240;
+    public static final TimeUnit DEVICE_WRITE_TIMEOUT_UNIT = TimeUnit.SECONDS;
+
+    //TODO add timeouts for device setup (olm power setup etc.)
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java
new file mode 100644 (file)
index 0000000..45a2440
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.crossconnect;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.get.connection.port.trail.output.Ports;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
+
+public interface CrossConnect {
+
+    /**
+     * This method return the RoadmConnection subtree for a given connection
+     * number.
+     *
+     * @param deviceId
+     *            Device id.
+     * @param connectionNumber
+     *            Name of the cross connect.
+     *
+     * @return Roadm connection subtree from the device.
+     */
+    Optional<RoadmConnections> getCrossConnect(String deviceId, String connectionNumber);
+
+    /**
+     * This method does a post(edit-config) on roadm connection subtree for a
+     * given connection number.
+     *
+     * @param deviceId
+     *            Device id.
+     * @param waveNumber
+     *            Wavelength number.
+     * @param srcTp
+     *            Name of source termination point.
+     * @param destTp
+     *            Name of destination termination point.
+     * @return optional of connection number
+     */
+    Optional<String> postCrossConnect(String deviceId, Long waveNumber, String srcTp, String destTp);
+
+    /**
+     * This method does a delete(edit-config) on roadm connection subtree for a
+     * given connection number.
+     *
+     * @param deviceId
+     *            Device id.
+     * @param connectionNumber
+     *            Name of the cross connect.
+     *
+     * @return true/false based on status of operation.
+     */
+
+    boolean deleteCrossConnect(String deviceId, String connectionNumber);
+
+    /**
+     * This public method returns the list of ports (port-trail) for a roadm's
+     * cross connect. It calls rpc get-port-trail on device. To be used store
+     * detailed path description.
+     *
+     * @param nodeId
+     *            node-id of NE.
+     * @param waveNumber
+     *            Wavelength number.
+     * @param srcTp
+     *            Source logical connection point.
+     * @param destTp
+     *            Destination logical connection point.
+     *
+     * @return list of Ports object type.
+     */
+    List<Ports> getConnectionPortTrail(String nodeId, Long waveNumber, String srcTp, String destTp)
+            throws OpenRoadmInterfaceException;
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java
new file mode 100644 (file)
index 0000000..b67f76c
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.crossconnect;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.md.sal.binding.api.MountPoint;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.transportpce.common.Timeouts;
+import org.opendaylight.transportpce.common.device.DeviceTransaction;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.connection.DestinationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.connection.SourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.get.connection.port.trail.output.Ports;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CrossConnectImpl implements CrossConnect {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CrossConnectImpl.class);
+
+    private final DeviceTransactionManager deviceTransactionManager;
+
+    public CrossConnectImpl(DeviceTransactionManager deviceTransactionManager) {
+        this.deviceTransactionManager = deviceTransactionManager;
+    }
+
+    @Override
+    public Optional<RoadmConnections> getCrossConnect(String deviceId, String connectionNumber) {
+        return deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL,
+                generateRdmConnectionIID(connectionNumber), Timeouts.DEVICE_READ_TIMEOUT,
+                Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+    }
+
+    @Override
+    public Optional<String> postCrossConnect(String deviceId, Long waveNumber, String srcTp, String destTp) {
+        RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder();
+        String connectionNumber = generateConnectionNumber(srcTp, destTp, waveNumber);
+        rdmConnBldr.setConnectionNumber(connectionNumber);
+        rdmConnBldr.setWavelengthNumber(waveNumber);
+        rdmConnBldr.setOpticalControlMode(OpticalControlMode.Off);
+        rdmConnBldr.setSource(new SourceBuilder().setSrcIf(srcTp + "-" + waveNumber.toString()).build());
+        rdmConnBldr.setDestination(new DestinationBuilder().setDstIf(destTp + "-" + waveNumber.toString()).build());
+        InstanceIdentifier<RoadmConnections> rdmConnectionIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(rdmConnBldr.getConnectionNumber()));
+
+        Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
+        DeviceTransaction deviceTx;
+        try {
+            Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+            if (deviceTxOpt.isPresent()) {
+                deviceTx = deviceTxOpt.get();
+            } else {
+                LOG.error("Device transaction for device {} was not found!", deviceId);
+                return Optional.empty();
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to obtain device transaction for device {}!", deviceId, e);
+            return Optional.empty();
+        }
+
+        // post the cross connect on the device
+        deviceTx.put(LogicalDatastoreType.CONFIGURATION, rdmConnectionIID, rdmConnBldr.build());
+        ListenableFuture<Void> submit =
+                deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            submit.get();
+            LOG.info("Roadm-connection successfully created: {}-{}-{}", srcTp, destTp, waveNumber);
+            return Optional.of(connectionNumber);
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Failed to post {}. Exception: {}", rdmConnBldr.build(), e);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public boolean deleteCrossConnect(String deviceId, String connectionNumber) {
+        //Check if cross connect exists before delete
+        if (!getCrossConnect(deviceId, connectionNumber).isPresent()) {
+            LOG.warn("Cross connect does not exist, halting delete");
+            return false;
+        }
+        Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
+        DeviceTransaction deviceTx;
+        try {
+            Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+            if (deviceTxOpt.isPresent()) {
+                deviceTx = deviceTxOpt.get();
+            } else {
+                LOG.error("Device transaction for device {} was not found!", deviceId);
+                return false;
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to obtain device transaction for device {}!", deviceId, e);
+            return false;
+        }
+
+        // post the cross connect on the device
+        deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateRdmConnectionIID(connectionNumber));
+        ListenableFuture<Void> submit =
+                deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            submit.get();
+            LOG.info("Roadm connection successfully deleted ");
+            return true;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Failed to delete {}", connectionNumber, e);
+        }
+        return false;
+    }
+
+    @Override
+    public List<Ports> getConnectionPortTrail(String nodeId, Long waveNumber, String srcTp, String destTp)
+            throws OpenRoadmInterfaceException {
+        String connectionName = generateConnectionNumber(srcTp, destTp, waveNumber);
+        Optional<MountPoint> mountPointOpt = deviceTransactionManager.getDeviceMountPoint(nodeId);
+        List<Ports> ports = null;
+        MountPoint mountPoint;
+        if (mountPointOpt.isPresent()) {
+            mountPoint = mountPointOpt.get();
+        } else {
+            LOG.error("Failed to obtain mount point for device {}!", nodeId);
+            return Collections.emptyList();
+        }
+        final Optional<RpcConsumerRegistry> service = mountPoint.getService(RpcConsumerRegistry.class).toJavaUtil();
+        if (!service.isPresent()) {
+            LOG.error("Failed to get RpcService for node {}", nodeId);
+        }
+        final OrgOpenroadmDeviceService rpcService = service.get().getRpcService(OrgOpenroadmDeviceService.class);
+        final GetConnectionPortTrailInputBuilder portTrainInputBuilder = new GetConnectionPortTrailInputBuilder();
+        portTrainInputBuilder.setConnectionNumber(connectionName);
+        final Future<RpcResult<GetConnectionPortTrailOutput>> portTrailOutput = rpcService.getConnectionPortTrail(
+            portTrainInputBuilder.build());
+        if (portTrailOutput != null) {
+            try {
+                RpcResult<GetConnectionPortTrailOutput> connectionPortTrailOutputRpcResult = portTrailOutput.get();
+                GetConnectionPortTrailOutput connectionPortTrailOutput = connectionPortTrailOutputRpcResult.getResult();
+                if (connectionPortTrailOutput == null) {
+                    throw new OpenRoadmInterfaceException(String.format("RPC get connection port trail called on"
+                            + " node %s returned null!", nodeId));
+                }
+                LOG.info("Getting port trail for node {}'s connection number {}", nodeId, connectionName);
+                ports = connectionPortTrailOutput.getPorts();
+                for (Ports port : ports) {
+                    LOG.info("{} - Circuit pack {} - Port {}", nodeId, port.getCircuitPackName(), port.getPortName());
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.warn("Exception caught", e);
+            }
+        } else {
+            LOG.warn("Port trail is null in getConnectionPortTrail for nodeId {}", nodeId);
+        }
+        return ports != null ? ports : Collections.emptyList();
+    }
+
+    private InstanceIdentifier<RoadmConnections> generateRdmConnectionIID(String connectionNumber) {
+        return InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+    }
+
+    private String generateConnectionNumber(String srcTp, String destTp, Long waveNumber) {
+        return srcTp + "-" + destTp + "-" + waveNumber;
+    }
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransaction.java b/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransaction.java
new file mode 100644 (file)
index 0000000..45c401d
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.device;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import javax.annotation.Nullable;
+
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents read-write transaction on netconf device.
+ * This transaction can be obtained by {@link DeviceTransactionManager}.
+ *
+ * <p>
+ * WARNING: Only one transaction can be opened at the same time on device!
+ * It's important to close (cancel/submit) transaction when work is done with it
+ * (so others can access the device).
+ * </p>
+ */
+public class DeviceTransaction {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DeviceTransaction.class);
+
+    private final ReadWriteTransaction rwTx;
+    private final CountDownLatch deviceLock;
+    private final ScheduledExecutorService scheduledExecutorService;
+    private final AtomicBoolean wasSubmittedOrCancelled = new AtomicBoolean(false);
+
+    DeviceTransaction(ReadWriteTransaction rwTx, CountDownLatch deviceLock) {
+        this.rwTx = rwTx;
+        this.deviceLock = deviceLock;
+        this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+        LOG.debug("Device transaction created. Lock: {}", deviceLock);
+    }
+
+    public <T extends DataObject> CheckedFuture<Optional<T>, ReadFailedException> read(LogicalDatastoreType store,
+            InstanceIdentifier<T> path) {
+        return rwTx.read(store, path);
+    }
+
+    public <T extends DataObject> void put(LogicalDatastoreType store, InstanceIdentifier<T> path, T data) {
+        rwTx.put(store, path, data);
+    }
+
+    public <T extends DataObject> void put(LogicalDatastoreType store, InstanceIdentifier<T> path, T data,
+            boolean createMissingParents) {
+        rwTx.put(store, path, data, createMissingParents);
+    }
+
+    public <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data) {
+        rwTx.merge(store, path, data);
+    }
+
+    public <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data,
+            boolean createMissingParents) {
+        rwTx.merge(store, path, data, createMissingParents);
+    }
+
+    public void delete(LogicalDatastoreType store, InstanceIdentifier<?> path) {
+        rwTx.delete(store, path);
+    }
+
+    /**
+     * Cancels transaction and unlocks it.
+     * @return true if cancel was successful.
+     */
+    public boolean cancel() {
+        if (wasSubmittedOrCancelled.get()) {
+            LOG.warn("Transaction was already submitted or canceled!");
+            return false;
+        }
+
+        LOG.debug("Transaction cancelled. Lock: {}", deviceLock);
+        wasSubmittedOrCancelled.set(true);
+        afterClose();
+        return rwTx.cancel();
+    }
+
+    /**
+     * Submits data changed in transaction to device with defined timeout to submit. If time from timeout runs out then
+     * submit will be interrupted and device will be unlocked.
+     *
+     * @param timeout a timeout
+     * @param timeUnit a time unit
+     * @return ListenableFuture which indicates when is submit completed.
+     */
+    public ListenableFuture<Void> submit(long timeout, TimeUnit timeUnit) {
+        if (wasSubmittedOrCancelled.get()) {
+            String msg = "Transaction was already submitted or canceled!";
+            LOG.error(msg);
+            return Futures.immediateFailedFuture(new IllegalStateException(msg));
+        }
+
+        LOG.debug("Transaction submitted. Lock: {}", deviceLock);
+        wasSubmittedOrCancelled.set(true);
+        ListenableFuture<Void> future =
+                Futures.withTimeout(rwTx.submit(), timeout, timeUnit, scheduledExecutorService);
+
+        Futures.addCallback(future, new FutureCallback<Void>() {
+            @Override
+            public void onSuccess(@Nullable Void result) {
+                LOG.debug("Transaction with lock {} successfully submitted.", deviceLock);
+                afterClose();
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                LOG.error("Device transaction submit failed or submit took longer than {} {}!"
+                        + " Unlocking device.", timeout, timeUnit, t);
+                afterClose();
+            }
+        }, scheduledExecutorService);
+        return future;
+    }
+
+    /**
+     * Returns state of transaction.
+     * @return true if transaction was closed; otherwise false
+     */
+    public AtomicBoolean wasSubmittedOrCancelled() {
+        return wasSubmittedOrCancelled;
+    }
+
+    private void afterClose() {
+        scheduledExecutorService.shutdown();
+        deviceLock.countDown();
+    }
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManager.java b/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManager.java
new file mode 100644 (file)
index 0000000..2037135
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.device;
+
+import java.util.Optional;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.opendaylight.controller.md.sal.binding.api.MountPoint;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * <p>
+ *     Device transaction manager manages access to netconf devices. Only one transaction can be opened per device so
+ *     it IS IMPORTANT TO CLOSE TRANSACTION as soon as transactions is not needed.
+ * </p>
+ *
+ * <p>
+ *     Most important method is {@link DeviceTransactionManager#getDeviceTransaction(String)}. This method let's you
+ *     obtain {@link DeviceTransaction} on the device. {@link DeviceTransaction} provices methods to read/write data
+ *     from/to device.
+ * </p>
+ *
+ * <p>
+ *     Method
+ *  {@link DeviceTransactionManager#getDataFromDevice(String, LogicalDatastoreType, InstanceIdentifier, long, TimeUnit)}
+ *     is 'shortcut' to get data from device. It creates {@link DeviceTransaction}, gets data via it and then closes
+ *     the transaction.
+ * </p>
+ *
+ * <p>
+ *     Two timeouts are built in process to prevent locking device forever:
+ * </p>
+ * <ul>
+ *     <li>
+ *     First is from creation of {@link DeviceTransaction} to calling method to close it (submit or cancel). When using
+ *     {@link DeviceTransactionManager#getDeviceTransaction(String)} method then default timeout will be used. If there
+ *     is need to specify this timeout manually use
+ *     {@link DeviceTransactionManager#getDeviceTransaction(String, long, TimeUnit)} method. So if programmer will
+ *     forgot to close transaction or it will take too much time transaction will be cancelled automatically and device
+ *     will be unlocked.
+ *     </li>
+ *
+ *     <li>
+ *     Second timeout is from calling {@link DeviceTransaction#submit(long, TimeUnit)} until submit is completed on
+ *     device. Timeout can be specified directly using submit method. So in case submit will freeze somewhere on device
+ *     or it will take too much time device will be unlocked.
+ *     </li>
+ * </ul>
+ *
+ * <p>
+ *     If there is only need to read from device
+ *  {@link DeviceTransactionManager#getDataFromDevice(String, LogicalDatastoreType, InstanceIdentifier, long, TimeUnit)}
+ *     method can be used. It will automatically take care of {@link DeviceTransaction} and it will return data.
+ *     This method <b>SHOULD NOT BE USED TOGETHER WITH DEVICE TRANSACTION ON THE SAME DEVICE IN THE SAME TIME</b>.
+ *     In case that {@link DeviceTransaction} is created on device and before submitting it
+ *  {@link DeviceTransactionManager#getDataFromDevice(String, LogicalDatastoreType, InstanceIdentifier, long, TimeUnit)}
+ *     method is called then get method will wait (will be blocking current thread) until device will be unlocked.
+ *     However device is locked by transaction previously created. So this will result in blocking current thread until
+ *     timeout for submit transaction will run out and cancel transaction. This can lead to incorrect execution of code.
+ * </p>
+ *
+ * <p>
+ * Bellow is simple example how to get {@link DeviceTransaction}, put some data to it and then submit it.
+ * <pre>
+ * {@code
+ *     // get device transaction future from device transaction manager
+ *     Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
+ *     DeviceTransaction deviceTx;
+ *     try {
+ *         // wait until device transaction is available
+ *         Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+ *
+ *         // check if device transaction is present
+ *         if (deviceTxOpt.isPresent()) {
+ *             deviceTx = deviceTxOpt.get();
+ *         } else {
+ *             throw new IllegalStateException("Device transaction for device " + deviceId + " was not found!");
+ *         }
+ *     } catch (InterruptedException | ExecutionException e) {
+ *         throw new IllegalStateException("Unable to obtain device transaction for device " + deviceId + "!", e);
+ *     }
+ *
+ *     // do some operations with transaction
+ *     deviceTx.put(LogicalDatastoreType.CONFIGURATION, someInstanceIdentifier, someData);
+ *     deviceTx.delete(LogicalDatastoreType.CONFIGURATION, someOtherInstanceIdentifier, someOtherData);
+ *
+ *     // submit transaction with 5 seconds timeout
+ *     ListenableFuture<Void> submit = deviceTx.submit(5, TimeUnit.SECONDS);
+ *     try {
+ *         // wait until transaction is submitted
+ *         submit.get();
+ *     } catch (InterruptedException | ExecutionException e) {
+ *         throw new IllegalStateException("Failed to post data to device " + deviceId + "!", e);
+ *     }
+ * }
+ * </pre>
+ * </p>
+ */
+public interface DeviceTransactionManager {
+
+    /**
+     * Gets Future containing {@link DeviceTransaction}. Since only one transaction can be opened per device future will
+     * return transaction when all previously submitted transaction on device are closed. This method will use default
+     * timeout for submit transaction.
+     *
+     * @param deviceId device identifier on which will be transaction created.
+     * @return Future returning Optional of DeviceTransaction. Optional will be empty if device with specified ID
+     *         does not exists or transaction will fail to obtain.
+     */
+    Future<Optional<DeviceTransaction>> getDeviceTransaction(String deviceId);
+
+    /**
+    * Works same as {@link DeviceTransactionManager#getDeviceTransaction(String)} but with option to set custom timeout.
+     *
+     * @param deviceId device id on which will be transaction created.
+     * @param timeoutToSubmit timeout will start running when transaction is created. If transaction will not be
+     *                        closed (submitted or cancelled) when times runs out it will be canceled (so device will
+     *                        be unlocked).
+     * @param timeUnit time units for timeout.
+     * @return Future returning Optional of DeviceTransaction. Optional will be empty if device with specified ID
+     *         does not exists or transaction will fail to obtain.
+     */
+    Future<Optional<DeviceTransaction>> getDeviceTransaction(String deviceId, long timeoutToSubmit, TimeUnit timeUnit);
+
+    // TODO make private in impl
+    @Deprecated
+    Optional<MountPoint> getDeviceMountPoint(String deviceId);
+
+    /**
+     * Returns data from device from specified path. Creates new device transaction, gets data via it and closes
+     * transaction.
+     *
+     * This method is blocking - it's waiting until it receives {@link DeviceTransaction} and then the data from device.
+     *
+     * @param deviceId Device identifier from which will be data read.
+     * @param logicalDatastoreType Datastore type.
+     * @param path Path to data in device's datastore.
+     * @param timeout Timeout to automatically close transaction AND to get data from device (sets both timeouts to
+     *                same value).
+     * @param timeUnit Time unit of timeout.
+     * @param <T> Type of data to be returned.
+     * @return Optional of data obtained from device. If device does not contain data or device does not exists then
+     *         empty Optional will be returned.
+     */
+    <T extends DataObject> Optional<T> getDataFromDevice(String deviceId, LogicalDatastoreType logicalDatastoreType,
+            InstanceIdentifier<T> path, long timeout, TimeUnit timeUnit);
+
+    /**
+     * Checks if device with specified ID is mounted.
+     *
+     * @param deviceId Identifier of device to check.
+     * @return True if device is mounted.
+     */
+    boolean isDeviceMounted(String deviceId);
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerImpl.java
new file mode 100644 (file)
index 0000000..889b479
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.device;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.MountPoint;
+import org.opendaylight.controller.md.sal.binding.api.MountPointService;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
+
+    // TODO cache device data brokers
+    // TODO remove disconnected devices from maps
+
+    private static final Logger LOG = LoggerFactory.getLogger(DeviceTransactionManagerImpl.class);
+    private static final int NUMBER_OF_THREADS = 4;
+    private static final long GET_DATA_SUBMIT_TIMEOUT = 3000;
+    private static final TimeUnit GET_DATA_SUBMIT_TIME_UNIT = TimeUnit.MILLISECONDS;
+
+    private final MountPointService mountPointService;
+    private final ScheduledExecutorService checkingExecutor;
+    private final ListeningExecutorService listeningExecutor;
+    private final ConcurrentMap<String, CountDownLatch> deviceLocks;
+    private final long maxDurationToSubmitTransaction; // TODO set reasonable value in blueprint
+    private final TimeUnit maxDurationToSubmitTransactionTimeUnit = TimeUnit.MILLISECONDS;
+
+    public DeviceTransactionManagerImpl(MountPointService mountPointService, long maxDurationToSubmitTransaction) {
+        this.mountPointService = mountPointService;
+        this.maxDurationToSubmitTransaction = maxDurationToSubmitTransaction;
+        this.deviceLocks = new ConcurrentHashMap<>();
+        this.checkingExecutor = Executors.newScheduledThreadPool(NUMBER_OF_THREADS);
+        this.listeningExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUMBER_OF_THREADS));
+    }
+
+    @Override
+    public Future<Optional<DeviceTransaction>> getDeviceTransaction(String deviceId) {
+        return getDeviceTransaction(deviceId, maxDurationToSubmitTransaction, maxDurationToSubmitTransactionTimeUnit);
+    }
+
+    @Override
+    public Future<Optional<DeviceTransaction>> getDeviceTransaction(String deviceId, long timeoutToSubmit,
+            TimeUnit timeUnit) {
+        CountDownLatch newLock = new CountDownLatch(1);
+        ListenableFuture<Optional<DeviceTransaction>> future = listeningExecutor.submit(() -> {
+            LOG.debug("Starting creation of transaction for device {}.", deviceId);
+            // get current lock from device and set new lock
+            CountDownLatch actualLock = swapActualLock(deviceId, newLock);
+            if (actualLock != null) {
+                // if lock was present on device wait until it unlocks
+                actualLock.await();
+            }
+
+            Optional<DataBroker> deviceDataBrokerOpt = getDeviceDataBroker(deviceId);
+            DataBroker deviceDataBroker;
+            if (deviceDataBrokerOpt.isPresent()) {
+                deviceDataBroker = deviceDataBrokerOpt.get();
+            } else {
+                newLock.countDown();
+                return Optional.empty();
+            }
+            LOG.debug("Created transaction for device {}.", deviceId);
+            return Optional.of(new DeviceTransaction(deviceDataBroker.newReadWriteTransaction(), newLock));
+        });
+
+        Futures.addCallback(future, new FutureCallback<Optional<DeviceTransaction>>() {
+            @Override
+            public void onSuccess(Optional<DeviceTransaction> deviceTransactionOptional) {
+                // creates timeout for transaction to submit right after transaction is created
+                // if time will run out and transaction was not closed then it will be cancelled (and unlocked)
+                checkingExecutor.schedule(() -> {
+                    if (deviceTransactionOptional.isPresent()) {
+                        DeviceTransaction deviceTx = deviceTransactionOptional.get();
+                        LOG.debug("Timeout to submit transaction run out! Transaction was {} submitted or canceled.",
+                                deviceTx.wasSubmittedOrCancelled().get() ? "" : "not");
+                        if (!deviceTx.wasSubmittedOrCancelled().get()) {
+                            LOG.error(String.format("Transaction for node %s was not submitted or canceled after %s"
+                                            + " milliseconds! Cancelling transaction!", deviceId,
+                                    timeoutToSubmit));
+                            deviceTx.cancel();
+                        }
+                    }
+                }, timeoutToSubmit, timeUnit);
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                LOG.error("Exception thrown while getting device transaction for device {}! Unlocking device.",
+                        deviceId, t);
+                newLock.countDown();
+            }
+        }, checkingExecutor);
+
+        return future;
+    }
+
+    private synchronized CountDownLatch swapActualLock(String deviceId, CountDownLatch newLock) {
+        return deviceLocks.put(deviceId, newLock);
+    }
+
+    private Optional<DataBroker> getDeviceDataBroker(String deviceId) {
+        Optional<MountPoint> netconfNode = getDeviceMountPoint(deviceId);
+        if (netconfNode.isPresent()) {
+            return netconfNode.get().getService(DataBroker.class).toJavaUtil();
+        } else {
+            LOG.error("Device mount point not found for : {}", deviceId);
+            return Optional.empty();
+        }
+    }
+
+    @Override
+    public Optional<MountPoint> getDeviceMountPoint(String deviceId) {
+        InstanceIdentifier<Node> netconfNodeIID = InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class,
+                new NodeKey(new NodeId(deviceId)));
+        return mountPointService.getMountPoint(netconfNodeIID).toJavaUtil();
+    }
+
+    @Override
+    public <T extends DataObject> Optional<T> getDataFromDevice(String deviceId,
+            LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<T> path, long timeout, TimeUnit timeUnit) {
+        Optional<DeviceTransaction> deviceTxOpt;
+        try {
+            deviceTxOpt = getDeviceTransaction(deviceId, timeout, timeUnit).get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Exception thrown while getting transaction for device {}!", deviceId, e);
+            return Optional.empty();
+        }
+        if (deviceTxOpt.isPresent()) {
+            DeviceTransaction deviceTx = deviceTxOpt.get();
+            try {
+                return deviceTx.read(logicalDatastoreType, path).get(timeout, timeUnit).toJavaUtil();
+            } catch (InterruptedException | ExecutionException | TimeoutException e) {
+                LOG.error("Exception thrown while reading data from device {}! IID: {}", deviceId, path, e);
+            } finally {
+                deviceTx.submit(GET_DATA_SUBMIT_TIMEOUT, GET_DATA_SUBMIT_TIME_UNIT);
+            }
+        } else {
+            LOG.error("Could not obtain transaction for device {}!", deviceId);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public boolean isDeviceMounted(String deviceId) {
+        return getDeviceDataBroker(deviceId).isPresent();
+    }
+
+    public void preDestroy() {
+        checkingExecutor.shutdown();
+        listeningExecutor.shutdown();
+    }
+
+    public long getMaxDurationToSubmitTransaction() {
+        return maxDurationToSubmitTransaction;
+    }
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java
new file mode 100644 (file)
index 0000000..5ddbe01
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.mapping;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.Mapping;
+
+public interface PortMapping {
+
+    /**
+     * This method creates logical to physical port mapping for a given device.
+     * Instead of parsing all the circuit packs/ports in the device this methods
+     * does a selective read operation on degree/srg subtree to get circuit
+     * packs/ports that map to :
+     *
+     * <p>
+     * 1. DEGn-TTP-TX, DEGn-TTP-RX, DEGn-TTP-TXRX
+     *
+     * <p>
+     * 2. SRGn-PPp-TX, SRGn-PPp-RX, SRGn-PPp-TXRX
+     *
+     * <p>
+     * 3. LINEn
+     *
+     * <p>
+     * 4. CLNTn.
+     *
+     * <p>
+     * If the port is Mw it also store the OMS, OTS interface provisioned on the
+     * port. It skips the logical ports that are internal. If operation is
+     * successful the mapping gets stored in datastore corresponding to
+     * portmapping.yang data model.
+     *
+     * @return true/false based on status of operation
+     */
+    boolean createMappingData(String nodeId);
+
+    /**
+     * This method for a given node's termination point returns the Mapping object based on
+     * portmapping.yang model stored in the MD-SAL data store which is created when the node is
+     * connected for the first time. The mapping object basically contains the following attributes of
+     * interest:
+     *
+     * <p>
+     * 1. Supporting circuit pack
+     *
+     * <p>
+     * 2. Supporting port
+     *
+     * <p>
+     * 3. Supporting OMS interface (if port on ROADM) 4. Supporting OTS interface (if port on ROADM)
+     *
+     * @param nodeId Unique Identifier for the node of interest.
+     * @param logicalConnPoint Name of the logical point
+     *
+     * @return Result Mapping object if success otherwise null.
+     */
+
+    Mapping getMapping(String nodeId, String logicalConnPoint);
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java
new file mode 100644 (file)
index 0000000..e8e9e10
--- /dev/null
@@ -0,0 +1,525 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.mapping;
+
+import com.google.common.util.concurrent.CheckedFuture;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.transportpce.common.Timeouts;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.CircuitPack;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.ConnectionPorts;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Degree;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.DegreeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroupKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.port.Interfaces;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.InterfaceType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OpenROADMOpticalMultiplex;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OpticalTransport;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.NodesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.CpToDegree;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.CpToDegreeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.CpToDegreeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.Mapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.MappingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.MappingKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PortMappingImpl implements PortMapping {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
+
+    private final DataBroker dataBroker;
+    private final DeviceTransactionManager deviceTransactionManager;
+    private final OpenRoadmInterfaces openRoadmInterfaces;
+
+    public PortMappingImpl(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager,
+            OpenRoadmInterfaces openRoadmInterfaces) {
+        this.dataBroker = dataBroker;
+        this.deviceTransactionManager = deviceTransactionManager;
+        this.openRoadmInterfaces = openRoadmInterfaces;
+    }
+
+    @Override
+    public boolean createMappingData(String nodeId) {
+
+        LOG.info("Create Mapping Data for node {}", nodeId);
+        List<Mapping> portMapList = new ArrayList<>();
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        Optional<Info> deviceInfoOptional =
+                deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, infoIID,
+                        Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+
+        Info deviceInfo;
+        if (deviceInfoOptional.isPresent()) {
+            deviceInfo = deviceInfoOptional.get();
+        } else {
+            LOG.warn("Device info subtree is absent for {}", nodeId);
+            return false;
+        }
+        if (deviceInfo.getNodeType() == null) {
+            LOG.warn("Node type field is missing"); // TODO make mandatory in yang
+            return false;
+        }
+        switch (deviceInfo.getNodeType()) {
+
+            case Rdm:
+                // Get TTP port mapping
+                if (!createTtpPortMapping(nodeId, deviceInfo, portMapList)) {
+                    // return false if mapping creation for TTP's failed
+                    LOG.warn("Unable to create mapping for TTP's on node {}", nodeId);
+                    return false;
+                }
+
+                // Get PP port mapping
+                if (!createPpPortMapping(nodeId, deviceInfo, portMapList)) {
+                    // return false if mapping creation for PP's failed
+                    LOG.warn("Unable to create mapping for PP's on node {}", nodeId);
+                    return false;
+                }
+                break;
+            case Xpdr:
+                if (!createXpdrPortMapping(nodeId, portMapList)) {
+                    LOG.warn("Unable to create mapping for Xponder on node {}", nodeId);
+                    return false;
+                }
+                break;
+            default:
+                LOG.error("Unable to create mapping for node {} : unknown nodetype ", nodeId);
+                break;
+
+        }
+        return postPortMapping(deviceInfo, portMapList, deviceInfo.getNodeType().getIntValue(), null);
+    }
+
+    /**
+     * This private method gets the list of external ports on a degree. For each port in the degree, it
+     * does a get on port subtree with circuit-pack-name/port-name as key in order to get the logical
+     * connection point name corresponding to it.
+     *
+     * @param deviceInfo Info subtree read from the device
+     * @param portMapList Reference to the list containing the mapping to be pushed to MD-SAL
+     *
+     * @return true/false based on status of operation
+     */
+    private boolean createTtpPortMapping(String nodeId, Info deviceInfo, List<Mapping> portMapList) {
+        // Creating mapping data for degree TTP's
+
+        List<Degree> degrees = getDegrees(nodeId, deviceInfo);
+        List<ConnectionPorts> degreeConPorts = getDegreePorts(degrees);
+        List<CpToDegree> cpToDegreeList = getCpToDegreeList(degrees);
+
+        postPortMapping(deviceInfo, null, deviceInfo.getNodeType().getIntValue(), cpToDegreeList);
+
+        // Getting circuit-pack-name/port-name corresponding to TTP's
+        for (ConnectionPorts cp : degreeConPorts) {
+            String circuitPackName = cp.getCircuitPackName();
+            String portName = cp.getPortName().toString();
+            InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                    .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+                    .child(Ports.class, new PortsKey(portName));
+
+            LOG.info("Fetching logical Connection Point value for port {} at circuit pack {}", portName,
+                    circuitPackName);
+            Optional<Ports> portObject =
+                    deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, portIID,
+                            Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+            if (portObject.isPresent()) {
+                Ports port = portObject.get();
+                if (port.getLogicalConnectionPoint() != null) {
+                    LOG.info("Logical Connection Point for {} {} is {}", circuitPackName, portName,
+                            port.getLogicalConnectionPoint());
+                    portMapList.add(createMappingObject(nodeId, port, circuitPackName,
+                            port.getLogicalConnectionPoint()));
+                } else {
+                    LOG.warn("Logical Connection Point value is missing for {} {}", circuitPackName,
+                            port.getPortName());
+                }
+            } else {
+                LOG.warn("Port {} is not present in node {} in circuit pack {}!", portName, nodeId, circuitPackName);
+                continue; // TODO continue or return true?
+            }
+        }
+        return true;
+    }
+
+    private List<Degree> getDegrees(String deviceId, Info ordmInfo) {
+        List<Degree> degrees = new ArrayList<>();
+        Integer maxDegree;
+
+        // Get value for max degree from info subtree, required for iteration
+        // if not present assume to be 20 (temporary)
+        if (ordmInfo.getMaxDegrees() != null) {
+            maxDegree = ordmInfo.getMaxDegrees();
+        } else {
+            maxDegree = 20;
+        }
+
+        for (int degreeCounter = 1; degreeCounter <= maxDegree; degreeCounter++) {
+            LOG.info("Getting Connection ports for Degree Number {}", degreeCounter);
+            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                    .child(Degree.class, new DegreeKey(degreeCounter));
+            Optional<Degree> ordmDegreeObject =
+                    deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.CONFIGURATION, deviceIID,
+                            Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+            if (ordmDegreeObject.isPresent()) {
+                degrees.add(ordmDegreeObject.get());
+            } else {
+                LOG.info("Device has {} degree", degreeCounter - 1);
+                break;
+            }
+        }
+        return degrees;
+    }
+
+    /**
+     * This private method gets the list of circuit packs on an Srg. For each circuit pack on an Srg, it
+     * does a get on circuit-pack subtree with circuit-pack-name as key in order to get the list of
+     * ports. It then iterates over the list of ports to get ports with port-qual as roadm-external. It
+     * appends a TX,RX,TXRX to the logical connection point name based on the direction of the port.
+     *
+     * @param nodeId Id of device
+     * @param deviceInfo Info subtree read from the device
+     * @param portMapList Reference to the list containing the mapping to be pushed to MD-SAL
+     *
+     * @return true/false based on status of operation
+     */
+
+    private boolean createPpPortMapping(String nodeId, Info deviceInfo, List<Mapping> portMapList) {
+        // Creating mapping data for degree PP's
+        List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks> srgCps =
+                getSrgCps(nodeId, deviceInfo);
+
+        for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks cps : srgCps) {
+            String circuitPackName = cps.getCircuitPackName();
+            InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                    .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+            Optional<CircuitPacks> circuitPackObject =
+                    deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, cpIID,
+                            Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+
+            if (!circuitPackObject.isPresent() || circuitPackObject.get().getPorts() == null) {
+                LOG.warn("Circuit pack was not found or ports are mission for name: {}", circuitPackName);
+                continue; // TODO continue or return false?
+            }
+            CircuitPacks cp = circuitPackObject.get();
+            for (Ports port : cp.getPorts()) {
+                if (port.getLogicalConnectionPoint() != null) {
+                    String logicalConnectionPoint = getLogicalConnectionPort(port);
+                    LOG.info("Logical Connection Point for {} {} is {}", circuitPackName, port.getPortName(),
+                            logicalConnectionPoint);
+                    portMapList.add(createMappingObject(nodeId, port, circuitPackName, logicalConnectionPoint));
+                } else if (Port.PortQual.RoadmInternal.equals(port.getPortQual())) {
+                    LOG.info("Port is internal, skipping Logical Connection Point missing for {} {}", circuitPackName,
+                            port.getPortName());
+                } else if (port.getLogicalConnectionPoint() == null) {
+                    LOG.info("Value missing, Skipping Logical Connection Point missing for {} {}", circuitPackName,
+                            port.getPortName());
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * This method does a get operation on shared risk group subtree of the
+     * netconf device's config datastore and returns a list of all circuit packs
+     * objects that are part of srgs. It is required to do a selective get on
+     * all the circuit packs that contain add/drop ports of interest.
+     *
+     * @param deviceId Device id
+     * @param ordmInfo Info subtree from the device
+     * @return List of circuit packs object belonging to- shared risk group subtree
+     */
+    private List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks> getSrgCps(
+            String deviceId, Info ordmInfo) {
+
+        List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks> srgCps =
+                new ArrayList<>();
+        Integer maxSrg;
+        // Get value for max Srg from info subtree, required for iteration
+        // if not present assume to be 20 (temporary)
+        if (ordmInfo.getMaxSrgs() != null) {
+            maxSrg = ordmInfo.getMaxSrgs();
+        } else {
+            maxSrg = 20;
+        }
+
+        for (int srgCounter = 1; srgCounter <= maxSrg; srgCounter++) {
+            LOG.info("Getting Circuitpacks for Srg Number {}", srgCounter);
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                    .child(SharedRiskGroup.class, new SharedRiskGroupKey(srgCounter));
+            Optional<SharedRiskGroup> ordmSrgObject =
+                    deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.CONFIGURATION, srgIID,
+                            Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+
+            if (ordmSrgObject.isPresent()) {
+                srgCps.addAll(ordmSrgObject.get().getCircuitPacks());
+            } else {
+                LOG.info("Device has {} Srg", srgCounter - 1);
+                break;
+            }
+        }
+        return srgCps;
+    }
+
+    /**
+     * This private method gets the list of circuit packs on a xponder. For each circuit pack on a
+     * Xponder, it does a get on circuit-pack subtree with circuit-pack-name as key in order to get the
+     * list of ports. It then iterates over the list of ports to get ports with port-qual as
+     * xpdr-network/xpdr-client. The line and client ports are saved as:
+     *
+     * <p>
+     * 1. LINEn
+     *
+     * <p>
+     * 2. CLNTn
+     *
+     * @param nodeId Id of device
+     * @param portMapList Reference to the list containing the mapping to be pushed to MD-SAL
+     *
+     * @return true/false based on status of operation
+     */
+    private boolean createXpdrPortMapping(String nodeId, List<Mapping> portMapList) {
+        // Creating for Xponder Line and Client Ports
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        Optional<OrgOpenroadmDevice> deviceObject =
+                deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
+                        Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+
+        // Variable to keep track of number of line ports
+        int line = 1;
+        // Variable to keep track of number of client ports
+        int client = 1;
+        if (!deviceObject.isPresent() || deviceObject.get().getCircuitPacks() == null) {
+            LOG.warn("Circuit Packs are not present for {}", nodeId);
+            return false; // TODO return false or continue?
+        }
+
+        List<CircuitPacks> circuitPackList = deviceObject.get().getCircuitPacks();
+        circuitPackList.sort(Comparator.comparing(CircuitPack::getCircuitPackName));
+
+        for (CircuitPacks cp : circuitPackList) {
+            String circuitPackName = cp.getCircuitPackName();
+            if (cp.getPorts() == null) {
+                LOG.warn("Ports were not found for circuit pack: {}", circuitPackName);
+                continue;
+            }
+            for (Ports port : cp.getPorts()) {
+                if (Port.PortQual.XpdrNetwork.equals(port.getPortQual())) {
+                    portMapList.add(createMappingObject(nodeId, port, circuitPackName,
+                            OpenRoadmInterfacesImpl.NETWORK_TOKEN + line));
+                    line++;
+                } else if (Port.PortQual.XpdrClient.equals(port.getPortQual())) {
+                    portMapList.add(createMappingObject(nodeId, port, circuitPackName,
+                            OpenRoadmInterfacesImpl.CLIENT_TOKEN + client));
+                    client++;
+                } else {
+                    LOG.warn("Not supported type of port! Port type: {}", port.getPortQual());
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * This private method builds the mapping object to be pushed in MD-SAL in order to save port
+     * mapping. In case of TTP ports, it also saves the OTS,OMS interfaces provisioned on the port.
+     *
+     * @param port Reference to device's port subtree object.
+     * @param circuitPackName Name of cp where port exists.
+     * @param logicalConnectionPoint logical name of the port.
+     *
+     * @return true/false based on status of operation
+     */
+
+    private Mapping createMappingObject(String nodeId, Ports port, String circuitPackName,
+            String logicalConnectionPoint) {
+        MappingBuilder mpBldr = new MappingBuilder();
+        mpBldr.setKey(new MappingKey(logicalConnectionPoint)).setLogicalConnectionPoint(logicalConnectionPoint)
+                .setSupportingCircuitPackName(circuitPackName).setSupportingPort(port.getPortName());
+
+        // Get OMS and OTS interface provisioned on the TTP's
+        if (logicalConnectionPoint.contains(OpenRoadmInterfacesImpl.TTP_TOKEN) && port.getInterfaces() != null) {
+            for (Interfaces interfaces : port.getInterfaces()) {
+                try {
+                    Optional<Interface> openRoadmInterface =
+                            openRoadmInterfaces.getInterface(nodeId, interfaces.getInterfaceName());
+                    if (openRoadmInterface.isPresent()) {
+                        Class<? extends InterfaceType> interfaceType = openRoadmInterface.get().getType();
+                        // Check if interface type is OMS or OTS
+                        if (interfaceType.equals(OpenROADMOpticalMultiplex.class)) {
+                            mpBldr.setSupportingOms(interfaces.getInterfaceName());
+                        }
+                        if (interfaceType.equals(OpticalTransport.class)) {
+                            mpBldr.setSupportingOts(interfaces.getInterfaceName());
+                        }
+                    } else {
+                        LOG.warn("Interface {} from node {} was null!", interfaces.getInterfaceName(), nodeId);
+                    }
+                } catch (OpenRoadmInterfaceException ex) {
+                    LOG.warn("Error while getting interface {} from node {}!", interfaces.getInterfaceName(), nodeId,
+                            ex);
+                }
+            }
+        }
+        return mpBldr.build();
+    }
+
+    private static CpToDegree createCpToDegreeObject(String circuitPackName, String degreeNumber) {
+        return new CpToDegreeBuilder().setKey(new CpToDegreeKey(circuitPackName)).setCircuitPackName(circuitPackName)
+                .setDegreeNumber(new Long(degreeNumber)).build();
+    }
+
+    private static List<ConnectionPorts> getDegreePorts(List<Degree> degrees) {
+        return degrees.stream().filter(degree -> degree.getConnectionPorts() != null)
+                .flatMap(degree -> degree.getConnectionPorts().stream()).collect(Collectors.toList());
+    }
+
+    private List<CpToDegree> getCpToDegreeList(List<Degree> degrees) {
+        List<CpToDegree> cpToDegreeList = new ArrayList<>();
+        for (Degree degree : degrees) {
+            if (degree.getCircuitPacks() != null) {
+                cpToDegreeList.addAll(degree.getCircuitPacks().stream()
+                        .map(cp -> createCpToDegreeObject(cp.getCircuitPackName(), degree.getDegreeNumber().toString()))
+                        .collect(Collectors.toList()));
+            }
+        }
+        return cpToDegreeList;
+    }
+
+    /**
+     * This method for ports the portMapping corresponding to the portmapping.yang file to the MD-SAL
+     * datastore.
+     *
+     * <p>
+     * 1. Supporting circuit pack 2. Supporting port 3. Supporting OMS interface (if port on ROADM)
+     *
+     * @param deviceInfo Info subtree from the device.
+     * @param portMapList Reference to the list containing the mapping to be pushed to MD-SAL.
+     *
+     * @return Result true/false based on status of operation.
+     */
+    private boolean postPortMapping(Info deviceInfo, List<Mapping> portMapList, Integer nodeType,
+            List<CpToDegree> cp2DegreeList) {
+        NodesBuilder nodesBldr = new NodesBuilder();
+        nodesBldr.setKey(new NodesKey(deviceInfo.getNodeId())).setNodeId(deviceInfo.getNodeId());
+        nodesBldr.setNodeType(NodeTypes.forValue(nodeType));
+
+        if (portMapList != null) {
+            nodesBldr.setMapping(portMapList);
+        }
+        if (cp2DegreeList != null) {
+            nodesBldr.setCpToDegree(cp2DegreeList);
+        }
+
+        List<Nodes> nodesList = new ArrayList<>();
+        nodesList.add(nodesBldr.build());
+
+        NetworkBuilder nwBldr = new NetworkBuilder();
+        nwBldr.setNodes(nodesList);
+
+        final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+        InstanceIdentifier<Network> nodesIID = InstanceIdentifier.builder(Network.class).build();
+        Network network = nwBldr.build();
+        writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, nodesIID, network);
+        CheckedFuture<Void, TransactionCommitFailedException> submit = writeTransaction.submit();
+        try {
+            submit.checkedGet();
+            return true;
+
+        } catch (TransactionCommitFailedException e) {
+            LOG.warn("Failed to post {}", network, e);
+            return false;
+        }
+    }
+
+    @Override
+    public Mapping getMapping(String nodeId, String logicalConnPoint) {
+
+        /*
+         * Getting physical mapping corresponding to logical connection point
+         */
+        InstanceIdentifier<Mapping> portMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
+            new NodesKey(nodeId)).child(Mapping.class, new MappingKey(logicalConnPoint)).build();
+        try (ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction()) {
+            Optional<Mapping> mapObject =
+                    readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get().toJavaUtil();
+            if (mapObject.isPresent()) {
+                Mapping mapping = mapObject.get();
+                LOG.info("Found mapping for the logical port {}. Mapping: {}", logicalConnPoint, mapping.toString());
+                return mapping;
+            } else {
+                LOG.warn("Could not find mapping for logical connection point {} for nodeId {}", logicalConnPoint,
+                        nodeId);
+            }
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.error("Unable to read mapping for logical connection point : {} for nodeId {}", logicalConnPoint,
+                    nodeId, ex);
+        }
+        return null;
+    }
+
+    private static String getLogicalConnectionPort(Ports port) {
+        if (port.getLogicalConnectionPoint() != null) {
+            switch (port.getPortDirection()) {
+                case Tx:
+                    // Port direction is transmit
+                    return port.getLogicalConnectionPoint() + "-TX";
+                case Rx:
+                    // Port direction is receive
+                    return port.getLogicalConnectionPoint() + "-RX";
+                case Bidirectional:
+                    // port is bi-directional
+                    if (port.getLogicalConnectionPoint().endsWith("-TXRX")) {
+                        return port.getLogicalConnectionPoint();
+                    }
+                    return port.getLogicalConnectionPoint() + "-TXRX";
+                default:
+                    // Unsupported Port direction
+                    LOG.error("Unsupported port direction for port {} - {}", port, port.getPortDirection());
+                    return ""; // TODO return false or continue?
+            }
+        }
+        LOG.warn("Unsupported port direction for port {} - {} - LogicalConnectionPoint is null",
+            port, port.getPortDirection());
+        return ""; // TODO return false or continue?
+    }
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaceException.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaceException.java
new file mode 100644 (file)
index 0000000..200c272
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.openroadminterfaces;
+
+public class OpenRoadmInterfaceException extends Exception {
+
+    public OpenRoadmInterfaceException(String message) {
+        super(message);
+    }
+
+    public OpenRoadmInterfaceException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaces.java
new file mode 100644 (file)
index 0000000..b553a42
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.openroadminterfaces;
+
+import java.util.Optional;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
+
+public interface OpenRoadmInterfaces {
+
+    /**
+     * This methods does an edit-config operation on the openROADM device in order
+     * to create the given interface.
+     *
+     * <p>
+     * Before posting the interface it checks if:
+     * 1. Interface with same name does not exist
+     * 2. If exists then admin state of interface is outOfState/Maintenance
+     * </p>
+     *
+     * @param ifBuilder Builder object containing the data to post.
+     *
+     */
+    void postInterface(String nodeId, InterfaceBuilder ifBuilder) throws OpenRoadmInterfaceException;
+
+    /**
+     * This private does a get on the interface subtree of the device with the
+     * interface name as the key and return the class corresponding to the interface
+     * type.
+     *
+     * @param interfaceName
+     *            Name of the interface
+     *
+     * @return Optional of Interface from datastore
+     */
+    Optional<Interface> getInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException;
+
+    /**
+     * This methods does an edit-config operation on the openROADM device in order
+     * to delete the given interface.
+     *
+     * <p>
+     * Before deleting the method:
+     * 1. Checks if interface exists
+     * 2. If exists then changes the state of interface to outOfService
+     * </p>
+     *
+     * @param interfaceName
+     *            Name of the interface to delete.
+     */
+    void deleteInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException;
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java
new file mode 100644 (file)
index 0000000..e8bff8f
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.openroadminterfaces;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.Timeouts;
+import org.opendaylight.transportpce.common.device.DeviceTransaction;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOdu;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOtu;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.loopback.rev161014.maint.loopback.MaintLoopbackBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.testsignal.rev161014.maint.testsignal.MaintTestsignalBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.odu.container.OduBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.otu.container.OtuBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OpenRoadmInterfacesImpl implements OpenRoadmInterfaces {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterfacesImpl.class);
+
+    // TODO move somewhere to constants
+    public static final String NETWORK_TOKEN = "XPDR1-NETWORK";
+    public static final String TTP_TOKEN = "TTP";
+    public static final String CLIENT_TOKEN = "XPDR1-CLIENT";
+    public static final String PP_TOKEN = "PP";
+
+    private final DeviceTransactionManager deviceTransactionManager;
+
+    public OpenRoadmInterfacesImpl(DeviceTransactionManager deviceTransactionManager) {
+        this.deviceTransactionManager = deviceTransactionManager;
+    }
+
+    @Override
+    public void postInterface(String nodeId, InterfaceBuilder ifBuilder) throws OpenRoadmInterfaceException {
+        Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
+        DeviceTransaction deviceTx;
+        try {
+            Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+            if (deviceTxOpt.isPresent()) {
+                deviceTx = deviceTxOpt.get();
+            } else {
+                throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
+                        nodeId));
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            throw new OpenRoadmInterfaceException(String.format("Failed to obtain device transaction for node %s!",
+                    nodeId), e);
+        }
+
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(ifBuilder.getName()));
+        deviceTx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build());
+        ListenableFuture<Void> txSubmitFuture = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT,
+                Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            txSubmitFuture.get();
+            LOG.info("Successfully posted interface {} on node {}", ifBuilder.getName(), nodeId);
+        } catch (InterruptedException | ExecutionException e) {
+            throw new OpenRoadmInterfaceException(String.format("Failed to post interface %s on node %s!",
+                    ifBuilder.getName(), nodeId), e);
+        }
+    }
+
+    @Override
+    public Optional<Interface> getInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException {
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(interfaceName));
+        return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, interfacesIID,
+                Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+    }
+
+    @Override
+    public void deleteInterface(String nodeId, String interfaceName)
+            throws OpenRoadmInterfaceException {
+        Optional<Interface> intf2DeleteOpt;
+        try {
+            intf2DeleteOpt = getInterface(nodeId, interfaceName);
+        } catch (OpenRoadmInterfaceException e) {
+            throw new OpenRoadmInterfaceException(String.format("Failed to check if interface %s exists on node %s!",
+                    interfaceName, nodeId), e);
+        }
+        if (intf2DeleteOpt.isPresent()) {
+            Interface intf2Delete = intf2DeleteOpt.get();
+            // State admin state to out of service
+            InterfaceBuilder ifBuilder = new InterfaceBuilder(intf2Delete);
+            if (ifBuilder.getType() == OtnOdu.class) {
+                Interface1Builder oduBuilder = new Interface1Builder(intf2Delete.getAugmentation(Interface1.class));
+                OduBuilder odu = new OduBuilder(oduBuilder.getOdu());
+                if (odu.getMaintTestsignal() != null) {
+                    MaintTestsignalBuilder maintSignalBuilder =
+                            new MaintTestsignalBuilder();
+                    maintSignalBuilder.setEnabled(false);
+                    odu.setMaintTestsignal(maintSignalBuilder.build());
+                }
+                oduBuilder.setOdu(odu.build());
+                ifBuilder.addAugmentation(Interface1.class, oduBuilder.build());
+            } else if (ifBuilder.getType() == OtnOtu.class) {
+                org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu
+                    .interfaces.rev161014.Interface1Builder otuBuilder =
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu
+                    .interfaces.rev161014.Interface1Builder(intf2Delete
+                            .getAugmentation(org.opendaylight.yang.gen.v1
+                                    .http.org.openroadm.otn.otu.interfaces.rev161014.Interface1.class));
+                OtuBuilder otu = new OtuBuilder(otuBuilder.getOtu());
+                if (otu.getMaintLoopback() != null) {
+                    MaintLoopbackBuilder maintLoopBackBuilder =
+                            new MaintLoopbackBuilder();
+                    maintLoopBackBuilder.setEnabled(false);
+                    otu.setMaintLoopback(maintLoopBackBuilder.build());
+                }
+                otuBuilder.setOtu(otu.build());
+                ifBuilder.addAugmentation(org.opendaylight.yang.gen
+                        .v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1.class, otuBuilder.build());
+            }
+            ifBuilder.setAdministrativeState(AdminStates.OutOfService);
+            // post interface with updated admin state
+            try {
+                postInterface(nodeId, ifBuilder);
+            } catch (OpenRoadmInterfaceException ex) {
+                throw new OpenRoadmInterfaceException(String.format("Failed to set state of interface %s to %s while"
+                        + " deleting it!", interfaceName, AdminStates.OutOfService), ex);
+            }
+
+            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                    .child(Interface.class, new InterfaceKey(interfaceName));
+            Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
+            DeviceTransaction deviceTx;
+            try {
+                Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+                if (deviceTxOpt.isPresent()) {
+                    deviceTx = deviceTxOpt.get();
+                } else {
+                    throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
+                            nodeId));
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                throw new OpenRoadmInterfaceException(String.format("Failed to obtain device transaction for node %s!",
+                        nodeId), e);
+            }
+
+            deviceTx.delete(LogicalDatastoreType.CONFIGURATION, interfacesIID);
+            ListenableFuture<Void> submit = deviceTx.submit(
+                    Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+
+            try {
+                submit.get();
+                LOG.info("Successfully deleted {} on node {}", interfaceName, nodeId);
+            } catch (InterruptedException | ExecutionException e) {
+                throw new OpenRoadmInterfaceException(String.format("Failed to delete interface %s on "
+                        + "node %s", interfaceName, nodeId), e);
+            }
+        } else {
+            LOG.info("Interface does not exist, cannot delete on node {}", nodeId);
+        }
+    }
+
+
+}
diff --git a/common/src/main/resources/org/opendaylight/blueprint/common-blueprint.xml b/common/src/main/resources/org/opendaylight/blueprint/common-blueprint.xml
new file mode 100644 (file)
index 0000000..bf4bcc9
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+Copyright © 2016 Orange and others. All rights reserved.
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+  xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+  odl:use-default-for-reference-types="true">
+
+    <reference id="mountPointService" interface="org.opendaylight.controller.md.sal.binding.api.MountPointService" />
+    <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" odl:type="default" />
+
+    <bean id="deviceTransactionManager" class="org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl"
+          destroy-method="preDestroy" >
+        <argument ref="mountPointService" />
+        <argument value="15000" />
+    </bean>
+
+    <bean id="openRoadmInterfaces" class="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl" >
+        <argument ref="deviceTransactionManager" />
+    </bean>
+
+    <bean id="portMapping" class="org.opendaylight.transportpce.common.mapping.PortMappingImpl" >
+        <argument ref="dataBroker" />
+        <argument ref="deviceTransactionManager" />
+        <argument ref="openRoadmInterfaces" />
+    </bean>
+
+    <bean id="crossConnect" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl" >
+        <argument ref="deviceTransactionManager" />
+    </bean>
+
+    <service ref="deviceTransactionManager" interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
+
+    <service ref="openRoadmInterfaces" interface="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces" />
+
+    <service ref="portMapping" interface="org.opendaylight.transportpce.common.mapping.PortMapping" />
+
+    <service ref="crossConnect" interface="org.opendaylight.transportpce.common.crossconnect.CrossConnect" />
+
+</blueprint>
diff --git a/common/src/test/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerTest.java b/common/src/test/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerTest.java
new file mode 100644 (file)
index 0000000..1815c18
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.device;
+
+import static org.mockito.Matchers.any;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.MountPoint;
+import org.opendaylight.controller.md.sal.binding.api.MountPointService;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class DeviceTransactionManagerTest {
+
+    @Mock private MountPointService mountPointServiceMock;
+    @Mock private MountPoint mountPointMock;
+    @Mock private DataBroker dataBrokerMock;
+    @Mock private ReadWriteTransaction rwTransactionMock;
+
+    private DeviceTransactionManagerImpl transactionManager;
+    private String defaultDeviceId = "device-id";
+    private LogicalDatastoreType defaultDatastore = LogicalDatastoreType.OPERATIONAL;
+    private InstanceIdentifier<Network> defaultIid = InstanceIdentifier.create(Network.class);
+    private Network defaultData = new NetworkBuilder().build();
+    private long defaultTimeout = 1000;
+    private TimeUnit defaultTimeUnit = TimeUnit.MILLISECONDS;
+
+    @Before
+    public void before() {
+        Mockito.when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
+        Mockito.when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
+        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
+        Mockito.when(rwTransactionMock.submit()).thenReturn(Futures.immediateCheckedFuture(null));
+
+        this.transactionManager = new DeviceTransactionManagerImpl(mountPointServiceMock, 3000);
+    }
+
+    @After
+    public void after() {
+        transactionManager.preDestroy();
+    }
+
+    @Test
+    public void basicPositiveTransactionTest() {
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).put(defaultDatastore, defaultIid, defaultData);
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).submit();
+    }
+
+    @Test
+    public void advancedPositiveTransactionTest() {
+        try {
+            Future<java.util.Optional<DeviceTransaction>> firstDeviceTxFuture =
+                    transactionManager.getDeviceTransaction(defaultDeviceId);
+            DeviceTransaction firstDeviceTx = firstDeviceTxFuture.get().get();
+
+            Future<java.util.Optional<DeviceTransaction>> secondDeviceTxFuture =
+                    transactionManager.getDeviceTransaction(defaultDeviceId);
+            Assert.assertFalse(secondDeviceTxFuture.isDone());
+
+            Future<java.util.Optional<DeviceTransaction>> thirdDeviceTxFuture =
+                    transactionManager.getDeviceTransaction(defaultDeviceId);
+            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+
+            Future<java.util.Optional<DeviceTransaction>> anotherDeviceTxFuture =
+                    transactionManager.getDeviceTransaction("another-id");
+
+            firstDeviceTx.put(defaultDatastore, defaultIid, defaultData);
+            Assert.assertFalse(secondDeviceTxFuture.isDone());
+            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            Thread.sleep(200);
+            Assert.assertFalse(secondDeviceTxFuture.isDone());
+            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+
+            Assert.assertTrue(anotherDeviceTxFuture.isDone());
+            anotherDeviceTxFuture.get().get().submit(defaultTimeout, defaultTimeUnit);
+
+            firstDeviceTx.submit(defaultTimeout, defaultTimeUnit);
+            Thread.sleep(200);
+            Assert.assertTrue(secondDeviceTxFuture.isDone());
+            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+
+            DeviceTransaction secondDeviceTx = secondDeviceTxFuture.get().get();
+            secondDeviceTx.put(defaultDatastore, defaultIid, defaultData);
+            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+
+            secondDeviceTx.submit(defaultTimeout, defaultTimeUnit);
+            Thread.sleep(200);
+            Assert.assertTrue(thirdDeviceTxFuture.isDone());
+
+            DeviceTransaction thirdDeviceTx = thirdDeviceTxFuture.get().get();
+            thirdDeviceTx.put(defaultDatastore, defaultIid, defaultData);
+            thirdDeviceTx.submit(defaultTimeout, defaultTimeUnit);
+
+            Mockito.verify(rwTransactionMock, Mockito.times(3)).put(defaultDatastore, defaultIid, defaultData);
+            Mockito.verify(rwTransactionMock, Mockito.times(4)).submit();
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+    }
+
+    @Test
+    public void bigAmountOfTransactionsOnSameDeviceTest() {
+        int numberOfTxs = 100;
+        List<Future<java.util.Optional<DeviceTransaction>>> deviceTransactionFutures = new LinkedList<>();
+        List<DeviceTransaction> deviceTransactions = new LinkedList<>();
+
+        for (int i = 0; i < numberOfTxs; i++) {
+            deviceTransactionFutures.add(transactionManager.getDeviceTransaction(defaultDeviceId));
+        }
+
+        try {
+            for (Future<java.util.Optional<DeviceTransaction>> futureTx : deviceTransactionFutures) {
+                DeviceTransaction deviceTx = futureTx.get().get();
+                deviceTx.submit(defaultTimeout, defaultTimeUnit);
+                deviceTransactions.add(deviceTx);
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+
+        for (DeviceTransaction deviceTx : deviceTransactions) {
+            Assert.assertTrue(deviceTx.wasSubmittedOrCancelled().get());
+        }
+    }
+
+    @Test
+    public void bigAmountOfTransactionsOnDifferentDevicesTest() {
+        int numberOfTxs = 1000;
+        List<DeviceTransaction> deviceTransactions = new LinkedList<>();
+
+        try {
+            for (int i = 0; i < numberOfTxs; i++) {
+                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get().get());
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+
+        deviceTransactions.parallelStream()
+                .forEach(deviceTransaction -> deviceTransaction.submit(defaultTimeout, defaultTimeUnit));
+
+        deviceTransactions.parallelStream()
+                .forEach(deviceTransaction -> Assert.assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
+    }
+
+    @Test
+    public void bigAmountOfTransactionsOnDifferentDevicesWithoutSubmitTest() {
+        int numberOfTxs = 1000;
+        List<DeviceTransaction> deviceTransactions = new LinkedList<>();
+
+        try {
+            for (int i = 0; i < numberOfTxs; i++) {
+                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get().get());
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+
+        try {
+            Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
+        } catch (InterruptedException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+        deviceTransactions.parallelStream()
+                .forEach(deviceTransaction -> Assert.assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
+    }
+
+    @Test
+    public void notSubmittedTransactionTest() {
+        Future<java.util.Optional<DeviceTransaction>> deviceTxFuture =
+                transactionManager.getDeviceTransaction(defaultDeviceId);
+        try {
+            deviceTxFuture.get();
+            Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).cancel();
+
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).cancel();
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).put(defaultDatastore, defaultIid, defaultData);
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).submit();
+    }
+
+    @Test
+    public void dataBrokerTimeoutTransactionTest() {
+        Mockito.when(dataBrokerMock.newReadWriteTransaction()).then(invocation -> {
+            Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
+            return rwTransactionMock;
+        });
+
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).submit();
+
+        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock); // remove sleep
+
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(2)).put(defaultDatastore, defaultIid, defaultData);
+        Mockito.verify(rwTransactionMock, Mockito.times(2)).submit();
+    }
+
+    @Test
+    public void getFutureTimeoutTransactionTest() {
+        Mockito.when(dataBrokerMock.newReadWriteTransaction()).then(invocation -> {
+            Thread.sleep(3000);
+            return rwTransactionMock;
+        });
+
+        Exception throwedException = null;
+
+        Future<java.util.Optional<DeviceTransaction>> deviceTxFuture =
+                transactionManager.getDeviceTransaction(defaultDeviceId);
+        try {
+            deviceTxFuture.get(1000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+        } catch (TimeoutException e) {
+            throwedException = e;
+        }
+
+        if (throwedException == null) {
+            Assert.fail("TimeoutException should be thrown!");
+            return;
+        }
+
+        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock); // remove sleep
+
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).put(defaultDatastore, defaultIid, defaultData);
+        Mockito.verify(rwTransactionMock, Mockito.times(1)).submit();
+    }
+
+    @Test
+    public void submitTxTimeoutTransactionTest() {
+        ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
+        Mockito.when(rwTransactionMock.submit()).then(invocation -> Futures.makeChecked(executor.submit(() -> {
+            try {
+                Thread.sleep(3000);
+            } catch (InterruptedException e) {
+                Assert.fail("Exception catched in future! " + e);
+            }
+            return null;
+        }), input -> input));
+
+        Future<java.util.Optional<DeviceTransaction>> deviceTxFuture =
+                transactionManager.getDeviceTransaction(defaultDeviceId);
+        DeviceTransaction deviceTx;
+        try {
+            deviceTx = deviceTxFuture.get().get();
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        deviceTx.put(defaultDatastore, defaultIid, defaultData);
+
+        Exception throwedException = null;
+
+        ListenableFuture<Void> submitFuture = deviceTx.submit(200, defaultTimeUnit);
+        try {
+            submitFuture.get();
+        } catch (InterruptedException e) {
+            Assert.fail("Exception catched! " + e);
+        } catch (ExecutionException e) {
+            throwedException = e;
+        }
+
+        if (throwedException == null
+                || !throwedException.getMessage().contains(TimeoutException.class.getName())) {
+            Assert.fail("TimeoutException inside of should be thrown!");
+            return;
+        }
+
+
+        Mockito.when(rwTransactionMock.submit()).thenReturn(Futures.immediateCheckedFuture(null));
+
+        try {
+            putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
+        } catch (InterruptedException | ExecutionException e) {
+            Assert.fail("Exception catched! " + e);
+            return;
+        }
+
+        Mockito.verify(rwTransactionMock, Mockito.times(2)).put(defaultDatastore, defaultIid, defaultData);
+        Mockito.verify(rwTransactionMock, Mockito.times(2)).submit();
+
+        executor.shutdown();
+    }
+
+    private <T extends DataObject> void putAndSubmit(DeviceTransactionManagerImpl deviceTxManager, String deviceId,
+            LogicalDatastoreType store, InstanceIdentifier<T> path, T data)
+            throws ExecutionException, InterruptedException {
+        Future<java.util.Optional<DeviceTransaction>> deviceTxFuture = deviceTxManager.getDeviceTransaction(deviceId);
+        DeviceTransaction deviceTx = deviceTxFuture.get().get();
+        deviceTx.put(store, path, data);
+        deviceTx.submit(defaultTimeout, defaultTimeUnit);
+    }
+}
diff --git a/common/src/test/java/org/opendaylight/transportpce/common/test/TransportPCETest.java b/common/src/test/java/org/opendaylight/transportpce/common/test/TransportPCETest.java
new file mode 100644 (file)
index 0000000..ee2f9e7
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright © 2016 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common.test;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TransportPCETest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TransportPCETest.class);
+
+    @Ignore
+    @Test
+    public void test() {
+        LOG.info("test");
+    }
+
+}
diff --git a/common/src/test/resources/sample-config-ROADM.xml b/common/src/test/resources/sample-config-ROADM.xml
new file mode 100644 (file)
index 0000000..349685b
--- /dev/null
@@ -0,0 +1,5430 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+  <org-openroadm-device xmlns="http://org/openroadm/device">
+    <info>
+      <node-id>ROADMA</node-id>
+      <node-number>2</node-number>
+      <node-type>rdm</node-type>
+      <clli>NodeA</clli>
+      <vendor>vendorA</vendor>
+      <model>2</model>
+      <serial-id>0002</serial-id>
+      <ipAddress>127.0.0.11</ipAddress>
+      <prefix-length>28</prefix-length>
+      <defaultGateway>127.0.0.20</defaultGateway>
+      <source>static</source>
+      <current-ipAddress>127.0.0.11</current-ipAddress>
+      <current-prefix-length>28</current-prefix-length>
+      <current-defaultGateway>127.0.0.20</current-defaultGateway>
+      <macAddress>bb:bb:bb:bb:bb:bb</macAddress>
+      <softwareVersion>1</softwareVersion>
+      <max-degrees>2</max-degrees>
+      <max-srgs>9</max-srgs>
+    </info>
+    <users>
+      <user>
+        <name>openroadm</name>
+        <password>openroadm</password>
+        <group>sudo</group>
+      </user>
+    </users>
+    <pending-sw>
+      <sw-version>1</sw-version>
+    </pending-sw>
+    <shelves>
+      <shelf-name>sdegE</shelf-name>
+      <shelf-type>pizza</shelf-type>
+      <rack>XYZ</rack>
+      <shelf-position>2</shelf-position>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>1</model>
+      <serial-id>00002</serial-id>
+      <product-code>xxxxx</product-code>
+      <clei>degE</clei>
+      <hardware-version>01</hardware-version>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <due-date>2016-10-25T09:00:00-00:00</due-date>
+      <slots>
+        <slot-name>0</slot-name>
+        <label>0</label>
+        <provisioned-circuit-pack>2/0</provisioned-circuit-pack>
+      </slots>
+    </shelves>
+    <shelves>
+      <shelf-name>sdegW</shelf-name>
+      <shelf-type>pizza</shelf-type>
+      <rack>XYZ</rack>
+      <shelf-position>3</shelf-position>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>1</model>
+      <serial-id>00003</serial-id>
+      <product-code>xxxxx</product-code>
+      <clei>degW</clei>
+      <hardware-version>01</hardware-version>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <due-date>2016-10-25T09:00:00-00:00</due-date>
+      <slots>
+        <slot-name>0</slot-name>
+        <label>0</label>
+        <provisioned-circuit-pack>3/0</provisioned-circuit-pack>
+      </slots>
+    </shelves>
+        <shelves>
+      <shelf-name>ssrg</shelf-name>
+      <shelf-type>pizza</shelf-type>
+      <rack>XYZ</rack>
+      <shelf-position>4</shelf-position>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>1</model>
+      <serial-id>00004</serial-id>
+      <product-code>xxxxx</product-code>
+      <clei>srgW</clei>
+      <hardware-version>01</hardware-version>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <due-date>2016-10-25T09:00:00-00:00</due-date>
+      <slots>
+        <slot-name>0</slot-name>
+        <label>0</label>
+        <provisioned-circuit-pack>4/0</provisioned-circuit-pack>
+      </slots>
+    </shelves>
+    <circuit-packs>
+      <circuit-pack-name>2/0</circuit-pack-name>
+      <circuit-pack-type>WSSDEG</circuit-pack-type>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>WSS9</model>
+      <manufacture-date>2017-08-08T10:47:04.698808+00:00</manufacture-date>
+      <clei>wss1</clei>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>2</shelf>
+      <slot>0</slot>
+      <subSlot>0</subSlot>
+      <cp-slots>
+        <slot-name>OSC-SLOT</slot-name>
+        <label>OSC-SLOT</label>
+        <provisioned-circuit-pack>2/0/OSC-PLUG</provisioned-circuit-pack>
+      </cp-slots>
+      <ports>
+        <port-name>C1</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C2</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C3</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C4</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C5</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C6</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C7</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C8</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C9</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>L1</port-name>
+        <port-type>LINE</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG1-TTP-TXRX</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-35.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-9.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>14.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>21.82</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>LOG1</port-name>
+        <port-type>Logical</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+      <ports>
+        <port-name>OSC-DEMUX</port-name>
+        <port-type>OSC</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>2/0/OSC-PLUG</circuit-pack-name>
+      <circuit-pack-type>port</circuit-pack-type>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>SFP/SFP+</model>
+      <serial-id>00000163600843</serial-id>
+      <product-code>oooooo</product-code>
+      <manufacture-date>2017-08-08T10:47:04.698808+00:00</manufacture-date>
+      <clei>oscplug</clei>
+      <hardware-version>01</hardware-version>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>2</shelf>
+      <slot>0</slot>
+      <subSlot>0</subSlot>
+      <parent-circuit-pack>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <cp-slot-name>OSC-SLOT</cp-slot-name>
+      </parent-circuit-pack>
+      <ports>
+        <port-name>OSC-PORT</port-name>
+        <port-type>1GEX</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>3/0</circuit-pack-name>
+      <circuit-pack-type>WSSDEG</circuit-pack-type>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>WSS9</model>
+      <manufacture-date>2017-08-08T10:47:04.698808+00:00</manufacture-date>
+      <clei>wss2</clei>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>3</shelf>
+      <slot>0</slot>
+      <subSlot>0</subSlot>
+      <cp-slots>
+        <slot-name>OSC-SLOT</slot-name>
+        <label>OSC-SLOT</label>
+        <provisioned-circuit-pack>3/0/OSC-PLUG</provisioned-circuit-pack>
+      </cp-slots>
+      <ports>
+        <port-name>C1</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C2</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C3</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C4</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C5</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C6</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C7</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C8</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>C9</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-CTP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>L1</port-name>
+        <port-type>LINE</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <circuit-id>1</circuit-id>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>DEG2-TTP-TXRX</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-35.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-9.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>14.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>21.82</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>LOG1</port-name>
+        <port-type>Logical</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+      <ports>
+        <port-name>OSC-DEMUX</port-name>
+        <port-type>OSC</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>3/0/OSC-PLUG</circuit-pack-name>
+      <circuit-pack-type>port</circuit-pack-type>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>SFP/SFP+</model>
+      <serial-id>00000163600843</serial-id>
+      <product-code>oooooo</product-code>
+      <manufacture-date>2017-08-08T10:47:04.698808+00:00</manufacture-date>
+      <clei>oscplug</clei>
+      <hardware-version>01</hardware-version>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>3</shelf>
+      <slot>0</slot>
+      <subSlot>0</subSlot>
+      <parent-circuit-pack>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <cp-slot-name>OSC-SLOT</cp-slot-name>
+      </parent-circuit-pack>
+      <ports>
+        <port-name>OSC-PORT</port-name>
+        <port-type>1GEX</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+      </ports>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>4/0</circuit-pack-name>
+      <circuit-pack-type>ADDDROP</circuit-pack-type>
+      <administrative-state>inService</administrative-state>
+      <vendor>vendorA</vendor>
+      <model>16CX4D</model>
+      <clei>cccccccc</clei>
+      <operational-state>inService</operational-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>4</shelf>
+      <slot>0</slot>
+      <subSlot>0</subSlot>
+      <ports>
+        <port-name>C1</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP1</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C10</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP10</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C11</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP11</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C12</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP12</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C13</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP13</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C14</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP14</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C15</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP15</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C16</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP16</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C2</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP2</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C3</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP3</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C4</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP4</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C5</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP5</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C6</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP6</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C7</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP7</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C8</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP8</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>C9</port-name>
+        <port-type>Client</port-type>
+        <port-qual>roadm-external</port-qual>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-PP9</logical-connection-point>
+        <roadm-port>
+          <port-power-capability-min-rx>-15.0</port-power-capability-min-rx>
+          <port-power-capability-min-tx>-28.0</port-power-capability-min-tx>
+          <port-power-capability-max-rx>10.0</port-power-capability-max-rx>
+          <port-power-capability-max-tx>15.0</port-power-capability-max-tx>
+          <!-- <capable-wavelengths>1</capable-wavelengths>
+          <capable-wavelengths>2</capable-wavelengths>
+          <capable-wavelengths>3</capable-wavelengths>
+          <capable-wavelengths>4</capable-wavelengths>
+          <capable-wavelengths>5</capable-wavelengths>
+          <capable-wavelengths>6</capable-wavelengths>
+          <capable-wavelengths>7</capable-wavelengths>
+          <capable-wavelengths>8</capable-wavelengths>
+          <capable-wavelengths>9</capable-wavelengths>
+          <capable-wavelengths>10</capable-wavelengths>
+          <capable-wavelengths>11</capable-wavelengths>
+          <capable-wavelengths>12</capable-wavelengths>
+          <capable-wavelengths>13</capable-wavelengths>
+          <capable-wavelengths>14</capable-wavelengths>
+          <capable-wavelengths>15</capable-wavelengths>
+          <capable-wavelengths>16</capable-wavelengths>
+          <capable-wavelengths>17</capable-wavelengths>
+          <capable-wavelengths>18</capable-wavelengths>
+          <capable-wavelengths>19</capable-wavelengths>
+          <capable-wavelengths>20</capable-wavelengths>
+          <capable-wavelengths>21</capable-wavelengths>
+          <capable-wavelengths>22</capable-wavelengths>
+          <capable-wavelengths>23</capable-wavelengths>
+          <capable-wavelengths>24</capable-wavelengths>
+          <capable-wavelengths>25</capable-wavelengths>
+          <capable-wavelengths>26</capable-wavelengths>
+          <capable-wavelengths>27</capable-wavelengths>
+          <capable-wavelengths>28</capable-wavelengths>
+          <capable-wavelengths>29</capable-wavelengths>
+          <capable-wavelengths>30</capable-wavelengths>
+          <capable-wavelengths>31</capable-wavelengths>
+          <capable-wavelengths>32</capable-wavelengths>
+          <capable-wavelengths>33</capable-wavelengths>
+          <capable-wavelengths>34</capable-wavelengths>
+          <capable-wavelengths>35</capable-wavelengths>
+          <capable-wavelengths>36</capable-wavelengths>
+          <capable-wavelengths>37</capable-wavelengths>
+          <capable-wavelengths>38</capable-wavelengths>
+          <capable-wavelengths>39</capable-wavelengths>
+          <capable-wavelengths>40</capable-wavelengths>
+          <capable-wavelengths>41</capable-wavelengths>
+          <capable-wavelengths>42</capable-wavelengths>
+          <capable-wavelengths>43</capable-wavelengths>
+          <capable-wavelengths>44</capable-wavelengths>
+          <capable-wavelengths>45</capable-wavelengths>
+          <capable-wavelengths>46</capable-wavelengths>
+          <capable-wavelengths>47</capable-wavelengths>
+          <capable-wavelengths>48</capable-wavelengths>
+          <capable-wavelengths>49</capable-wavelengths>
+          <capable-wavelengths>50</capable-wavelengths>
+          <capable-wavelengths>51</capable-wavelengths>
+          <capable-wavelengths>52</capable-wavelengths>
+          <capable-wavelengths>53</capable-wavelengths>
+          <capable-wavelengths>54</capable-wavelengths>
+          <capable-wavelengths>55</capable-wavelengths>
+          <capable-wavelengths>56</capable-wavelengths>
+          <capable-wavelengths>57</capable-wavelengths>
+          <capable-wavelengths>58</capable-wavelengths>
+          <capable-wavelengths>59</capable-wavelengths>
+          <capable-wavelengths>60</capable-wavelengths>
+          <capable-wavelengths>61</capable-wavelengths>
+          <capable-wavelengths>62</capable-wavelengths>
+          <capable-wavelengths>63</capable-wavelengths>
+          <capable-wavelengths>64</capable-wavelengths>
+          <capable-wavelengths>65</capable-wavelengths>
+          <capable-wavelengths>66</capable-wavelengths>
+          <capable-wavelengths>67</capable-wavelengths>
+          <capable-wavelengths>68</capable-wavelengths>
+          <capable-wavelengths>69</capable-wavelengths>
+          <capable-wavelengths>70</capable-wavelengths>
+          <capable-wavelengths>71</capable-wavelengths>
+          <capable-wavelengths>72</capable-wavelengths>
+          <capable-wavelengths>73</capable-wavelengths>
+          <capable-wavelengths>74</capable-wavelengths>
+          <capable-wavelengths>75</capable-wavelengths>
+          <capable-wavelengths>76</capable-wavelengths>
+          <capable-wavelengths>77</capable-wavelengths>
+          <capable-wavelengths>78</capable-wavelengths>
+          <capable-wavelengths>79</capable-wavelengths>
+          <capable-wavelengths>80</capable-wavelengths>
+          <capable-wavelengths>81</capable-wavelengths>
+          <capable-wavelengths>82</capable-wavelengths>
+          <capable-wavelengths>83</capable-wavelengths>
+          <capable-wavelengths>84</capable-wavelengths>
+          <capable-wavelengths>85</capable-wavelengths>
+          <capable-wavelengths>86</capable-wavelengths>
+          <capable-wavelengths>87</capable-wavelengths>
+          <capable-wavelengths>88</capable-wavelengths>
+          <capable-wavelengths>89</capable-wavelengths>
+          <capable-wavelengths>90</capable-wavelengths>
+          <capable-wavelengths>91</capable-wavelengths>
+          <capable-wavelengths>92</capable-wavelengths>
+          <capable-wavelengths>93</capable-wavelengths>
+          <capable-wavelengths>94</capable-wavelengths>
+          <capable-wavelengths>95</capable-wavelengths>
+          <capable-wavelengths>96</capable-wavelengths> -->
+        </roadm-port>
+      </ports>
+      <ports>
+        <port-name>AD-DEG1</port-name>
+        <port-type>Edge</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-CP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>AD-DEG2</port-name>
+        <port-type>Edge</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-CP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>AD-DEG3</port-name>
+        <port-type>Edge</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-CP-TXRX</logical-connection-point>
+      </ports>
+      <ports>
+        <port-name>AD-DEG4</port-name>
+        <port-type>Edge</port-type>
+        <port-qual>roadm-internal</port-qual>
+        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-direction>bidirectional</port-direction>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <logical-connection-point>SRG1-CP-TXRX</logical-connection-point>
+      </ports>
+    </circuit-packs>
+    <interface>
+      <name>oms-2/0/0/L1</name>
+      <type xmlns:openROADM-if="http://org/openroadm/interfaces">openROADM-if:openROADMOpticalMultiplex</type>
+      <administrative-state>inService</administrative-state>
+      <operational-state>inService</operational-state>
+      <supporting-interface>ots-2/0/0/L1</supporting-interface>
+      <supporting-circuit-pack-name>2/0</supporting-circuit-pack-name>
+      <supporting-port>L1</supporting-port>
+    </interface>
+    <interface>
+      <name>oms-3/0/0/L1</name>
+      <type xmlns:openROADM-if="http://org/openroadm/interfaces">openROADM-if:openROADMOpticalMultiplex</type>
+      <administrative-state>inService</administrative-state>
+      <operational-state>inService</operational-state>
+      <circuit-id>Link-1</circuit-id>
+      <supporting-interface>ots-3/0/0/L1</supporting-interface>
+      <supporting-circuit-pack-name>3/0</supporting-circuit-pack-name>
+      <supporting-port>L1</supporting-port>
+    </interface>
+    <interface>
+      <name>ots-2/0/0/L1</name>
+      <type xmlns:openROADM-if="http://org/openroadm/interfaces">openROADM-if:opticalTransport</type>
+      <administrative-state>inService</administrative-state>
+      <operational-state>inService</operational-state>
+      <supporting-circuit-pack-name>2/0</supporting-circuit-pack-name>
+      <supporting-port>L1</supporting-port>
+      <ots xmlns="http://org/openroadm/optical-transport-interfaces">
+        <fiber-type>smf</fiber-type>
+        <span-loss-receive>15</span-loss-receive>
+        <span-loss-transmit>15</span-loss-transmit>
+      </ots>
+    </interface>
+    <interface>
+      <name>ots-3/0/0/L1</name>
+      <type xmlns:openROADM-if="http://org/openroadm/interfaces">openROADM-if:opticalTransport</type>
+      <administrative-state>inService</administrative-state>
+      <operational-state>inService</operational-state>
+      <supporting-circuit-pack-name>3/0</supporting-circuit-pack-name>
+      <supporting-port>L1</supporting-port>
+      <ots xmlns="http://org/openroadm/optical-transport-interfaces">
+        <fiber-type>smf</fiber-type>
+        <span-loss-receive>10.0</span-loss-receive>
+        <span-loss-transmit>10.0</span-loss-transmit>
+      </ots>
+    </interface>
+    <wavelength-map>
+      <wavelengths>
+        <wavelength-number>1</wavelength-number>
+        <center-frequency>196.1</center-frequency>
+        <wavelength>1528.77</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>2</wavelength-number>
+        <center-frequency>196.05</center-frequency>
+        <wavelength>1529.16</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>3</wavelength-number>
+        <center-frequency>196.0</center-frequency>
+        <wavelength>1529.55</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>4</wavelength-number>
+        <center-frequency>195.95</center-frequency>
+        <wavelength>1529.94</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>5</wavelength-number>
+        <center-frequency>195.9</center-frequency>
+        <wavelength>1530.33</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>6</wavelength-number>
+        <center-frequency>195.85</center-frequency>
+        <wavelength>1530.72</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>7</wavelength-number>
+        <center-frequency>195.8</center-frequency>
+        <wavelength>1531.11</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>8</wavelength-number>
+        <center-frequency>195.75</center-frequency>
+        <wavelength>1531.5</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>9</wavelength-number>
+        <center-frequency>195.7</center-frequency>
+        <wavelength>1531.89</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>10</wavelength-number>
+        <center-frequency>195.65</center-frequency>
+        <wavelength>1532.28</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>11</wavelength-number>
+        <center-frequency>195.6</center-frequency>
+        <wavelength>1532.67</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>12</wavelength-number>
+        <center-frequency>195.55</center-frequency>
+        <wavelength>1533.06</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>13</wavelength-number>
+        <center-frequency>195.5</center-frequency>
+        <wavelength>1533.45</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>14</wavelength-number>
+        <center-frequency>195.45</center-frequency>
+        <wavelength>1533.84</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>15</wavelength-number>
+        <center-frequency>195.4</center-frequency>
+        <wavelength>1534.23</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>16</wavelength-number>
+        <center-frequency>195.35</center-frequency>
+        <wavelength>1534.62</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>17</wavelength-number>
+        <center-frequency>195.3</center-frequency>
+        <wavelength>1535.01</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>18</wavelength-number>
+        <center-frequency>195.25</center-frequency>
+        <wavelength>1535.4</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>19</wavelength-number>
+        <center-frequency>195.2</center-frequency>
+        <wavelength>1535.79</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>20</wavelength-number>
+        <center-frequency>195.15</center-frequency>
+        <wavelength>1536.18</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>21</wavelength-number>
+        <center-frequency>195.1</center-frequency>
+        <wavelength>1536.57</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>22</wavelength-number>
+        <center-frequency>195.05</center-frequency>
+        <wavelength>1536.96</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>23</wavelength-number>
+        <center-frequency>195.0</center-frequency>
+        <wavelength>1537.35</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>24</wavelength-number>
+        <center-frequency>194.95</center-frequency>
+        <wavelength>1537.74</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>25</wavelength-number>
+        <center-frequency>194.9</center-frequency>
+        <wavelength>1538.13</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>26</wavelength-number>
+        <center-frequency>194.85</center-frequency>
+        <wavelength>1538.52</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>27</wavelength-number>
+        <center-frequency>194.8</center-frequency>
+        <wavelength>1538.91</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>28</wavelength-number>
+        <center-frequency>194.75</center-frequency>
+        <wavelength>1539.3</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>29</wavelength-number>
+        <center-frequency>194.7</center-frequency>
+        <wavelength>1539.69</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>30</wavelength-number>
+        <center-frequency>194.65</center-frequency>
+        <wavelength>1540.08</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>31</wavelength-number>
+        <center-frequency>194.6</center-frequency>
+        <wavelength>1540.47</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>32</wavelength-number>
+        <center-frequency>194.55</center-frequency>
+        <wavelength>1540.86</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>33</wavelength-number>
+        <center-frequency>194.5</center-frequency>
+        <wavelength>1541.25</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>34</wavelength-number>
+        <center-frequency>194.45</center-frequency>
+        <wavelength>1541.64</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>35</wavelength-number>
+        <center-frequency>194.4</center-frequency>
+        <wavelength>1542.03</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>36</wavelength-number>
+        <center-frequency>194.35</center-frequency>
+        <wavelength>1542.42</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>37</wavelength-number>
+        <center-frequency>194.3</center-frequency>
+        <wavelength>1542.81</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>38</wavelength-number>
+        <center-frequency>194.25</center-frequency>
+        <wavelength>1543.2</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>39</wavelength-number>
+        <center-frequency>194.2</center-frequency>
+        <wavelength>1543.59</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>40</wavelength-number>
+        <center-frequency>194.15</center-frequency>
+        <wavelength>1543.98</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>41</wavelength-number>
+        <center-frequency>194.1</center-frequency>
+        <wavelength>1544.37</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>42</wavelength-number>
+        <center-frequency>194.05</center-frequency>
+        <wavelength>1544.76</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>43</wavelength-number>
+        <center-frequency>194.0</center-frequency>
+        <wavelength>1545.15</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>44</wavelength-number>
+        <center-frequency>193.95</center-frequency>
+        <wavelength>1545.54</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>45</wavelength-number>
+        <center-frequency>193.9</center-frequency>
+        <wavelength>1545.93</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>46</wavelength-number>
+        <center-frequency>193.85</center-frequency>
+        <wavelength>1546.32</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>47</wavelength-number>
+        <center-frequency>193.8</center-frequency>
+        <wavelength>1546.71</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>48</wavelength-number>
+        <center-frequency>193.75</center-frequency>
+        <wavelength>1547.1</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>49</wavelength-number>
+        <center-frequency>193.7</center-frequency>
+        <wavelength>1547.49</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>50</wavelength-number>
+        <center-frequency>193.65</center-frequency>
+        <wavelength>1547.88</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>51</wavelength-number>
+        <center-frequency>193.6</center-frequency>
+        <wavelength>1548.27</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>52</wavelength-number>
+        <center-frequency>193.55</center-frequency>
+        <wavelength>1548.66</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>53</wavelength-number>
+        <center-frequency>193.5</center-frequency>
+        <wavelength>1549.05</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>54</wavelength-number>
+        <center-frequency>193.45</center-frequency>
+        <wavelength>1549.44</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>55</wavelength-number>
+        <center-frequency>193.4</center-frequency>
+        <wavelength>1549.83</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>56</wavelength-number>
+        <center-frequency>193.35</center-frequency>
+        <wavelength>1550.22</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>57</wavelength-number>
+        <center-frequency>193.3</center-frequency>
+        <wavelength>1550.61</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>58</wavelength-number>
+        <center-frequency>193.25</center-frequency>
+        <wavelength>1551.0</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>59</wavelength-number>
+        <center-frequency>193.2</center-frequency>
+        <wavelength>1551.39</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>60</wavelength-number>
+        <center-frequency>193.15</center-frequency>
+        <wavelength>1551.78</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>61</wavelength-number>
+        <center-frequency>193.1</center-frequency>
+        <wavelength>1552.17</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>62</wavelength-number>
+        <center-frequency>193.05</center-frequency>
+        <wavelength>1552.56</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>63</wavelength-number>
+        <center-frequency>193.0</center-frequency>
+        <wavelength>1552.95</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>64</wavelength-number>
+        <center-frequency>192.95</center-frequency>
+        <wavelength>1553.34</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>65</wavelength-number>
+        <center-frequency>192.9</center-frequency>
+        <wavelength>1553.73</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>66</wavelength-number>
+        <center-frequency>192.85</center-frequency>
+        <wavelength>1554.12</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>67</wavelength-number>
+        <center-frequency>192.8</center-frequency>
+        <wavelength>1554.51</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>68</wavelength-number>
+        <center-frequency>192.75</center-frequency>
+        <wavelength>1554.9</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>69</wavelength-number>
+        <center-frequency>192.7</center-frequency>
+        <wavelength>1555.29</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>70</wavelength-number>
+        <center-frequency>192.65</center-frequency>
+        <wavelength>1555.68</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>71</wavelength-number>
+        <center-frequency>192.6</center-frequency>
+        <wavelength>1556.07</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>72</wavelength-number>
+        <center-frequency>192.55</center-frequency>
+        <wavelength>1556.46</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>73</wavelength-number>
+        <center-frequency>192.5</center-frequency>
+        <wavelength>1556.85</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>74</wavelength-number>
+        <center-frequency>192.45</center-frequency>
+        <wavelength>1557.24</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>75</wavelength-number>
+        <center-frequency>192.4</center-frequency>
+        <wavelength>1557.63</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>76</wavelength-number>
+        <center-frequency>192.35</center-frequency>
+        <wavelength>1558.02</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>77</wavelength-number>
+        <center-frequency>192.3</center-frequency>
+        <wavelength>1558.41</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>78</wavelength-number>
+        <center-frequency>192.25</center-frequency>
+        <wavelength>1558.8</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>79</wavelength-number>
+        <center-frequency>192.2</center-frequency>
+        <wavelength>1559.19</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>80</wavelength-number>
+        <center-frequency>192.15</center-frequency>
+        <wavelength>1559.58</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>81</wavelength-number>
+        <center-frequency>192.1</center-frequency>
+        <wavelength>1559.97</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>82</wavelength-number>
+        <center-frequency>192.05</center-frequency>
+        <wavelength>1560.36</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>83</wavelength-number>
+        <center-frequency>192.0</center-frequency>
+        <wavelength>1560.75</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>84</wavelength-number>
+        <center-frequency>191.95</center-frequency>
+        <wavelength>1561.14</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>85</wavelength-number>
+        <center-frequency>191.9</center-frequency>
+        <wavelength>1561.53</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>86</wavelength-number>
+        <center-frequency>191.85</center-frequency>
+        <wavelength>1561.92</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>87</wavelength-number>
+        <center-frequency>191.8</center-frequency>
+        <wavelength>1562.31</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>88</wavelength-number>
+        <center-frequency>191.75</center-frequency>
+        <wavelength>1562.7</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>89</wavelength-number>
+        <center-frequency>191.7</center-frequency>
+        <wavelength>1563.09</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>90</wavelength-number>
+        <center-frequency>191.65</center-frequency>
+        <wavelength>1563.48</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>91</wavelength-number>
+        <center-frequency>191.6</center-frequency>
+        <wavelength>1563.87</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>92</wavelength-number>
+        <center-frequency>191.55</center-frequency>
+        <wavelength>1564.26</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>93</wavelength-number>
+        <center-frequency>191.5</center-frequency>
+        <wavelength>1564.65</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>94</wavelength-number>
+        <center-frequency>191.45</center-frequency>
+        <wavelength>1565.04</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>95</wavelength-number>
+        <center-frequency>191.4</center-frequency>
+        <wavelength>1565.43</wavelength>
+      </wavelengths>
+      <wavelengths>
+        <wavelength-number>96</wavelength-number>
+        <center-frequency>191.35</center-frequency>
+        <wavelength>1565.82</wavelength>
+      </wavelengths>
+    </wavelength-map>
+    <internal-link>
+      <internal-link-name>2/0/C1-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C2-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C3-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C4-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C5-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C6-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C7-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C8-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/C9-to-2/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>2/0/L1-to-2/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C1-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C2-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C3-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C4-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C5-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C6-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C7-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C8-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/C9-to-3/0/L1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>3/0/L1-to-3/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C1-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C1-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C1-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C1-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C2-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C2-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C2-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C2-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C3-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C3-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C3-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C3-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C4-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C4-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C4-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C4-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C5-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C5-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C5-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C5-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C6-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C6-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C6-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C6-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C7-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C7-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C7-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C7-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C8-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C8-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C8-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C8-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C9-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C9-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C9-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C9-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C10-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C10-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C10-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C10-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C11-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C11-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C11-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C11-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C12-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C12-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C12-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C12-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C13-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C13-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C13-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C13-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C14-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C14-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C14-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C14-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C15-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C15-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C15-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C15-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C16-to-4/0/ADD-DEG1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C16-to-4/0/ADD-DEG2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C16-to-4/0/ADD-DEG3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/C16-to-4/0/ADD-DEG4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C10</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C11</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C12</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C13</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C14</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C15</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG1-to-4/0/C16</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C10</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C11</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C12</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C13</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C14</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C15</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG2-to-4/0/C16</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C10</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C11</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C12</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C13</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C14</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C15</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG3-to-4/0/C16</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C1</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C2</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C3</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C4</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C5</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C6</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C7</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C8</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C9</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C10</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C11</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C12</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C13</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C14</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C15</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+    </internal-link>
+    <internal-link>
+      <internal-link-name>4/0/ADD-DEG4-to-4/0/C16</internal-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </internal-link>
+    <physical-link>
+      <physical-link-name>phylink-1</physical-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </destination>
+    </physical-link>
+    <physical-link>
+      <physical-link-name>phylink-2</physical-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </physical-link>
+    <physical-link>
+      <physical-link-name>phylink-3</physical-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </destination>
+    </physical-link>
+    <physical-link>
+      <physical-link-name>phylink-4</physical-link-name>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>ADD-DEG2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </physical-link>
+    <physical-link>
+      <physical-link-name>phylink-5</physical-link-name>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </physical-link>
+    <physical-link>
+      <physical-link-name>phylink-6</physical-link-name>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+    </physical-link>
+    <degree>
+      <degree-number>1</degree-number>
+      <max-wavelengths>96</max-wavelengths>
+      <circuit-packs>
+        <index>1</index>
+        <circuit-pack-name>2/0</circuit-pack-name>
+      </circuit-packs>
+      <connection-ports>
+        <index>1</index>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </connection-ports>
+    </degree>
+    <degree>
+      <degree-number>2</degree-number>
+      <max-wavelengths>96</max-wavelengths>
+      <circuit-packs>
+        <index>1</index>
+        <circuit-pack-name>3/0</circuit-pack-name>
+      </circuit-packs>
+      <connection-ports>
+        <index>1</index>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </connection-ports>
+    </degree>
+    <shared-risk-group>
+      <srg-number>1</srg-number>
+      <max-add-drop-ports>16</max-add-drop-ports>
+      <wavelengthDuplication>onePerSRG</wavelengthDuplication>
+      <circuit-packs>
+        <index>1</index>
+        <circuit-pack-name>4/0</circuit-pack-name>
+      </circuit-packs>
+    </shared-risk-group>
+    <connection-map>
+      <connection-map-number>1</connection-map-number>
+      <source>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>2</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>3</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>4</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>5</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>6</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>7</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>8</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>9</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>10</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>11</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>12</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>13</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>14</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>15</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>16</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>17</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>2/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>18</connection-map-number>
+      <source>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </destination>
+      <destination>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>19</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>20</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C2</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>21</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C3</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>22</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C4</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>23</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C5</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>24</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C6</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>25</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C7</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>26</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C8</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>27</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C9</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>28</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C10</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>29</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C11</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>30</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C12</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>31</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C13</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>32</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C14</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>33</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C15</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>34</connection-map-number>
+      <source>
+        <circuit-pack-name>4/0</circuit-pack-name>
+        <port-name>C16</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>3/0</circuit-pack-name>
+        <port-name>E1</port-name>
+      </destination>
+    </connection-map>
+  </org-openroadm-device>
+</data>
diff --git a/pom.xml b/pom.xml
index 38e2d629391cf9eb3a0d027c4659b8d8e252000c..2d40ce9cb0687587ab6113f9746d6fa60c849097 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <modules>
     <module>artifacts</module>
     <module>api</module>
+    <module>common</module>
     <module>ordmodels</module>
     <module>renderer</module>
     <module>olm</module>