Merge "Change TAPI topology to use correct states"
authorGuillaume Lambert <guillaume.lambert@orange.com>
Thu, 8 Jul 2021 12:49:05 +0000 (12:49 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 8 Jul 2021 12:49:05 +0000 (12:49 +0000)
70 files changed:
api/src/main/yang/transportpce-portmapping@2021-04-26.yang
common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl710.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java
common/src/main/resources/OSGI-INF/blueprint/common-blueprint.xml
common/src/test/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImplTest.java
common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java
features/odl-transportpce/pom.xml
lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java
lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopologyTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopologyTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/NetworkmodelTestUtil.java
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtVersion221.java
olm/src/test/java/org/opendaylight/transportpce/olm/OlmPowerServiceRpcImplTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtPowerMockTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/service/OlmPowerServiceImplTest.java
ordmodels/network/src/main/yang/transportpce-topology@2021-05-11.yang [moved from ordmodels/network/src/main/yang/transportpce-topology@2020-10-19.yang with 92% similarity]
pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceLink.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java
pce/src/test/java/org/opendaylight/transportpce/pce/PcePathDescriptionTests.java
pce/src/test/java/org/opendaylight/transportpce/pce/PceSendingPceRPCsTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/constraints/PceConstraintsTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphEdgeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculationTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceLinkTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/PceTestData.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface710.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java
renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiFullTopo.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiTopo.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java
tests/sample_configs/honeynode-otntopo400G.json [new file with mode: 0644]
tests/sample_configs/honeynode-otntopo400GwithODUC4.json [new file with mode: 0644]
tests/sample_configs/honeynode-otntopo400GwithOTUC4.json [new file with mode: 0644]
tests/sample_configs/honeynode-topo400G.json
tests/sample_configs/openroadm/7.1/oper-XPDRA2.xml
tests/sample_configs/openroadm/7.1/oper-XPDRC.xml
tests/sample_configs/pce_portmapping_121.json
tests/sample_configs/pce_portmapping_71.json
tests/transportpce_tests/7.1/test_pce_400G.py
tests/transportpce_tests/7.1/test_portmapping.py

index e8b45d0e063519815dc1b4f1983ed753123750e4..285c049749d1af4ddd5d488a1b1cc2752c39b400 100644 (file)
@@ -271,15 +271,17 @@ module transportpce-portmapping {
 
   grouping mc-capabilities {
     list mc-capabilities {
-      when "../node-info/node-type = 'rdm'";
       key "mc-node-name";
       description
-        "Capabilities of the media channel associated with a degree or a SRG.";
+        "Capabilities of the media channel associated with a degree SRG, or
+        XPDR (7.1 and above). ";
       leaf mc-node-name {
         type string;
         description
           "Name of the node, it has the format of DEGi-TTP or SRGj-PP
-           Where i, and j are the degree and SRG numbers respectively";
+           Where i, and j are the degree and SRG numbers respectively.
+           For XPDR type it will have one element in the leaf-list,
+           with name XPDR-mcprofile";
       }
       leaf slot-width-granularity {
         type org-openroadm-common-optical-channel-types:frequency-GHz;
index d5a7932f4f20253f74424a1e21295d28223d41fb..b1aa101d9dc02b709b2f21eebcf05cfe52b84be5 100644 (file)
@@ -25,9 +25,11 @@ public final class StringConstants {
 
     public static final String PP_TOKEN = "PP";
 
-    public static final String SERVICE_TYPE_100GE = "100GE";
+    public static final String SERVICE_TYPE_100GE_T = "100GEt";
+    public static final String SERVICE_TYPE_100GE_M = "100GEm";
 
     public static final String SERVICE_TYPE_OTU4 = "OTU4";
+    public static final String SERVICE_TYPE_OTUC4 = "OTUC4";
 
     public static final String SERVICE_TYPE_400GE = "400GE";
 
@@ -36,6 +38,7 @@ public final class StringConstants {
     public static final String SERVICE_TYPE_1GE = "1GE";
 
     public static final String SERVICE_TYPE_ODU4 = "ODU4";
+    public static final String SERVICE_TYPE_ODUC4 = "ODUC4";
 
     private StringConstants() {
         // hiding the default constructor
index 2e2773f5e1d2736268b6b8393d34c10051a0c3fd..4c9d3272171f32886915ea4e7d94a87e9d60bf13 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.transportpce.common.crossconnect;
 
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_1_2_1;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
+import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_7_1;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -31,13 +32,16 @@ public class CrossConnectImpl implements CrossConnect {
     private final MappingUtils mappingUtils;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl221;
+    private CrossConnectImpl710 crossConnectImpl710;
 
     public CrossConnectImpl(DeviceTransactionManager deviceTransactionManager, MappingUtils mappingUtils,
                             CrossConnectImpl121 crossConnectImpl121,
-                            CrossConnectImpl221 crossConnectImpl221) {
+                            CrossConnectImpl221 crossConnectImpl221,
+                            CrossConnectImpl710 crossConnectImpl710) {
         this.mappingUtils = mappingUtils;
         this.crossConnectImpl121 = crossConnectImpl121;
         this.crossConnectImpl221 = crossConnectImpl221;
+        this.crossConnectImpl710 = crossConnectImpl710;
         this.crossConnect = null;
     }
 
@@ -84,6 +88,14 @@ public class CrossConnectImpl implements CrossConnect {
         return null;
     }
 
+    public List<String> deleteCrossConnect(String nodeId, String connectionNumber) {
+        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(nodeId);
+        if (OPENROADM_DEVICE_VERSION_7_1.equals(openRoadmVersion)) {
+            return crossConnectImpl710.deleteOtnCrossConnect(nodeId, connectionNumber);
+        }
+        return null;
+    }
+
     public List<?> getConnectionPortTrail(String nodeId, String srcTp, String destTp, int lowerSpectralSlotNumber,
             int higherSpectralSlotNumber)
             throws OpenRoadmInterfaceException {
@@ -118,6 +130,14 @@ public class CrossConnectImpl implements CrossConnect {
     @Override
     public Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node)
             throws OpenRoadmInterfaceException {
-        return crossConnectImpl221.postOtnCrossConnect(createdOduInterfaces, node);
+        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(node.getNodeId());
+
+        if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)) {
+            return crossConnectImpl221.postOtnCrossConnect(createdOduInterfaces, node);
+        }
+        else if (OPENROADM_DEVICE_VERSION_7_1.equals(openRoadmVersion)) {
+            return crossConnectImpl710.postOtnCrossConnect(createdOduInterfaces, node);
+        }
+        return Optional.empty();
     }
 }
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl710.java b/common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl710.java
new file mode 100644 (file)
index 0000000..e85a845
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright Â© 2021 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.FluentFuture;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.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.rev200529.OduConnection.Direction;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnectionKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.otn.renderer.input.Nodes;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CrossConnectImpl710 {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CrossConnectImpl710.class);
+    private final DeviceTransactionManager deviceTransactionManager;
+
+    public CrossConnectImpl710(DeviceTransactionManager deviceTransactionManager) {
+        this.deviceTransactionManager = deviceTransactionManager;
+    }
+
+    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container
+        .org.openroadm.device.OduConnection> getOtnCrossConnect(String deviceId, String connectionNumber) {
+
+        return deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL,
+            generateOduConnectionIID(connectionNumber), Timeouts.DEVICE_READ_TIMEOUT,
+            Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+    }
+
+    private InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
+        .container.org.openroadm.device.OduConnection> generateOduConnectionIID(String connectionNumber) {
+
+        return InstanceIdentifier.create(OrgOpenroadmDevice.class).child(org.opendaylight.yang.gen.v1.http.org
+                .openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnection.class,
+            new OduConnectionKey(connectionNumber));
+    }
+
+    public Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node) {
+        String deviceId = node.getNodeId();
+        String srcTp = createdOduInterfaces.get(0);
+        String dstTp = createdOduInterfaces.get(1);
+
+        OduConnectionBuilder oduConnectionBuilder = new OduConnectionBuilder()
+            .setConnectionName(srcTp + "-x-" + dstTp)
+            .setDestination(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
+                .DestinationBuilder().setDstIf(dstTp).build())
+            .setSource(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
+                .SourceBuilder().setSrcIf(srcTp).build())
+            .setDirection(Direction.Bidirectional);
+
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
+            .container.org.openroadm.device.OduConnection> oduConnectionIID =
+            InstanceIdentifier.create(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container
+                    .OrgOpenroadmDevice.class)
+                .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
+                .container.org.openroadm.device.OduConnection.class,
+                    new OduConnectionKey(oduConnectionBuilder.getConnectionName())
+                );
+
+        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.merge(LogicalDatastoreType.CONFIGURATION, oduConnectionIID, oduConnectionBuilder.build());
+        FluentFuture<? extends @NonNull CommitInfo> commit =
+            deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            commit.get();
+            LOG.info("Otn-connection successfully created: {}-{}", srcTp, dstTp);
+            return Optional.of(srcTp + "-x-" + dstTp);
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Failed to post {}.", oduConnectionBuilder.build(), e);
+        }
+        return Optional.empty();
+
+    }
+
+    public List<String> deleteOtnCrossConnect(String deviceId, String connectionName) {
+        List<String> interfList = new ArrayList<>();
+        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
+            .container.org.openroadm.device.OduConnection> otnXc = getOtnCrossConnect(deviceId, connectionName);
+
+        if (otnXc.isPresent()) {
+            interfList.add(otnXc.get().getSource().getSrcIf());
+            interfList.add(otnXc.get().getDestination().getDstIf());
+        } else {
+            LOG.warn("Cross connect {} does not exist, halting delete", connectionName);
+            return null;
+        }
+        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 null;
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to obtain device transaction for device {}!", deviceId, e);
+            return null;
+        }
+
+        deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateOduConnectionIID(connectionName));
+
+        // delete the cross connect on the device
+        deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateOduConnectionIID(connectionName));
+        FluentFuture<? extends @NonNull CommitInfo> commit =
+            deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            commit.get();
+            LOG.info("Connection {} successfully deleted on {}", connectionName, deviceId);
+            return interfList;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Failed to delete {}", connectionName, e);
+        }
+        return null;
+    }
+
+}
index d9f72717157f3f4b24dfb2c55c04a5ba0e8e4bb2..7282bec3cc5c42678c2533a6a1d68853a4883cd1 100644 (file)
@@ -34,6 +34,7 @@ public final class GridConstant {
     public static final int NB_SLOTS_100G = 8;
     public static final int NB_SLOTS_400G = 14;
     public static final BigDecimal WIDTH_80 = BigDecimal.valueOf(80);
+    public static final BigDecimal WIDTH_75 = BigDecimal.valueOf(75);
     public static final BigDecimal WIDTH_40 = BigDecimal.valueOf(40);
     public static final BigDecimal SLOT_WIDTH_50 = BigDecimal.valueOf(50);
     public static final BigDecimal SLOT_WIDTH_87_5 = BigDecimal.valueOf(87.5);
@@ -42,7 +43,7 @@ public final class GridConstant {
      * Map for associate service type with nb slots.
      */
     public static final Map<String, Integer> SPECTRAL_WIDTH_SLOT_NUMBER_MAP = Map.of(
-            StringConstants.SERVICE_TYPE_100GE, NB_SLOTS_100G,
+            StringConstants.SERVICE_TYPE_100GE_T, NB_SLOTS_100G,
             StringConstants.SERVICE_TYPE_400GE, NB_SLOTS_400G,
             StringConstants.SERVICE_TYPE_OTU4, NB_SLOTS_100G);
 
@@ -67,6 +68,7 @@ public final class GridConstant {
      */
     public static final Map<BigDecimal, BigDecimal> WIDTH_SLOT_WIDTH_MAP = Map.of(
             WIDTH_40, SLOT_WIDTH_50,
+            WIDTH_75, SLOT_WIDTH_87_5,
             WIDTH_80, SLOT_WIDTH_87_5);
 
     public static final int FIXED_GRID_FREQUENCY_PRECISION = 4;
@@ -98,7 +100,7 @@ public final class GridConstant {
         frequencyWidthTable.put(ServiceRateConstant.RATE_100, ModulationFormat.DpQpsk, String.valueOf(WIDTH_40));
         frequencyWidthTable.put(ServiceRateConstant.RATE_200, ModulationFormat.DpQpsk, String.valueOf(WIDTH_80));
         frequencyWidthTable.put(ServiceRateConstant.RATE_300, ModulationFormat.DpQam8, String.valueOf(WIDTH_80));
-        frequencyWidthTable.put(ServiceRateConstant.RATE_400, ModulationFormat.DpQam16, String.valueOf(WIDTH_80));
+        frequencyWidthTable.put(ServiceRateConstant.RATE_400, ModulationFormat.DpQam16, String.valueOf(WIDTH_75));
         return frequencyWidthTable;
     }
 
index 89a76a2db112a0e01a7b04171bf0c6e4d178d4d3..8b04bd5ca2cbd82aefc9fb16cc18fa8995b56065 100644 (file)
@@ -8,9 +8,17 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
+
+import java.util.List;
+import java.util.Map;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilities;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint16;
+
 
 public interface PortMapping {
 
@@ -151,4 +159,25 @@ public interface PortMapping {
      * @return node data if success otherwise null.
      */
     Nodes getNode(String nodeId);
+
+    /**
+     * This method allows to update a port-mapping node with odu-connection-map data.
+     * This method is used for an otn xponder in version 7.1, when a device sends a
+     * change-notification advertising controller that odu-switching-pools containers
+     * have been populated inside its configuration
+     * (appears after creation of an OTSI-Group interface).
+     *
+     * @param nodeId
+     *            Unique Identifier for the node of interest.
+     * @param ospIID
+     *            Instance Identifier of the odu-switching-pools.
+     * @param nbliidMap
+     *            Map containing the non-blocking-list number as key,
+     *            and the list of Instance Identifier corresponding to each port-list
+     *            as value.
+     *
+     * @return Result true/false based on status of operation.
+     */
+    boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier<OduSwitchingPools> ospIID,
+        Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap);
 }
index 963fb6a42bbdca28c19c457146c76c33352d3c5c..c19848d4cc83719e99c09c8f27daae77ce65bc1d 100644 (file)
@@ -11,6 +11,7 @@ import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEV
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_7_1;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
@@ -28,8 +29,11 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmappi
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilitiesKey;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -186,4 +190,18 @@ public class PortMappingImpl implements PortMapping {
         }
         return null;
     }
+
+    @Override
+    public boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier<OduSwitchingPools> ospIID,
+            Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap) {
+        OpenroadmNodeVersion openROADMversion = getNode(nodeId).getNodeInfo().getOpenroadmVersion();
+        switch (openROADMversion.getIntValue()) {
+            case 3:
+                return portMappingVersion710.updatePortMappingWithOduSwitchingPools(nodeId, ospIID, nbliidMap);
+            default:
+                LOG.error("Update of the port-mapping [odu-switching-pool] not available for this device version {}",
+                    openROADMversion);
+                return false;
+        }
+    }
 }
index 50d1383d487b81624e84af7581bbbe0434f078c2..92af655eb24ca5e72a69c811684cb5e8fcebb92e 100644 (file)
@@ -23,6 +23,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -43,6 +44,7 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmappi
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilities;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilitiesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilitiesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mpdr.restrictions.grp.MpdrRestrictionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesKey;
@@ -71,6 +73,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.open
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.Info;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.McCapabilityProfile;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.McCapabilityProfileKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.MuxpProfile;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.MuxpProfileKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.Protocols;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup;
@@ -80,6 +84,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.open
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.port.Interfaces;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.xponder.XpdrPort;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.InterfaceType;
@@ -89,15 +94,19 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtnO
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev200529.Protocols1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev200529.lldp.container.Lldp;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev200529.lldp.container.lldp.PortConfig;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev200529.Ports1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev200529.port.capability.grp.port.capabilities.SupportedInterfaceCapability;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev200529.port.capability.grp.port.capabilities.SupportedInterfaceCapabilityKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.capability.rev200529.port.capability.grp.port.capabilities.supported._interface.capability.otn.capability.MpdrClientRestriction;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 // FIXME: many common pieces of code between PortMapping Versions 121 and 221 and 710
 // some mutualization would be helpful
 @SuppressWarnings("CPD-START")
@@ -124,7 +133,7 @@ public class PortMappingVersion710 {
     }
 
     public boolean createMappingData(String nodeId) {
-        LOG.info("{} : OpenROADM version 7.1.0 node - Creating Mapping Data", nodeId);
+        LOG.info("{} : OpenROADM version 7.1 node - Creating Mapping Data", nodeId);
         List<Mapping> portMapList = new ArrayList<>();
         Map<McCapabilitiesKey, McCapabilities> mcCapabilities = new HashMap<>();
         InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
@@ -170,6 +179,14 @@ public class PortMappingVersion710 {
                     LOG.warn("{} : Unable to create mapping for the Xponder", nodeId);
                     return false;
                 }
+                // In the case of 7.1 models, even XPDR advertizes mc-capabilities,
+                // hence we need to populate this information into the port-mapping data
+                // Get MC capabilities
+                if (!createMcCapabilitiesList(nodeId, deviceInfo, mcCapabilities)) {
+                    // return false if MC capabilites failed
+                    LOG.warn("{} : Unable to create MC capabilities", nodeId);
+                    return false;
+                }
                 break;
             default:
                 LOG.error("{} : unknown nodetype - Unable to create mapping", nodeId);
@@ -208,6 +225,80 @@ public class PortMappingVersion710 {
         }
     }
 
+    public boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier<OduSwitchingPools> ospIID,
+            Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap) {
+
+        KeyedInstanceIdentifier<Nodes, NodesKey> portMappingNodeIID = InstanceIdentifier.create(Network.class)
+            .child(Nodes.class, new NodesKey(nodeId));
+        Nodes portmappingNode = null;
+        try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
+            portmappingNode = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingNodeIID).get().get();
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.error("Unable to read the port-mapping for nodeId {}", nodeId, ex);
+        }
+        if (portmappingNode == null) {
+            return false;
+        }
+        Map<MappingKey, Mapping> mappings = portmappingNode.nonnullMapping();
+
+        OduSwitchingPools osp = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
+            ospIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+        Uint16 ospNumber = osp.getSwitchingPoolNumber();
+        Map<SwitchingPoolLcpKey, SwitchingPoolLcp> splMap = new HashMap(portmappingNode.nonnullSwitchingPoolLcp());
+        SwitchingPoolLcpBuilder splBldr = splMap.containsKey(new SwitchingPoolLcpKey(ospNumber))
+            ? new SwitchingPoolLcpBuilder(splMap.get(new SwitchingPoolLcpKey(ospNumber)))
+            : new SwitchingPoolLcpBuilder().setSwitchingPoolNumber(ospNumber)
+                .setSwitchingPoolType(osp.getSwitchingPoolType());
+        Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
+        for (Entry<Uint16, List<InstanceIdentifier<PortList>>> entry : nbliidMap.entrySet()) {
+            Uint32 interconnectBw = osp.getNonBlockingList().get(new
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org
+                    .openroadm.device.odu.switching.pools.NonBlockingListKey(entry.getKey()))
+                .getInterconnectBandwidth();
+            NonBlockingList nbl = createNonBlockingList(splBldr, interconnectBw, entry, mappings, nodeId);
+            if (nbl == null) {
+                return false;
+            }
+            nblMap.put(nbl.key(), nbl);
+        }
+        SwitchingPoolLcp switchingPoolLcp = splBldr
+            .setNonBlockingList(nblMap)
+            .build();
+        splMap.put(switchingPoolLcp.key(), switchingPoolLcp);
+        List<SwitchingPoolLcp> switchingPoolList = new ArrayList<>(splMap.values());
+        postPortMapping(nodeId, null, null, null, switchingPoolList, null);
+        return true;
+    }
+
+    private NonBlockingList createNonBlockingList(SwitchingPoolLcpBuilder splBldr, Uint32 interconnectBw,
+            Entry<Uint16, List<InstanceIdentifier<PortList>>> entry, Map<MappingKey, Mapping> mappings, String nodeId) {
+        NonBlockingListBuilder nblBldr;
+        if (splBldr.getNonBlockingList() != null
+            && splBldr.getNonBlockingList().containsKey(new NonBlockingListKey(entry.getKey()))) {
+            nblBldr = new NonBlockingListBuilder(splBldr.getNonBlockingList()
+                .get(new NonBlockingListKey(entry.getKey())));
+        } else {
+            nblBldr = new NonBlockingListBuilder()
+                .setNblNumber(entry.getKey())
+                .setInterconnectBandwidth(interconnectBw);
+        }
+        List<String> lcpList = nblBldr.getLcpList() != null ? nblBldr.getLcpList() : new ArrayList<>();
+        for (InstanceIdentifier<PortList> id : entry.getValue()) {
+            PortList portList = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
+                id, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+            String circuitPackName = portList.getCircuitPackName();
+            String portName = portList.getPortName();
+            String lcp = getLcpFromCpAndPort(mappings, circuitPackName, portName);
+            if (lcp != null && !lcpList.contains(lcp)) {
+                lcpList.add(lcp);
+            } else {
+                return null;
+            }
+        }
+        nblBldr.setLcpList(lcpList);
+        return nblBldr.build();
+    }
+
     private boolean createXpdrPortMapping(String nodeId, List<Mapping> portMapList) {
         // Creating for Xponder Line and Client Ports
         InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
@@ -886,9 +977,18 @@ public class PortMappingVersion710 {
                 if (interfaceType.equals(OpticalTransport.class)) {
                     mpBldr.setSupportingOts(interfaces.getInterfaceName());
                 }
-                if (interfaceType.equals(OtnOdu.class)) {
+                String interfaceName = interfaces.getInterfaceName();
+                if (interfaceType.equals(OtnOdu.class)
+                    && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
+                    .equals("ODU"))) {
                     mpBldr.setSupportingOdu4(interfaces.getInterfaceName());
                 }
+                if ((interfaceType.equals(OtnOdu.class))
+                    && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
+                    .equals("ODUC4"))) {
+                    mpBldr.setSupportingOduc4(interfaces.getInterfaceName());
+                }
+
             } catch (OpenRoadmInterfaceException ex) {
                 LOG.warn("{} : Error while getting interface {} - ",
                     nodeId, interfaces.getInterfaceName(), ex);
@@ -930,8 +1030,26 @@ public class PortMappingVersion710 {
                 .SupportedIfCapability>> supportedIntf = new ArrayList<>();
             Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfCapMap = port
                 .augmentation(Ports1.class).getPortCapabilities().nonnullSupportedInterfaceCapability();
+            SupportedInterfaceCapability sic1 = null;
             for (SupportedInterfaceCapability sic : supIfCapMap.values()) {
                 supportedIntf.add(sic.getIfCapType());
+                sic1 = sic;
+            }
+            if (port.getPortQual() == PortQual.SwitchClient
+                && !sic1.getOtnCapability().getMpdrClientRestriction().isEmpty()) {
+                List<MpdrClientRestriction> mpdrClientRestriction = sic1.getOtnCapability().getMpdrClientRestriction();
+                // Here we assume all the supported-interfaces has the support same rates, and the
+                // trib-slot numbers are assumed to be the same
+                String mxpProfileName = mpdrClientRestriction.get(0).getMuxpProfileName().get(0);
+                // From this muxponder-profile get the min-trib-slot and the max-trib-slot
+                LOG.info("{}: Muxp-profile used for trib information {}", nodeId, mxpProfileName);
+                // This provides the tribSlot information from muxProfile
+                List<OpucnTribSlotDef> minMaxOpucnTribSlots = getOpucnTribSlots(nodeId, mxpProfileName);
+                mpBldr.setMpdrRestrictions(
+                    new MpdrRestrictionsBuilder()
+                        .setMinTribSlot(minMaxOpucnTribSlots.get(0))
+                        .setMaxTribSlot(minMaxOpucnTribSlots.get(1))
+                        .build());
             }
             mpBldr.setSupportedInterfaceCapability(supportedIntf);
         }
@@ -944,6 +1062,29 @@ public class PortMappingVersion710 {
         return mpBldr.build();
     }
 
+    private ArrayList<OpucnTribSlotDef> getOpucnTribSlots(String deviceId, String mxpProfileName) {
+        ArrayList<OpucnTribSlotDef> minMaxOpucnTribSlots = new ArrayList<>(2);
+
+        LOG.info("{} : Getting Min/Max Trib-slots from {}", deviceId, mxpProfileName);
+        InstanceIdentifier<MuxpProfile> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+            .child(MuxpProfile.class, new MuxpProfileKey(mxpProfileName));
+
+        Optional<MuxpProfile> muxpProfileObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
+            LogicalDatastoreType.OPERATIONAL, deviceIID,
+            Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+
+        List<OpucnTribSlotDef> ntwHoOduOpucnTribSlots = muxpProfileObject.get().getNetworkHoOduOpucnTribSlots();
+        // Sort the tib-slots in ascending order and pick min and max
+        List<OpucnTribSlotDef> sortedNtwHoOduOpucnTribSlots = ntwHoOduOpucnTribSlots.stream().sorted(
+            Comparator.comparingDouble(x -> Double.parseDouble(
+                x.getValue().substring(x.getValue().lastIndexOf('.') + 1))))
+            .collect(Collectors.toList());
+        minMaxOpucnTribSlots.add(sortedNtwHoOduOpucnTribSlots.get(0));
+        minMaxOpucnTribSlots.add(sortedNtwHoOduOpucnTribSlots.get(sortedNtwHoOduOpucnTribSlots.size() - 1));
+        // LOG.info("Min, Max trib slot list {}", minMaxOpucnTribSlots);
+        return minMaxOpucnTribSlots;
+    }
+
     private Ports getPort2(Ports port, String nodeId, String circuitPackName, StringBuilder circuitPackName2,
             //circuitPackName2 will be updated by reference contrary to circuitPackName
             List<CircuitPacks> circuitPackList, Map<String, String> lcpMap) {
@@ -1081,9 +1222,33 @@ public class PortMappingVersion710 {
 
     private boolean createMcCapabilitiesList(String nodeId, Info deviceInfo,
             Map<McCapabilitiesKey, McCapabilities> mcCapabilitiesMap) {
-        Map<Integer, Degree> degrees = getDegreesMap(nodeId, deviceInfo);
-        List<SharedRiskGroup> srgs = getSrgs(nodeId, deviceInfo);
-        mcCapabilitiesMap.putAll(getMcCapabilities(degrees, srgs, deviceInfo, nodeId));
+        if (deviceInfo.getNodeType() == NodeTypes.Rdm) {
+            Map<Integer, Degree> degrees = getDegreesMap(nodeId, deviceInfo);
+            List<SharedRiskGroup> srgs = getSrgs(nodeId, deviceInfo);
+            mcCapabilitiesMap.putAll(getMcCapabilities(degrees, srgs, deviceInfo, nodeId));
+        } else if ((deviceInfo.getNodeType() == NodeTypes.Xpdr)) {
+            Map<McCapabilityProfileKey, McCapabilityProfile> mcProfileXpdr = getMcCapabilityProfiles(nodeId,
+                deviceInfo);
+            if (mcProfileXpdr.size() > 1) {
+                LOG.warn("Re-check the mc-capability-profiles for XPDR port-mapping");
+            }
+            // Typically for a XPDR there will be only one mc-capability-profile
+            for (Map.Entry<McCapabilityProfileKey, McCapabilityProfile> mcCapProfile : mcProfileXpdr.entrySet()) {
+                String mcNodeName = "XPDR" + "-" + "mcprofile";
+                McCapabilitiesBuilder mcCapabilitiesBuilder = new McCapabilitiesBuilder()
+                    .withKey(new McCapabilitiesKey(mcNodeName))
+                    .setMcNodeName(mcNodeName);
+                mcCapabilitiesBuilder
+                    .setCenterFreqGranularity(mcCapProfile.getValue().getCenterFreqGranularity())
+                    .setSlotWidthGranularity(mcCapProfile.getValue().getSlotWidthGranularity());
+                // Build and add to the Map
+                mcCapabilitiesMap.put(mcCapabilitiesBuilder.key(), mcCapabilitiesBuilder.build());
+                LOG.info("Finished building mc-capability profile for XPDR {}", nodeId);
+                // Since we only have one mc-profile for XPDR, we can break the for-loop
+                break;
+            }
+
+        }
         return true;
     }
 
@@ -1259,4 +1424,13 @@ public class PortMappingVersion710 {
         return nodeInfoBldr.build();
     }
 
+    private String getLcpFromCpAndPort(Map<MappingKey, Mapping> mappings, String cpName, String portName) {
+        for (Mapping mapping : mappings.values()) {
+            if (cpName.equals(mapping.getSupportingCircuitPackName())
+                && portName.equals(mapping.getSupportingPort())) {
+                return mapping.getLogicalConnectionPoint();
+            }
+        }
+        return null;
+    }
 }
index 6260594a52256062d6796a0c1ecf406484bb796b..e3a05ade01f93c803c2a783dc40886c7e0105088 100644 (file)
@@ -85,11 +85,16 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
         <argument ref="deviceTransactionManager" />
     </bean>
 
+    <bean id="crossConnect710" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710" >
+        <argument ref="deviceTransactionManager" />
+    </bean>
+
     <bean id="crossConnectImpl" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl" >
         <argument ref="deviceTransactionManager" />
         <argument ref="mappingUtils" />
         <argument ref="crossConnect121" />
         <argument ref="crossConnect221" />
+        <argument ref="crossConnect710" />
     </bean>
 
     <service ref="deviceTransactionManager" interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
index 96b8beb444e8ba4bce959017f4c095bda770720a..12fd459545da54de0192e367874a79335878dde1 100644 (file)
@@ -30,6 +30,7 @@ public class CrossConnectImplTest {
     private static DeviceTransactionManager deviceTransactionManager;
     private CrossConnectImpl121 crossConnectImpl121 = null;
     private CrossConnectImpl221 crossConnectImpl221 = null;
+    private CrossConnectImpl710 crossConnectImpl710 = null;
     private MappingUtils mappingUtils = null;
 
     @Before
@@ -37,9 +38,11 @@ public class CrossConnectImplTest {
         deviceTransactionManager = mock(DeviceTransactionManager.class);
         crossConnectImpl121 = mock(CrossConnectImpl121.class);
         crossConnectImpl221 = mock(CrossConnectImpl221.class);
+        crossConnectImpl710 = mock(CrossConnectImpl710.class);
         mappingUtils = mock(MappingUtils.class);
         crossConnectImpl =
-                new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221);
+                new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121,
+                    crossConnectImpl221, crossConnectImpl710);
     }
 
     @Before
index 08b549e0d00afbe799dc357873c20da54387f2af..0ac52b0902d6e21b96f67fc76171f7a4d6316f0f 100644 (file)
@@ -81,7 +81,7 @@ public class GridUtilsTest {
 
     @Test
     public void getWidthFromRateAndModulationFormatTest() {
-        assertEquals("Width should be 80", new FrequencyGHz(GridConstant.WIDTH_80),
+        assertEquals("Width should be 75", new FrequencyGHz(GridConstant.WIDTH_75),
                 GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_400,
                         ModulationFormat.DpQam16));
     }
index 784e1d0cb8a2934a35e5b34f10e2f22b689dfd29..deafc55090024917a80018f56db92a6aa010dc2b 100644 (file)
@@ -98,19 +98,19 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>odl-restconf-all</artifactId>
+      <artifactId>odl-restconf</artifactId>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>odl-netconf-all</artifactId>
+      <artifactId>odl-netconf-connector</artifactId>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>odl-netconf-connector-all</artifactId>
+      <artifactId>odl-netconf-topology</artifactId>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
index cee0fba65ce4f671c498b425f657c829b465ae3c..439a2c50136f40680cacdf122233447417068d49 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
 import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
@@ -60,6 +61,7 @@ import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterf
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 // Adding OTN interface
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
@@ -305,8 +307,10 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
         OpenRoadmOtnInterface221 openRoadmOtnInterface221 = new OpenRoadmOtnInterface221(portMapping,
                 openRoadmInterfaces);
+        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
+            openRoadmInterfaces);
         return new OpenRoadmInterfaceFactory(mappingUtils, openRoadmInterface121, openRoadmInterface221,
-            openRoadmInterface710, openRoadmOtnInterface221);
+            openRoadmInterface710, openRoadmOtnInterface221, openRoadmOtnInterface710);
     }
 
     private PortMapping initPortMapping(LightyServices lightyServices, OpenRoadmInterfaces openRoadmInterfaces) {
@@ -334,6 +338,8 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
     private CrossConnect initCrossConnect(MappingUtils mappingUtils) {
         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
-        return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221);
+        CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
+        return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
+            crossConnectImpl710);
     }
 }
index 0c8973cffb5b3d160cef4ae7bf96a00f88d7a695..c7af76f2a8634badecc5242bafa1f93374173618 100644 (file)
@@ -322,7 +322,7 @@ public final class TPCEUtils {
                     .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.$YangModuleInfoImpl.getInstance(),
 
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.$YangModuleInfoImpl
                     .getInstance(),
index 5c544bf9c04d1431b8872bc7351921066ff34892..fe7d1ed3ce1139ad280b5085b3337d086b1206b1 100644 (file)
@@ -8,7 +8,11 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.ChangeNotification;
@@ -18,8 +22,12 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OtdrScan
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.packs.CircuitPacks;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,15 +52,18 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
     @Override
     @SuppressWarnings("unchecked")
     public void onChangeNotification(ChangeNotification notification) {
+        LOG.debug("device71 notification received = {}", notification);
         if (notification.getEdit() == null) {
             LOG.warn("unable to handle {} notificatin received - list of edit is null", ChangeNotification.QNAME);
             return;
         }
+        Map<Uint16, List<InstanceIdentifier<PortList>>> nbliidMap = new HashMap<>();
+        InstanceIdentifier<OduSwitchingPools> ospIID = null;
         for (Edit edit : notification.getEdit()) {
             // 1. Detect the org-openroadm-device object modified
+            LinkedList<PathArgument> path = new LinkedList<>();
             switch (edit.getTarget().getTargetType().getSimpleName()) {
                 case "Ports":
-                    LinkedList<PathArgument> path = new LinkedList<>();
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
                     InstanceIdentifier<Ports> portIID = (InstanceIdentifier<Ports>) InstanceIdentifier
                         .create(path);
@@ -77,11 +88,40 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
                     Thread thread = new Thread(handleNetconfEvent);
                     thread.start();
                     break;
+                case "OduSwitchingPools":
+                    LOG.info("odu-switching-pools modified on device {}", nodeId);
+                    edit.getTarget().getPathArguments().forEach(p -> path.add(p));
+                    ospIID = (InstanceIdentifier<OduSwitchingPools>) InstanceIdentifier.create(path);
+                    break;
+                case "PortList":
+                    edit.getTarget().getPathArguments().forEach(p -> path.add(p));
+                    InstanceIdentifier<PortList> plIID = (InstanceIdentifier<PortList>) InstanceIdentifier.create(path);
+                    path.removeLast();
+                    InstanceIdentifier<NonBlockingList> nblIID =
+                        (InstanceIdentifier<NonBlockingList>) InstanceIdentifier.create(path);
+                    Uint16 nblNb = InstanceIdentifier.keyOf(nblIID).getNblNumber();
+                    List<InstanceIdentifier<PortList>> iidList = nbliidMap.containsKey(nblNb)
+                        ? nbliidMap.get(nblNb) : new ArrayList<>();
+                    iidList.add(plIID);
+                    nbliidMap.put(nblNb, iidList);
+                    break;
                 default:
                     LOG.debug("modification of type {} not managed yet", edit.getTarget().getTargetType());
                     break;
             }
         }
+        if (!nbliidMap.isEmpty() && ospIID != null) {
+            InstanceIdentifier<OduSwitchingPools> id = ospIID;
+            Runnable handleNetconfEvent = new Runnable() {
+                @Override
+                public void run() {
+                    portMapping.updatePortMappingWithOduSwitchingPools(nodeId, id, nbliidMap);
+                    LOG.info("{} : swiching-pool data updated", nodeId);
+                }
+            };
+            Thread thread = new Thread(handleNetconfEvent);
+            thread.start();
+        }
     }
 
     @Override
index 477349f8a5d6551b75d929ef5e36fdbf54343f9e..1b123c7b399c608829e726c7450ca59fd9ccaca4 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.transportpce.networkmodel.service;
 
 import java.util.List;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
 
 /**
index ad23d37a671ace5b97be4ca8f4d7603961c989a9..f17aef038415b2743e5e25c5c38c4606c82008ad 100644 (file)
@@ -44,7 +44,7 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmappi
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
index eb2761ca38f79ddbbc76f4932ba8765c4dfdbef9..7ddc15548491efc68062929f3dcdfd4fb6b3490f 100644 (file)
@@ -60,7 +60,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.Supp
 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -219,8 +219,8 @@ public final class OpenRoadmOtnTopology {
     private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
         OtnLinkType linkType, String linkIdPrefix) {
         List<Link> links = new ArrayList<>();
-        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1 tpceLink1
-            = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1Builder()
+        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1 tpceLink1
+            = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1Builder()
             .setOtnLinkType(linkType).build();
         Link1 otnLink1 = new Link1Builder()
             .setAvailableBandwidth(Uint32.valueOf(100000))
@@ -615,8 +615,8 @@ public final class OpenRoadmOtnTopology {
                 LOG.warn("mapping {} of node {} has no if-cap-type", mapping.getLogicalConnectionPoint(),
                     node.getNodeId());
             }
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr =
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder();
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr =
+                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder();
             TpId tpId = new TpId(mapping.getLogicalConnectionPoint());
             setclientNwTpAttr(tpMap, node, tpId, tpType, otnTp1Bldr.build(), tpceTp1Bldr, mapping);
         }
@@ -624,7 +624,7 @@ public final class OpenRoadmOtnTopology {
 
     private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
             OpenroadmTpType tpType, TerminationPoint1 otnTp1,
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr,
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr,
             Mapping mapping) {
         switch (tpType) {
             case XPONDERNETWORK:
@@ -697,7 +697,7 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static TerminationPoint buildIetfTp(
-        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr,
+        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr,
         TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
         Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
 
index 593b1773f50367a9640e7494dd23aa51c70c3395..37142a1f6726aad32fb7a97266e02669bb045378 100644 (file)
@@ -200,8 +200,8 @@ public final class OpenRoadmTopology {
                         .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
                 if (m.getPortQual().equals("xpdr-network")) {
                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 =
-                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder()
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1 tpceTp1 =
+                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder()
                             .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
                     ietfTpBldr
                         .addAugmentation(ocnTp1Bldr.build())
@@ -210,8 +210,8 @@ public final class OpenRoadmTopology {
                     tpMap.put(ietfTp.key(),ietfTp);
                 } else if (m.getPortQual().equals("xpdr-client")) {
                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 =
-                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder()
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1 tpceTp1 =
+                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder()
                             .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
                     ietfTpBldr
                         .addAugmentation(ocnTp1Bldr.build())
index b771a23b43353bffd0a84acdd3453b1930e25c52..82c36216fa393a8fb2ab47f8f9afb7d90ff1e060 100644 (file)
@@ -62,8 +62,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2e;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCH;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
@@ -275,7 +275,7 @@ public class OpenRoadmOtnTopologyTest {
             "otn link type should be OTU4",
             OtnLinkType.OTU4,
             sortedLinks.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1.class)
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1.class)
                 .getOtnLinkType());
     }
 
@@ -350,7 +350,7 @@ public class OpenRoadmOtnTopologyTest {
             OtnLinkType.ODTU4,
             sortedLinks.get(0)
                 .augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1.class)
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1.class)
                 .getOtnLinkType());
 
         assertEquals("list of TPs should contain 2 updated TPs", 2, topoShard.getTps().size());
index fcbf4cb993661a7f6346b5fb23e970fe0c224f6c..f998b5471c31d2a84b76f06ba2f6ec3bb14a96f2 100644 (file)
@@ -342,12 +342,12 @@ public class OpenRoadmTopologyTest {
         assertEquals("XPDR1-CLIENT1", tps.get(0).getTpId().getValue());
         assertEquals(OpenroadmTpType.XPONDERCLIENT, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
         assertEquals("XPDR1-NETWORK1", tps.get(0).augmentation(
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
             .getAssociatedConnectionMapPort());
         assertEquals("XPDR1-NETWORK1", tps.get(2).getTpId().getValue());
         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(2).augmentation(TerminationPoint1.class).getTpType());
         assertEquals("XPDR1-CLIENT1", tps.get(2).augmentation(
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
             .getAssociatedConnectionMapPort());
     }
 
index 2f36897a1f93989510f01ad2a3b66b18f0777615..00725721c9c2e44d717159daf47ac3b174a9ab2d 100644 (file)
@@ -38,7 +38,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev2
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
@@ -112,7 +112,7 @@ public final class NetworkmodelTestUtil {
                     .setUsedBandwidth(Uint32.valueOf(100000 - availBW))
                     .build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1Builder()
+                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1Builder()
                     .setOtnLinkType(type)
                     .build())
             .build();
@@ -135,7 +135,7 @@ public final class NetworkmodelTestUtil {
                     .setUsedBandwidth(Uint32.valueOf(100000 - availBW))
                     .build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1Builder()
+                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1Builder()
                     .setOtnLinkType(type)
                     .build())
             .build();
index 0c9f683a0db5f0766b440151942b85a04d6555fc..265cf9dedcd6ac6cb7d9bf45d0d7078103b7effd 100644 (file)
@@ -75,7 +75,7 @@ public final class PowerMgmtVersion221 {
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (portObject.isPresent()) {
             Ports port = portObject.get();
-            if (port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) {
+            if (port.getTransponderPort() != null && port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) {
                 powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx().getValue()
                         .doubleValue());
                 powerRangeMap.put("MinTx", port.getTransponderPort().getPortPowerCapabilityMinTx().getValue()
index 656418772a0a46c1d6bb4ed1c65053a87c1922e4..3c6e699e1b4db7efdf30cf5118c9578c6c86c257 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -91,6 +92,7 @@ public class OlmPowerServiceRpcImplTest extends AbstractTest {
     private OlmPowerServiceRpcImpl olmPowerServiceRpc;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl22;
+    private CrossConnectImpl710 crossConnectImpl710;
     private MappingUtils mappingUtils;
     private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
     private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
@@ -110,8 +112,9 @@ public class OlmPowerServiceRpcImplTest extends AbstractTest {
         this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
+        this.crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22);
+                this.crossConnectImpl22, this.crossConnectImpl710);
         this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
         this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager);
         this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager);
index 637530f58b966c3c2907d1b333b4e412c34e118f..f211bc16541f6d7d208b0c0a4f25e16affb3755d 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -84,6 +85,7 @@ public class PowerMgmtPowerMockTest extends AbstractTest {
     private PowerMgmt powerMgmt;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl22;
+    private CrossConnectImpl710 crossConnectImpl710;
     private MappingUtils mappingUtils;
     private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
     private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
@@ -104,7 +106,7 @@ public class PowerMgmtPowerMockTest extends AbstractTest {
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22);
+                this.crossConnectImpl22, this.crossConnectImpl710);
         this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
         this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager);
         this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager);
index db22852fb228dfa2c9b12e102e440c386546d43d..bdaaf6a736f768fea85dd1b95977d335dc6c6ab1 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -54,6 +55,7 @@ public class PowerMgmtTest extends AbstractTest {
     private PowerMgmt powerMgmt;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl22;
+    private CrossConnectImpl710 crossConnectImpl710;
     private MappingUtils mappingUtils;
     private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
     private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
@@ -76,7 +78,7 @@ public class PowerMgmtTest extends AbstractTest {
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22);
+                this.crossConnectImpl22, this.crossConnectImpl710);
         this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
         this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager);
         this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager);
index cbfe928eb7d666c586afa81618343dbc2201f484..8a17e7ab0d42afc507820c7027a3c0d30bda950c 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -84,6 +85,7 @@ public class OlmPowerServiceImplTest  extends AbstractTest {
     private PowerMgmt powerMgmt;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl22;
+    private CrossConnectImpl710 crossConnectImpl710;
     private MappingUtils mappingUtils;
     private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
     private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
@@ -112,7 +114,7 @@ public class OlmPowerServiceImplTest  extends AbstractTest {
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22);
+                this.crossConnectImpl22, this.crossConnectImpl710);
         this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
         this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager);
         this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager);
similarity index 92%
rename from ordmodels/network/src/main/yang/transportpce-topology@2020-10-19.yang
rename to ordmodels/network/src/main/yang/transportpce-topology@2021-05-11.yang
index 45a68bdb56b34067726fcfd5fac15421e6dc21f1..1bd30ddf279064df2b68ed70712f506a7e5de1a3 100644 (file)
@@ -21,6 +21,9 @@ module transportpce-topology {
     contact
         "TransportPCE team";
 
+    revision 2021-05-11 {
+        description "Update otn-link-type enum for higher rates";
+    }
     revision 2020-10-19 {
         description "Update to 7.1.0 Openroadm network and common models";
     }
@@ -51,6 +54,12 @@ module transportpce-topology {
         enum "ODU0" {
           value 4;
         }
+        enum "OTUC4" {
+          value 5;
+        }
+        enum "ODUC4" {
+          value 6;
+        }
       }
     }
 
index 9e5fc4bcd6c7252ac1e442d9453f2e9b8320bb9e..c5967f278a1226b4831f340a6e09d0a8b78b8084 100644 (file)
@@ -93,15 +93,18 @@ public class PcePathDescription {
             .setAToZ(atozMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
-            case StringConstants.SERVICE_TYPE_100GE:
+            case StringConstants.SERVICE_TYPE_OTUC4:
+            case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
                 atoZDirectionBldr.setAToZMaxFrequency(new FrequencyTHz(rc.getMaxFreq()));
                 atoZDirectionBldr.setAToZMinFrequency(new FrequencyTHz(rc.getMinFreq()));
                 atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
                 break;
+            case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC4:
                 if (rc.getResultTribSlot() != null && rc.getResultTribPort() != null) {
                     @SuppressWarnings("unchecked")
                     List<Uint16> tribSlotList = (List<Uint16>) rc.getResultTribSlot().values().toArray()[0];
@@ -132,12 +135,14 @@ public class PcePathDescription {
                 .setZToA(ztoaMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
-            case StringConstants.SERVICE_TYPE_100GE:
+            case StringConstants.SERVICE_TYPE_OTUC4:
+            case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
                 ztoADirectionBldr.setZToAMaxFrequency(new FrequencyTHz(rc.getMaxFreq()));
                 ztoADirectionBldr.setZToAMinFrequency(new FrequencyTHz(rc.getMinFreq()));
                 ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
                 break;
+            case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
             case StringConstants.SERVICE_TYPE_ODU4:
index 2b199309eb831afc3f5b6cac6f537ec994d4b8ac..918d1b6e20ee6104190130cc479b8caf52c3aa04 100644 (file)
@@ -110,7 +110,8 @@ public class PceGraph {
             shortestPathAtoZ = new ArrayList<>(pathAtoZ);
             switch (serviceType) {
 
-                case StringConstants.SERVICE_TYPE_100GE:
+                case StringConstants.SERVICE_TYPE_100GE_T:
+                case StringConstants.SERVICE_TYPE_OTUC4:
                 case StringConstants.SERVICE_TYPE_400GE:
                 case StringConstants.SERVICE_TYPE_OTU4:
                     LOG.info(
index 171af2f7c5bf8e69401263f5dccf2483daa3d7c5..be2d07e113c6ef7c17421c154007e7cf308ddde1 100644 (file)
@@ -59,11 +59,12 @@ public class PostAlgoPathValidator {
         SpectrumAssignment spectrumAssignment = null;
         //variable to deal with 1GE (Nb=1) and 10GE (Nb=10) cases
         switch (serviceType) {
+            case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_400GE:
                 spectralWidthSlotNumber = GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP
                     .getOrDefault(serviceType, GridConstant.NB_SLOTS_400G);
             //fallthrough
-            case StringConstants.SERVICE_TYPE_100GE:
+            case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
                 spectrumAssignment = getSpectrumAssignment(path,
                         allPceNodes, spectralWidthSlotNumber);
@@ -113,8 +114,9 @@ public class PostAlgoPathValidator {
                 pceResult.setRC(ResponseCodes.RESPONSE_OK);
                 pceResult.setLocalCause(PceResult.LocalCause.NONE);
                 break;
+            case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_10GE:
-                tribSlotNb = 8;
+                tribSlotNb = StringConstants.SERVICE_TYPE_10GE.equals(serviceType) ? 8 : 20;
             //fallthrough
             case StringConstants.SERVICE_TYPE_1GE:
                 pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
@@ -132,8 +134,9 @@ public class PostAlgoPathValidator {
                 }
                 break;
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC4:
                 pceResult.setRC(ResponseCodes.RESPONSE_OK);
-                LOG.info("In PostAlgoPathValidator: ODU4 path found {}", path);
+                LOG.info("In PostAlgoPathValidator: ODU4/ODUC4 path found {}", path);
                 break;
             default:
                 pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
@@ -403,10 +406,17 @@ public class PostAlgoPathValidator {
             if (allPceNodes.containsKey(edge.link().getSourceId())) {
                 PceNode pceNode = allPceNodes.get(edge.link().getSourceId());
                 LOG.info("Processing PCE node {}", pceNode);
-                if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNode.getVersion())
-                        || pceNode.getSlotWidthGranularity().compareTo(GridConstant.SLOT_WIDTH_50) == 0) {
+                if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNode.getVersion())) {
                     LOG.info("Node {}: version is {} and slot width granularity is {} -> fixed grid mode",
-                            pceNode.getNodeId(), pceNode.getVersion(), pceNode.getSlotWidthGranularity());
+                        pceNode.getNodeId(), pceNode.getVersion(), pceNode.getSlotWidthGranularity());
+                    isFlexGrid = false;
+                }
+                if ((pceNode.getSlotWidthGranularity().equals(GridConstant.SLOT_WIDTH_50))
+                    && (pceNode.getCentralFreqGranularity().equals(GridConstant.SLOT_WIDTH_50))) {
+                    LOG.info("Node {}: version is {} with slot width granularity  {} and central "
+                            + "frequency granularity is {} -> fixed grid mode",
+                        pceNode.getNodeId(), pceNode.getVersion(), pceNode.getSlotWidthGranularity(),
+                        pceNode.getCentralFreqGranularity());
                     isFlexGrid = false;
                 }
                 pceNodeFreqMap = pceNode.getBitSetData();
index c94b2e0aaefa936345119b3df4f7da1adb960c6e..8dd264be372cedd3f9531f4c38654535d7a85356 100644 (file)
@@ -29,10 +29,13 @@ import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilities;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
@@ -134,45 +137,11 @@ public class PceCalculation {
         serviceRate = input.getServiceAEnd().getServiceRate().toJava();
 
         LOG.info("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId);
-        if (!(serviceFormatA.equals(serviceFormatZ))) {
-            LOG.info("parseInput: different service format for A and Z not handled, will use service format from Aend");
-        } else if (serviceRate == 100L) {
-            switch (serviceFormatA) {
-                case "Ethernet":
-                case "OC":
-                    serviceType = StringConstants.SERVICE_TYPE_100GE;
-                    break;
-                case "OTU":
-                    serviceType = StringConstants.SERVICE_TYPE_OTU4;
-                    break;
-                case "ODU":
-                    serviceType = StringConstants.SERVICE_TYPE_ODU4;
-                    break;
-                default:
-                    LOG.debug("parseInput: unsupported service type: Format {} Rate 100L", serviceFormatA);
-                    break;
-            }
-            //switch(serviceRate) may seem a better option at first glance.
-            //But switching on Long or long is not directly possible in Java.
-            //And casting to int bumps the limit here.
-            //Passing by ENUM or String are possible alternatives.
-            //Maybe HashMap and similar options should also be considered here.
-        } else if ("Ethernet".equals(serviceFormatA)) {
-        //only rate 100L is currently supported except in Ethernet
-            if (serviceRate == 400L) {
-                serviceType = StringConstants.SERVICE_TYPE_400GE;
-            } else if (serviceRate == 10L) {
-                serviceType = StringConstants.SERVICE_TYPE_10GE;
-            } else if (serviceRate == 1L) {
-                serviceType = StringConstants.SERVICE_TYPE_1GE;
-            } else {
-                LOG.debug("parseInput: unsupported service type: Format Ethernet Rate {}", serviceRate);
-            }
-        } else {
-            LOG.debug("parseInput: unsupported service type: Format {} Rate {}",
-                serviceFormatA, serviceRate);
-        }
+
+        setServiceType();
         if (StringConstants.SERVICE_TYPE_ODU4.equals(serviceType)
+                || StringConstants.SERVICE_TYPE_ODUC4.equals(serviceType)
+                || StringConstants.SERVICE_TYPE_100GE_M.equals(serviceType)
                 || StringConstants.SERVICE_TYPE_10GE.equals(serviceType)
                 || StringConstants.SERVICE_TYPE_1GE.equals(serviceType)) {
             anodeId = input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName();
@@ -187,30 +156,138 @@ public class PceCalculation {
         return true;
     }
 
+    private void setServiceType() {
+        if ("Ethernet".equals(serviceFormatA)) {
+            switch (serviceRate.intValue()) {
+                case 1:
+                    serviceType = StringConstants.SERVICE_TYPE_1GE;
+                    break;
+                case 10:
+                    serviceType = StringConstants.SERVICE_TYPE_10GE;
+                    break;
+                case 100:
+                    serviceType = StringConstants.SERVICE_TYPE_100GE_T;
+                    if (NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId())
+                        .getNodeInfo().getNodeType())) {
+                        if (input.getServiceAEnd().getTxDirection() != null
+                            && input.getServiceAEnd().getTxDirection().getPort() != null
+                            && input.getServiceAEnd().getTxDirection().getPort().getPortName() != null) {
+                            String lcp = input.getServiceAEnd().getTxDirection().getPort().getPortName();
+                            if (portMapping.getMapping(input.getServiceAEnd().getNodeId(), lcp) != null) {
+                                Mapping mapping = portMapping.getMapping(input.getServiceAEnd().getNodeId(), lcp);
+                                if (PortQual.SwitchClient.getName().equals(mapping.getPortQual())) {
+                                    serviceType = StringConstants.SERVICE_TYPE_100GE_M;
+                                }
+                            }
+                        }
+                    }
+                    break;
+                case 400:
+                    serviceType = StringConstants.SERVICE_TYPE_400GE;
+                    break;
+                default:
+                    LOG.warn("Invalid service-rate {}", serviceRate);
+                    break;
+            }
+        }
+        if ("OC".equals(serviceFormatA) && Long.valueOf(100L).equals(serviceRate)) {
+            serviceType = StringConstants.SERVICE_TYPE_100GE_T;
+        }
+        if ("OTU".equals(serviceFormatA)) {
+            switch (serviceRate.intValue()) {
+                case 100:
+                    serviceType = StringConstants.SERVICE_TYPE_OTU4;
+                    break;
+                case 400:
+                    serviceType = StringConstants.SERVICE_TYPE_OTUC4;
+                    break;
+                default:
+                    LOG.warn("Invalid service-rate {}", serviceRate);
+                    break;
+            }
+        }
+        if ("ODU".equals(serviceFormatA)) {
+            switch (serviceRate.intValue()) {
+                case 100:
+                    serviceType = StringConstants.SERVICE_TYPE_ODU4;
+                    break;
+                case 400:
+                    serviceType = StringConstants.SERVICE_TYPE_ODUC4;
+                    break;
+                default:
+                    LOG.warn("Invalid service-rate {}", serviceRate);
+                    break;
+            }
+        }
+    }
+
     private boolean readMdSal() {
         InstanceIdentifier<Network> nwInstanceIdentifier = null;
-        Network nw = null;
-        if (("OC".equals(serviceFormatA)) || ("OTU".equals(serviceFormatA))
-            || ("Ethernet".equals(serviceFormatA) && ((serviceRate == 100L) || (serviceRate == 400L)))) {
-            LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID);
-            nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
-        } else if ("ODU".equals(serviceFormatA)
-            || ("Ethernet".equals(serviceFormatA) && ((serviceRate == 10L) || (serviceRate == 1L)))) {
-            LOG.info("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID);
-            nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build();
+        switch (serviceType) {
+            case StringConstants.SERVICE_TYPE_100GE_T:
+            case StringConstants.SERVICE_TYPE_400GE:
+            case StringConstants.SERVICE_TYPE_OTU4:
+            case StringConstants.SERVICE_TYPE_OTUC4:
+                LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID);
+                nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
+                    .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
+                break;
+            case StringConstants.SERVICE_TYPE_100GE_M:
+            case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC4:
+            case StringConstants.SERVICE_TYPE_10GE:
+            case StringConstants.SERVICE_TYPE_1GE:
+                LOG.info("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID);
+                nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
+                    .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build();
+                break;
+            default:
+                LOG.warn("readMdSal: unknown service-type for service-rate {} and service-format {}", serviceRate,
+                    serviceFormatA);
+                break;
+        }
+
+        if (readTopology(nwInstanceIdentifier) != null) {
+            allNodes = readTopology(nwInstanceIdentifier).nonnullNode().values().stream().sorted((n1, n2)
+                -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList());
+            Network1 nw1 = readTopology(nwInstanceIdentifier).augmentation(Network1.class);
+            if (nw1 != null) {
+                allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2)
+                    -> l1.getSource().getSourceTp().toString().compareTo(l2.getSource().getSourceTp().toString()))
+                        .collect(Collectors.toList());
+            } else {
+                LOG.warn("no otn links in otn-topology");
+            }
+            if (allNodes == null || allNodes.isEmpty()) {
+                LOG.error("readMdSal: no nodes ");
+                return false;
+            }
+            LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size());
+            LOG.debug("readMdSal: network nodes: {} nodes added", allNodes);
+
+            if (allLinks == null || allLinks.isEmpty()) {
+                LOG.error("readMdSal: no links ");
+                return false;
+            }
+            LOG.info("readMdSal: network links: {} links added", allLinks.size());
+            LOG.debug("readMdSal: network links: {} links added", allLinks);
+
+            return true;
         } else {
-            LOG.info("readMdSal: service-rate {} / service-format not handled {}", serviceRate, serviceFormatA);
+            LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier);
             return false;
         }
+    }
 
+    private Network readTopology(InstanceIdentifier<Network> nwInstanceIdentifier) {
+        Network nw = null;
         try {
             Optional<Network> nwOptional =
                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier).get();
             if (nwOptional.isPresent()) {
                 nw = nwOptional.get();
                 LOG.debug("readMdSal: network nodes: nwOptional.isPresent = true {}", nw);
+                networkTransactionService.close();
             }
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("readMdSal: Error reading topology {}", nwInstanceIdentifier);
@@ -219,46 +296,17 @@ public class PceCalculation {
             throw new RuntimeException(
                 "readMdSal: Error reading from operational store, topology : " + nwInstanceIdentifier + " :" + e);
         }
-        networkTransactionService.close();
-
-        if (nw == null) {
-            LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier);
-            return false;
-        }
-        allNodes = nw.nonnullNode().values().stream().sorted((n1, n2)
-            -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList());
-        Network1 nw1 = nw.augmentation(Network1.class);
-        if (nw1 != null) {
-            allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2)
-                -> l1.getSource().getSourceTp().toString().compareTo(l2.getSource().getSourceTp().toString()))
-                    .collect(Collectors.toList());
-        } else {
-            LOG.warn("no otn links in otn-topology");
-        }
-        if (allNodes == null || allNodes.isEmpty()) {
-            LOG.error("readMdSal: no nodes ");
-            return false;
-        }
-        LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size());
-        LOG.debug("readMdSal: network nodes: {} nodes added", allNodes);
-
-        if (allLinks == null || allLinks.isEmpty()) {
-            LOG.error("readMdSal: no links ");
-            return false;
-        }
-        LOG.info("readMdSal: network links: {} links added", allLinks.size());
-        LOG.debug("readMdSal: network links: {} links added", allLinks);
-
-        return true;
+        return nw;
     }
 
     private boolean analyzeNw() {
 
         LOG.debug("analyzeNw: allNodes size {}, allLinks size {}", allNodes.size(), allLinks.size());
 
-        if (StringConstants.SERVICE_TYPE_100GE.equals(serviceType)
+        if (StringConstants.SERVICE_TYPE_100GE_T.equals(serviceType)
                 || StringConstants.SERVICE_TYPE_OTU4.equals(serviceType)
-                || StringConstants.SERVICE_TYPE_400GE.equals(serviceType)) {
+                || StringConstants.SERVICE_TYPE_400GE.equals(serviceType)
+                || StringConstants.SERVICE_TYPE_OTUC4.equals(serviceType)) {
             // 100GE service and OTU4 service are handled at the openroadm-topology layer
             for (Node node : allNodes) {
                 validateNode(node);
@@ -380,117 +428,22 @@ public class PceCalculation {
             return false;
         }
 
-        if (StringConstants.SERVICE_TYPE_100GE.equals(serviceType)
-                || StringConstants.SERVICE_TYPE_OTU4.equals(serviceType)
-                || StringConstants.SERVICE_TYPE_400GE.equals(serviceType)) {
-            // 100GE or 400GE or OTU4 services are handled at WDM Layer
-            PceLink pcelink = new PceLink(link, source, dest);
-            if (!pcelink.isValid()) {
-                dropOppositeLink(link);
-                LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link");
-                return false;
-            }
-            LinkId linkId = pcelink.getLinkId();
-            if (validateLinkConstraints(pcelink).equals(ConstraintTypes.HARD_EXCLUDE)) {
-                dropOppositeLink(link);
-                LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue());
-                return false;
-            }
-            switch (pcelink.getlinkType()) {
-                case ROADMTOROADM:
-                case EXPRESSLINK:
-                    allPceLinks.put(linkId, pcelink);
-                    source.addOutgoingLink(pcelink);
-                    LOG.debug("validateLink: {}-LINK added to allPceLinks {}",
-                        pcelink.getlinkType(), pcelink);
-                    break;
-                case ADDLINK:
-                    pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString()));
-                    addLinks.add(pcelink);
-                    LOG.debug("validateLink: ADD-LINK saved  {}", pcelink);
-                    break;
-                case DROPLINK:
-                    pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString()));
-                    dropLinks.add(pcelink);
-                    LOG.debug("validateLink: DROP-LINK saved  {}", pcelink);
-                    break;
-                case XPONDERINPUT:
-                    // store separately all SRG links directly
-                    azSrgs.add(sourceId);
-                    // connected to A/Z
-                    if (!dest.checkTP(pcelink.getDestTP().toString())) {
-                        LOG.debug(
-                            "validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink);
-                        return false;
-                    }
-                    if (dest.getXpdrClient(pcelink.getDestTP().toString()) != null) {
-                        pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().toString()));
-                    }
-                    allPceLinks.put(linkId, pcelink);
-                    source.addOutgoingLink(pcelink);
-                    LOG.debug("validateLink: XPONDER-INPUT link added to allPceLinks {}", pcelink);
-                    break;
-                // does it mean XPONDER==>>SRG ?
-                case XPONDEROUTPUT:
-                    // store separately all SRG links directly
-                    azSrgs.add(destId);
-                    // connected to A/Z
-                    if (!source.checkTP(pcelink.getSourceTP().toString())) {
-                        LOG.debug(
-                            "validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink);
-                        return false;
-                    }
-                    if (source.getXpdrClient(pcelink.getSourceTP().toString()) != null) {
-                        pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().toString()));
-                    }
-                    allPceLinks.put(linkId, pcelink);
-                    source.addOutgoingLink(pcelink);
-                    LOG.debug("validateLink: XPONDER-OUTPUT link added to allPceLinks {}", pcelink);
-                    break;
-                default:
-                    LOG.warn("validateLink: link type is not supported {}", pcelink);
-            }
-            return true;
-
-        } else if ((StringConstants.SERVICE_TYPE_ODU4.equals(serviceType))
-                || (StringConstants.SERVICE_TYPE_10GE.equals(serviceType))
-                || (StringConstants.SERVICE_TYPE_1GE.equals(serviceType))) {
-            // ODU4, 1GE and 10GE services relying on ODU2, ODU2e or ODU0 services are handled at OTN layer
-            PceLink pceOtnLink = new PceLink(link, source, dest);
-
-            if (!pceOtnLink.isOtnValid(link, serviceType)) {
-                dropOppositeLink(link);
-                LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link");
-                return false;
-            }
-
-            LinkId linkId = pceOtnLink.getLinkId();
-            if (validateLinkConstraints(pceOtnLink).equals(ConstraintTypes.HARD_EXCLUDE)) {
-                dropOppositeLink(link);
-                LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue());
+        switch (serviceType) {
+            case StringConstants.SERVICE_TYPE_100GE_T:
+            case StringConstants.SERVICE_TYPE_OTU4:
+            case StringConstants.SERVICE_TYPE_OTUC4:
+            case StringConstants.SERVICE_TYPE_400GE:
+                return processPceLink(link, sourceId, destId, source, dest);
+            case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_10GE:
+            case StringConstants.SERVICE_TYPE_100GE_M:
+            case StringConstants.SERVICE_TYPE_ODUC4:
+            case StringConstants.SERVICE_TYPE_1GE:
+                return processPceOtnLink(link, source, dest);
+            default:
+                LOG.error(" validateLink: Unmanaged service type {}", serviceType);
                 return false;
-            }
-
-            switch (pceOtnLink.getlinkType()) {
-                case OTNLINK:
-                    if (dest.getXpdrClient(pceOtnLink.getDestTP().toString()) != null) {
-                        pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().toString()));
-                    }
-
-                    allPceLinks.put(linkId, pceOtnLink);
-                    source.addOutgoingLink(pceOtnLink);
-                    LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink);
-                    break;
-                default:
-                    LOG.warn("validateLink: link type is not supported {}", pceOtnLink);
-            }
-            return true;
-
-        } else {
-            LOG.error(" validateLink: Unmanaged service type {}", serviceType);
-            return false;
         }
-
     }
 
     private void validateNode(Node node) {
@@ -516,7 +469,8 @@ public class PceCalculation {
 
         LOG.info("Device node id {} for {}", deviceNodeId, node);
         PceOpticalNode pceNode = new PceOpticalNode(deviceNodeId, this.serviceType, portMapping, node, nodeType,
-            mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()));
+            mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()),
+            getCentralFreqGranularity(deviceNodeId, node.getNodeId()));
         pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat());
         pceNode.initFrequenciesBitSet();
 
@@ -662,6 +616,108 @@ public class PceCalculation {
         return true;
     }
 
+    private boolean processPceLink(Link link, NodeId sourceId, NodeId destId, PceNode source, PceNode dest) {
+        PceLink pcelink = new PceLink(link, source, dest);
+        if (!pcelink.isValid()) {
+            dropOppositeLink(link);
+            LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link");
+            return false;
+        }
+        LinkId linkId = pcelink.getLinkId();
+        if (validateLinkConstraints(pcelink).equals(ConstraintTypes.HARD_EXCLUDE)) {
+            dropOppositeLink(link);
+            LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue());
+            return false;
+        }
+        switch (pcelink.getlinkType()) {
+            case ROADMTOROADM:
+            case EXPRESSLINK:
+                allPceLinks.put(linkId, pcelink);
+                source.addOutgoingLink(pcelink);
+                LOG.debug("validateLink: {}-LINK added to allPceLinks {}",
+                    pcelink.getlinkType(), pcelink);
+                break;
+            case ADDLINK:
+                pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString()));
+                addLinks.add(pcelink);
+                LOG.debug("validateLink: ADD-LINK saved  {}", pcelink);
+                break;
+            case DROPLINK:
+                pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString()));
+                dropLinks.add(pcelink);
+                LOG.debug("validateLink: DROP-LINK saved  {}", pcelink);
+                break;
+            case XPONDERINPUT:
+                // store separately all SRG links directly
+                azSrgs.add(sourceId);
+                // connected to A/Z
+                if (!dest.checkTP(pcelink.getDestTP().toString())) {
+                    LOG.debug(
+                        "validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink);
+                    return false;
+                }
+                if (dest.getXpdrClient(pcelink.getDestTP().toString()) != null) {
+                    pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().toString()));
+                }
+                allPceLinks.put(linkId, pcelink);
+                source.addOutgoingLink(pcelink);
+                LOG.debug("validateLink: XPONDER-INPUT link added to allPceLinks {}", pcelink);
+                break;
+            // does it mean XPONDER==>>SRG ?
+            case XPONDEROUTPUT:
+                // store separately all SRG links directly
+                azSrgs.add(destId);
+                // connected to A/Z
+                if (!source.checkTP(pcelink.getSourceTP().toString())) {
+                    LOG.debug(
+                        "validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink);
+                    return false;
+                }
+                if (source.getXpdrClient(pcelink.getSourceTP().toString()) != null) {
+                    pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().toString()));
+                }
+                allPceLinks.put(linkId, pcelink);
+                source.addOutgoingLink(pcelink);
+                LOG.debug("validateLink: XPONDER-OUTPUT link added to allPceLinks {}", pcelink);
+                break;
+            default:
+                LOG.warn("validateLink: link type is not supported {}", pcelink);
+        }
+        return true;
+    }
+
+    private boolean processPceOtnLink(Link link, PceNode source, PceNode dest) {
+        PceLink pceOtnLink = new PceLink(link, source, dest);
+
+        if (!pceOtnLink.isOtnValid(link, serviceType)) {
+            dropOppositeLink(link);
+            LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link");
+            return false;
+        }
+
+        LinkId linkId = pceOtnLink.getLinkId();
+        if (validateLinkConstraints(pceOtnLink).equals(ConstraintTypes.HARD_EXCLUDE)) {
+            dropOppositeLink(link);
+            LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue());
+            return false;
+        }
+
+        switch (pceOtnLink.getlinkType()) {
+            case OTNLINK:
+                if (dest.getXpdrClient(pceOtnLink.getDestTP().toString()) != null) {
+                    pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().toString()));
+                }
+
+                allPceLinks.put(linkId, pceOtnLink);
+                source.addOutgoingLink(pceOtnLink);
+                LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink);
+                break;
+            default:
+                LOG.warn("validateLink: link type is not supported {}", pceOtnLink);
+        }
+        return true;
+    }
+
     public PceNode getaendPceNode() {
         return aendPceNode;
     }
@@ -704,14 +760,44 @@ public class PceCalculation {
         // deviceNodeId: openroadm-network level node
         List<McCapabilities> mcCapabilities = mappingUtils.getMcCapabilitiesForNode(deviceNodeId);
         String[] params = nodeId.getValue().split("-");
-        // DEGX or SRGX
-        String rdmModuleName = params[params.length - 1];
+        // DEGx or SRGx or XPDRx
+        String moduleName = params[params.length - 1];
         for (McCapabilities mcCapabitility : mcCapabilities) {
-            if (mcCapabitility.getMcNodeName().contains(rdmModuleName)
+            if (mcCapabitility.getMcNodeName().contains("XPDR")
+                && mcCapabitility.getSlotWidthGranularity() != null) {
+                return mcCapabitility.getSlotWidthGranularity().getValue();
+            }
+            if (mcCapabitility.getMcNodeName().contains(moduleName)
                     && mcCapabitility.getSlotWidthGranularity() != null) {
                 return mcCapabitility.getSlotWidthGranularity().getValue();
             }
         }
         return GridConstant.SLOT_WIDTH_50;
     }
+
+    /**
+     * Get mc capability central-width granularity for device.
+     * @param deviceNodeId String
+     * @param nodeId NodeId
+     * @return center-freq granularity
+     */
+    private BigDecimal getCentralFreqGranularity(String deviceNodeId, NodeId nodeId) {
+        // nodeId: openroadm-topology level node
+        // deviceNodeId: openroadm-network level node
+        List<McCapabilities> mcCapabilities = mappingUtils.getMcCapabilitiesForNode(deviceNodeId);
+        String[] params = nodeId.getValue().split("-");
+        // DEGx or SRGx or XPDRx
+        String moduleName = params[params.length - 1];
+        for (McCapabilities mcCapabitility : mcCapabilities) {
+            if (mcCapabitility.getMcNodeName().contains("XPDR")
+                && mcCapabitility.getCenterFreqGranularity() != null) {
+                return mcCapabitility.getCenterFreqGranularity().getValue();
+            }
+            if (mcCapabitility.getMcNodeName().contains(moduleName)
+                && mcCapabitility.getCenterFreqGranularity() != null) {
+                return mcCapabitility.getCenterFreqGranularity().getValue();
+            }
+        }
+        return GridConstant.SLOT_WIDTH_50;
+    }
 }
index 4c754507cc11aee21fbe68c44c61f4357694f746..807b4baac5fb9afb1b14233cc8e30643d7e66ef8 100644 (file)
@@ -24,7 +24,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev200529.span.attri
 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev200529.span.attributes.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.link.oms.attributes.Span;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
@@ -319,7 +319,7 @@ public class PceLink implements Serializable {
         }
 
         OtnLinkType otnLinkType = link
-            .augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1.class)
+            .augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1.class)
             .getOtnLinkType();
         if (this.availableBandwidth == 0L) {
             LOG.error("PceLink: No bandwidth available for OTN Link, link {}  is ignored ", linkId);
@@ -329,7 +329,13 @@ public class PceLink implements Serializable {
         long neededBW;
         OtnLinkType neededType = null;
         switch (serviceType) {
-
+            case "ODUC4":
+                if (this.usedBandwidth != 0L) {
+                    return false;
+                }
+                neededBW = 400000L;
+                neededType = OtnLinkType.OTUC4;
+                break;
             case "ODU4":
                 if (this.usedBandwidth != 0L) {
                     return false;
@@ -347,6 +353,10 @@ public class PceLink implements Serializable {
             case "ODU1":
                 neededBW = 2500L;
                 break;
+            case "100GEm":
+                neededBW = 100000L;
+                neededType = OtnLinkType.ODUC4;
+                break;
             case "10GE":
                 neededBW = 10000L;
                 neededType = OtnLinkType.ODTU4;
index bc28e0b9a0d7dc0699d7de846a4a83dd162c5b74..5e89108ffd6dc163bd427b3316ff39c018219b6a 100644 (file)
@@ -61,4 +61,10 @@ public interface PceNode {
      * @return BigDecimal.
      */
     BigDecimal getSlotWidthGranularity();
+
+    /**
+     * For optical node the central-frequency granularity from mc capabilities.
+     * @return BigDecimal.
+     */
+    BigDecimal getCentralFreqGranularity();
 }
index 0cc8a9ff73887c1b86409a3e11320d62f5e54314..c66af5952ff99835939419b9fbe28ffd90b3878f 100644 (file)
@@ -29,7 +29,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.O
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.available.freq.map.AvailFreqMapsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOTUCnODUCn;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -60,9 +60,12 @@ public class PceOpticalNode implements PceNode {
     private BitSet frequenciesBitSet;
     private String version;
     private BigDecimal slotWidthGranularity;
+    private BigDecimal centralFreqGranularity;
 
     public PceOpticalNode(String deviceNodeId, String serviceType, PortMapping portMapping, Node node,
-        OpenroadmNodeType nodeType, String version, BigDecimal slotWidthGranularity) {
+        OpenroadmNodeType nodeType, String version, BigDecimal slotWidthGranularity,
+        BigDecimal centralFreqGranularity) {
+
         if (deviceNodeId != null
                 && serviceType != null
                 && portMapping != null
@@ -79,6 +82,7 @@ public class PceOpticalNode implements PceNode {
             this.nodeType = nodeType;
             this.version = version;
             this.slotWidthGranularity = slotWidthGranularity;
+            this.centralFreqGranularity = centralFreqGranularity;
             this.adminStates = node.augmentation(org.opendaylight.yang.gen.v1.http
                     .org.openroadm.common.network.rev200529.Node1.class).getAdministrativeState();
             this.state = node.augmentation(org.opendaylight.yang.gen.v1.http
@@ -173,7 +177,7 @@ public class PceOpticalNode implements PceNode {
         }
         switch (this.serviceType) {
             case "400GE":
-                if (mapping.getSupportedInterfaceCapability().contains(IfOTUCnODUCn.class)) {
+                if (mapping.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) {
                     return true;
                 } else {
                     return false;
@@ -288,8 +292,8 @@ public class PceOpticalNode implements PceNode {
             }
             // find Client of this network TP
             String client;
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 =
-                    tp.augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1 tpceTp1 =
+                    tp.augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511
                             .TerminationPoint1.class);
             if (tpceTp1 != null) {
                 client = tpceTp1.getAssociatedConnectionMapPort();
@@ -475,4 +479,14 @@ public class PceOpticalNode implements PceNode {
         return slotWidthGranularity;
     }
 
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getCentralFreqGranularity()
+     */
+    @Override
+    public BigDecimal getCentralFreqGranularity() {
+        return centralFreqGranularity;
+    }
+
 }
index 736539d9404ed7b3289b607f566d6d2db1f4573d..7b9b5cb8cdfaf43ea4147d284a4c165e8e09bb08 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.O
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPools;
@@ -34,6 +35,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2e;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If1GEODU0;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
@@ -126,51 +128,56 @@ public class PceOtnNode implements PceNode {
                 = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
                 .TerminationPoint1.class);
             //TODO many nested if-structures below, this needs to be reworked
-            if (OpenroadmTpType.XPONDERNETWORK.equals(ocnTp1.getTpType())
-                    && StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType)) {
+            if (OpenroadmTpType.XPONDERNETWORK.equals(ocnTp1.getTpType())) {
                 TerminationPoint1 ontTp1;
                 if (tp.augmentation(TerminationPoint1.class) != null) {
                     ontTp1 = tp.augmentation(TerminationPoint1.class);
                 } else {
                     continue;
                 }
-                if (checkTpForOdtuTermination(ontTp1)) {
-                    LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
-                    this.availableXpdrNWTps.add(tp.getTpId());
-                } else {
-                    LOG.error("TP {} of {} does not allow ODU4 termination creation", tp.getTpId().getValue(),
-                        node.getNodeId().getValue());
-                }
-            } else if (OpenroadmTpType.XPONDERNETWORK.equals(ocnTp1.getTpType())
-                && (this.otnServiceType.equals(StringConstants.SERVICE_TYPE_10GE)
-                        || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))) {
-                TerminationPoint1 ontTp1;
-                if (tp.augmentation(TerminationPoint1.class) != null) {
-                    ontTp1 = tp.augmentation(TerminationPoint1.class);
-                } else {
-                    continue;
-                }
-                if (StringConstants.SERVICE_TYPE_10GE.equals(otnServiceType)
-                        && checkOdtuTTPforLoOduCreation(ontTp1, 10)
-                    || StringConstants.SERVICE_TYPE_1GE.equals(otnServiceType)
-                    && checkOdtuTTPforLoOduCreation(ontTp1, 1)) {
-                    LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
-                    this.availableXpdrNWTps.add(tp.getTpId());
-                } else {
-                    if (StringConstants.SERVICE_TYPE_10GE.equals(otnServiceType)) {
-                        LOG.error("TP {} of {} does not allow OD2e termination creation", tp.getTpId().getValue(),
-                            node.getNodeId().getValue());
-                    } else if (StringConstants.SERVICE_TYPE_1GE.equals(otnServiceType)) {
-                        LOG.error("TP {} of {} does not allow ODU0 termination creation", tp.getTpId().getValue(),
-                            node.getNodeId().getValue());
-                    } else {
-                        LOG.error("TP {} of {} does not allow any termination creation", tp.getTpId().getValue(),
-                            node.getNodeId().getValue());
-                    }
+                switch (this.otnServiceType) {
+                    case StringConstants.SERVICE_TYPE_ODU4:
+                    case StringConstants.SERVICE_TYPE_ODUC4:
+                        if (!checkTpForOdtuTermination(ontTp1)) {
+                            LOG.error("TP {} of {} does not allow ODU4 termination creation",
+                                tp.getTpId().getValue(), node.getNodeId().getValue());
+                            continue;
+                        }
+                        break;
+
+                    case StringConstants.SERVICE_TYPE_10GE:
+                        if (!checkOdtuTTPforLoOduCreation(ontTp1, 10)) {
+                            LOG.error("TP {} of {} does not allow OD2e termination creation",
+                                tp.getTpId().getValue(), node.getNodeId().getValue());
+                            continue;
+                        }
+                        break;
+                    case StringConstants.SERVICE_TYPE_100GE_M:
+                        if (!checkOdtuTTPforLoOduCreation(ontTp1, 20)) {
+                            LOG.error("TP {} of {} does not allow ODU4 termination creation",
+                                tp.getTpId().getValue(), node.getNodeId().getValue());
+                            continue;
+                        }
+                        break;
+                    case StringConstants.SERVICE_TYPE_1GE:
+                        if (!checkOdtuTTPforLoOduCreation(ontTp1, 1)) {
+                            LOG.error("TP {} of {} does not allow ODU0 termination creation",
+                                tp.getTpId().getValue(), node.getNodeId().getValue());
+                            continue;
+                        }
+                        break;
+
+                    default:
+                        LOG.error("TP {} of {} does not allow any termination creation",
+                            tp.getTpId().getValue(), node.getNodeId().getValue());
+                        continue;
                 }
+                LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
+                this.availableXpdrNWTps.add(tp.getTpId());
             } else if (OpenroadmTpType.XPONDERCLIENT.equals(ocnTp1.getTpType())
                 && (StringConstants.SERVICE_TYPE_10GE.equals(this.otnServiceType)
-                        || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))) {
+                    || StringConstants.SERVICE_TYPE_100GE_M.equals(this.otnServiceType)
+                    || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))) {
                 TerminationPoint1 ontTp1;
                 if (tp.augmentation(TerminationPoint1.class) != null) {
                     ontTp1 = tp.augmentation(TerminationPoint1.class);
@@ -187,8 +194,10 @@ public class PceOtnNode implements PceNode {
             }
         }
 
-        if ((StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType) && mode.equals("AZ"))
+        if (((StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType)
+                || StringConstants.SERVICE_TYPE_ODUC4.equals(this.otnServiceType)) && mode.equals("AZ"))
             || ((StringConstants.SERVICE_TYPE_10GE.equals(this.otnServiceType)
+                    || StringConstants.SERVICE_TYPE_100GE_M.equals(this.otnServiceType)
                     || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))
                 && ((mode.equals("AZ") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 1, 1))
                      || (mode.equals("intermediate") && checkSwPool(null, availableXpdrNWTps, 0, 2)))
@@ -244,9 +253,10 @@ public class PceOtnNode implements PceNode {
     private boolean checkTpForOdtuTermination(TerminationPoint1 ontTp1) {
         for (SupportedInterfaceCapability sic : ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability()
                 .values()) {
-            LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
-            if (sic.getIfCapType().equals(IfOCHOTU4ODU4.class)
-                && ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null) {
+            LOG.info("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
+            if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class) || sic.getIfCapType().equals(IfOtsiOtsigroup.class))
+                && (ontTp1.getXpdrTpPortConnectionAttributes() == null
+                    || ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) {
                 return true;
             }
         }
@@ -257,9 +267,13 @@ public class PceOtnNode implements PceNode {
         if (ontTp1.getXpdrTpPortConnectionAttributes() != null
             && ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() != null
             && ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool() != null
-            && ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
+            && (ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
                 .stream().findFirst().get().getOdtuType()
                 .equals(ODTU4TsAllocated.class)
+                ||
+                ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
+                .stream().findFirst().get().getOdtuType()
+                .equals(ODTUCnTs.class))
             && !ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
                 .stream().findFirst().get().getTpnPool().isEmpty()
             && (ontTp1.getXpdrTpPortConnectionAttributes().getTsPool().size() >= tsNb)) {
@@ -284,7 +298,8 @@ public class PceOtnNode implements PceNode {
                         return true;
                     }
                     break;
-                case StringConstants.SERVICE_TYPE_100GE:
+                case StringConstants.SERVICE_TYPE_100GE_T:
+                case StringConstants.SERVICE_TYPE_100GE_M:
                     if (sic.getIfCapType().equals(If100GEODU4.class)) {
                         return true;
                     }
@@ -370,9 +385,12 @@ public class PceOtnNode implements PceNode {
             .collect(Collectors.toList());
 
         for (TerminationPoint tp : networkTpList) {
-            if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool() != null
-                && tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool()
-                    .values().stream().findFirst().get().getOdtuType().equals(ODTU4TsAllocated.class)) {
+            if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes() != null
+                && tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool() != null
+                && (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool()
+                    .values().stream().findFirst().get().getOdtuType().equals(ODTU4TsAllocated.class)
+                    || tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool()
+                    .values().stream().findFirst().get().getOdtuType().equals(ODTUCnTs.class))) {
                 @Nullable
                 List<Uint16> tpnPool = tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes()
                     .getOdtuTpnPool().values().stream().findFirst().get().getTpnPool();
@@ -394,7 +412,8 @@ public class PceOtnNode implements PceNode {
             .collect(Collectors.toList());
 
         for (TerminationPoint tp : networkTpList) {
-            if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getTsPool() != null) {
+            if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes() != null
+                && tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getTsPool() != null) {
                 @Nullable
                 List<Uint16> tsPool = tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes()
                     .getTsPool();
@@ -574,4 +593,14 @@ public class PceOtnNode implements PceNode {
     public BigDecimal getSlotWidthGranularity() {
         return null;
     }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.opendaylight.transportpce.pce.networkanalyzer.PceNode#getCentralFreqGranularity()
+     */
+    @Override
+    public BigDecimal getCentralFreqGranularity() {
+        return null;
+    }
 }
index 6ea97283817cbb25c3d1b97977c8e8d174bb75c5..92e1d38ad959cecca30e893a5ecbec310f3df4f2 100644 (file)
@@ -61,9 +61,11 @@ public class PcePathDescriptionTests extends AbstractTest {
         NodeBuilder node1Builder = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes());
         node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
+                GridConstant.SLOT_WIDTH_50);
         PceOpticalNode pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
+                GridConstant.SLOT_WIDTH_50);
 
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
         pceLink.setClient("XPONDER-CLIENT");
@@ -71,7 +73,7 @@ public class PcePathDescriptionTests extends AbstractTest {
         pceResult = new PceResult();
         pceResult.setRC("200");
         pceResult.setRate(Long.valueOf(1));
-        pceResult.setServiceType(StringConstants.SERVICE_TYPE_100GE);
+        pceResult.setServiceType(StringConstants.SERVICE_TYPE_100GE_T);
         Map<LinkId, PceLink> map = Map.of(new LinkId("OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1"), pceLink);
         pcePathDescription = new PcePathDescription(List.of(pceLink),
                 map, pceResult);
index 5ce1b63f7cc82b9c6d41f643bd0f49576ece4cf7..cc2f80d043d7438fa8de62ec0b81678255247a03 100644 (file)
@@ -8,6 +8,9 @@
 package org.opendaylight.transportpce.pce;
 
 
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -25,6 +28,14 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -32,6 +43,7 @@ public class PceSendingPceRPCsTest extends AbstractTest {
 
     private PceSendingPceRPCs pceSendingPceRPCs;
     private NetworkTransactionImpl networkTransaction;
+    private Mapping mapping;
     @Mock
     private YangParserFactory yangParserFactory;
     @Mock
@@ -52,6 +64,12 @@ public class PceSendingPceRPCsTest extends AbstractTest {
                 "mylogin", "mypassword", getDataStoreContextUtil().getBindingDOMCodecServices());
         pceSendingPceRPCs = new PceSendingPceRPCs(PceTestData.getPCE_test1_request_54(),
                         networkTransaction, gnpyConsumer, portMapping);
+        mapping = new MappingBuilder().setLogicalConnectionPoint("logicalConnectionPoint").setPortQual("xpdr-client")
+            .build();
+        NodeInfo info = new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr).build();
+        Nodes node = new NodesBuilder().withKey(new NodesKey("node")).setNodeId("node").setNodeInfo(info).build();
+        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
+        when(portMapping.getNode(anyString())).thenReturn(node);
     }
 
     @Test
@@ -66,7 +84,7 @@ public class PceSendingPceRPCsTest extends AbstractTest {
         pceSendingPceRPCs =
                 new PceSendingPceRPCs(PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
                         networkTransaction, gnpyConsumer, portMapping);
-
+        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
         pceSendingPceRPCs.pathComputation();
         Assert.assertTrue(gnpyConsumer.isAvailable());
         jerseyServer.tearDown();
index be90393f870da0ada03609b22a512e553ce663e9..9142415f88a7c340ffe0c7896d99d1ad9483ee55 100644 (file)
@@ -107,7 +107,7 @@ public class PceConstraintsTest extends AbstractTest {
     @Test
     public void getIncludePceNodesTest() {
         Assert.assertTrue(pceConstraints.getIncludePceNodes().size() == 0);
-        pceConstraints.setIncludePceNode(new PceOpticalNode(null, null, null, null, null, null, null));
+        pceConstraints.setIncludePceNode(new PceOpticalNode(null, null, null, null, null, null, null, null));
         Assert.assertTrue(pceConstraints.getIncludePceNodes().size() == 1);
 
     }
index b7e38cbc9e028a87f0b900add2484ad26851034e..ef8bfbb278cc622087c67122fd61e01a9b685f82 100644 (file)
@@ -47,9 +47,11 @@ public class PceGraphEdgeTest {
         node =  NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes()).build();
 
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         PceOpticalNode pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
 
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
         pceLink.setClient("XPONDER-CLIENT");
index 1b89575f88f1f3beb28f41916a7c000f19fec0c3..acc6465cce86bd72254ac4d5c72176a08faeebf8 100644 (file)
@@ -66,12 +66,14 @@ public class PceGraphTest {
                 .setNodeId(nodeId).withKey(new NodeKey(nodeId))
                 .build();
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         NodeId nodeId2 = new NodeId("OpenROADM-3-1-DEG1");
         Node node2 = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes())
                 .setNodeId(nodeId2).withKey(new NodeKey(nodeId2)).build();
         pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node2,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
         pceLink.setClient("XPONDER-CLIENT");
 
@@ -111,7 +113,7 @@ public class PceGraphTest {
         pceGraph = new PceGraph(pceOpticalNode, pceOpticalNode2, allPceNodes,
                 pceHardConstraints,
                 null, rc,
-                StringConstants.SERVICE_TYPE_100GE);
+                StringConstants.SERVICE_TYPE_100GE_T);
 
         Assert.assertEquals(pceGraph.calcPath(), false);
     }
index 46c78cab7c0f3184c4ff423262ef164acc5c06c3..961814b303ec37702ba92d7c4ae5ee26b018ca9f 100644 (file)
@@ -7,11 +7,18 @@
  */
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
 import java.util.concurrent.ExecutionException;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.transportpce.common.StringConstants;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
@@ -20,12 +27,26 @@ import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestInput;
-
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
+//import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
+
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class PceCalculationTest extends AbstractTest {
 
     private PceCalculation pceCalculation;
     private PceConstraintsCalc pceConstraintsCalc;
     private PceResult pceResult = new PceResult();
+    private Mapping mapping;
+
+    @Mock
+    private PortMapping portMapping;
 
     // setup object
     @Before
@@ -33,24 +54,27 @@ public class PceCalculationTest extends AbstractTest {
         pceResult.setRC("200");
         PceTestUtils.writeNetworkIntoDataStore(this.getDataBroker(), this.getDataStoreContextUtil(),
                 TransactionUtils.getNetworkForSpanLoss());
-
         pceConstraintsCalc = new PceConstraintsCalc(PceTestData.getPCERequest(),
                 new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())));
-
-        pceCalculation = new PceCalculation(
-                PceTestData.getPCERequest(),
-                new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())),
-                pceConstraintsCalc.getPceHardConstraints(),
-                pceConstraintsCalc.getPceSoftConstraints(),
-                pceResult,
-                null);
+        mapping = new MappingBuilder().setLogicalConnectionPoint("logicalConnectionPoint").setPortQual("xpdr-client")
+            .build();
+        NodeInfo info = new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr).build();
+        Nodes node = new NodesBuilder().withKey(new NodesKey("node")).setNodeId("node").setNodeInfo(info).build();
+        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
+        when(portMapping.getNode(anyString())).thenReturn(node);
     }
 
     @Test
     public void testPceCalculationValues() {
-
+        pceCalculation = new PceCalculation(
+            PceTestData.getPCERequest(),
+            new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())),
+            pceConstraintsCalc.getPceHardConstraints(),
+            pceConstraintsCalc.getPceSoftConstraints(),
+            pceResult,
+            portMapping);
         pceCalculation.retrievePceNetwork();
-        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE, pceCalculation.getServiceType());
+        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
         Assert.assertNotNull(pceCalculation.getReturnStructure());
 
         Assert.assertNull(pceCalculation.getaendPceNode());
@@ -59,15 +83,14 @@ public class PceCalculationTest extends AbstractTest {
 
     @Test
     public void testPceCalculationValues2() {
-
         pceCalculation = new PceCalculation(
                 PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral(),
                 new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())),
                 pceConstraintsCalc.getPceHardConstraints(),
                 pceConstraintsCalc.getPceSoftConstraints(),
-                pceResult, null);
+                pceResult, portMapping);
         pceCalculation.retrievePceNetwork();
-        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE, pceCalculation.getServiceType());
+        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
         Assert.assertNotNull(pceCalculation.getReturnStructure());
 
         Assert.assertNull(pceCalculation.getaendPceNode());
@@ -76,20 +99,17 @@ public class PceCalculationTest extends AbstractTest {
 
     @Test
     public void testPceCalculationValues42() {
-
         PathComputationRequestInput input = PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral2();
         pceConstraintsCalc = new PceConstraintsCalc(input,
                 new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())));
-
         pceCalculation = new PceCalculation(
                 PceTestData.getPCE_test3_request_54(),
                 new NetworkTransactionImpl(new RequestProcessor(this.getDataBroker())),
                 pceConstraintsCalc.getPceHardConstraints(),
                 pceConstraintsCalc.getPceSoftConstraints(),
-                pceResult, null);
-
+                pceResult, portMapping);
         pceCalculation.retrievePceNetwork();
-//        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE, pceCalculation.getServiceType());
+        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
         Assert.assertNotNull(pceCalculation.getReturnStructure());
 
         Assert.assertNull(pceCalculation.getaendPceNode());
index 243a1bb17d52b6936879e55eed12a706128d23d8..101e940e1d7f995cbb30897366e324521e4d7e0c 100644 (file)
@@ -79,7 +79,8 @@ public class PceLinkTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
         Node node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
     }
 
@@ -92,7 +93,8 @@ public class PceLinkTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
         Node node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
     }
 
@@ -105,7 +107,8 @@ public class PceLinkTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
         Node node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
 
     }
@@ -119,7 +122,8 @@ public class PceLinkTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
         Node node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
     }
 
@@ -132,7 +136,8 @@ public class PceLinkTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
         Node node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
         Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link));
         Assert.assertNotNull(pceLink.calcSpanOSNR());
index da0144307aeaf1a29820cc4f7a10f92eff4393f6..b4dc9655336d8264aa09cb33d3d8dc572f7acbc0 100644 (file)
@@ -85,7 +85,7 @@ public class PceOpticalNodeTest extends AbstractTest {
     public void isValidTest() {
         OpenroadmNodeType nodeType = OpenroadmNodeType.ROADM;
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node, nodeType,
-            StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+            StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         Assert.assertTrue(pceOpticalNode.isValid());
     }
 
@@ -93,7 +93,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     public void testInitSrgTps() {
 
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
         pceOpticalNode.initFrequenciesBitSet();
@@ -110,7 +111,8 @@ public class PceOpticalNodeTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK);
         Node specificNode = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, specificNode,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
         Assert.assertTrue(pceOpticalNode.isValid());
         Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
@@ -120,7 +122,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     @Test
     public void testInitXndrTpDegTypes() {
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
         Assert.assertTrue(pceOpticalNode.isValid());
         Assert.assertEquals(usedBitSet,pceOpticalNode.getBitSetData().get(88,96));
@@ -130,7 +133,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     @Test
     public void testInitXndrTpXpondrTypes() {
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
         Assert.assertTrue(pceOpticalNode.isValid());
         Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
@@ -140,7 +144,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     @Test
     public void testinitFrequenciesBitSet() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
         pceOpticalNode.initFrequenciesBitSet();
         Assert.assertFalse(pceOpticalNode.isValid());
@@ -151,7 +156,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     @Test
     public void testGetRdmSrgClient() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         Assert.assertNull(pceOpticalNode.getRdmSrgClient("7"));
         Assert.assertFalse(pceOpticalNode.isValid());
@@ -164,7 +170,8 @@ public class PceOpticalNodeTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilderEmpty(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
         Node specificNode = node1Builder.setNodeId(new NodeId("test")).build();
         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         pceOpticalNode.initFrequenciesBitSet();
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
@@ -177,7 +184,8 @@ public class PceOpticalNodeTest extends AbstractTest {
     @Test
     public void testGetRdmSrgClientDeg() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         Assert.assertNull(pceOpticalNode.getRdmSrgClient("7"));
         Assert.assertFalse(pceOpticalNode.isValid());
@@ -190,7 +198,8 @@ public class PceOpticalNodeTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXCP);
         Node specificNode = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         Assert.assertFalse(pceOpticalNode.isValid());
         Assert.assertNull(pceOpticalNode.getBitSetData());
@@ -203,7 +212,8 @@ public class PceOpticalNodeTest extends AbstractTest {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.DEGREERXTTP);
         node = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
-                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50);
+                OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initSrgTps();
         Assert.assertNull(pceOpticalNode.getRdmSrgClient("2"));
         Assert.assertFalse(pceOpticalNode.isValid());
index dee898e3511d60fe95f25f496ace33ad5bcfdbe8..646fea65ec14ad2d028a2b49e020cbceb9bfecca 100644 (file)
@@ -144,7 +144,7 @@ public class PceOtnNodeTest extends AbstractTest {
     @Test
     public void testIsPceOtnNodeValidNode() {
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.DEGREE,
-                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE);
+                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE_M);
         pceOtnNode.initXndrTps("AZ");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
@@ -157,7 +157,7 @@ public class PceOtnNodeTest extends AbstractTest {
     @Test
     public void testIsPceOtnNodeValidNodeTypeNull() {
         pceOtnNode = new PceOtnNode(node, null,
-                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE);
+                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE_M);
         pceOtnNode.initXndrTps("AZ");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
@@ -167,7 +167,7 @@ public class PceOtnNodeTest extends AbstractTest {
     @Test
     public void testIsPceOtnNodeValidNodeTypeDeg() {
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.DEGREE,
-                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE);
+                new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_100GE_M);
         pceOtnNode.initXndrTps("AZ");
         Assert.assertFalse("not valid node , its type isn't one of MUXPDR or SWITCH or TPDR" ,
                 pceOtnNode.isPceOtnNodeValid(pceOtnNode));
index 991a6cbc306fe693dd6308dfcf8c21ec37e312d1..0db3c50f7e55fefb9afbca5ad0f242fff10e5ce2 100644 (file)
@@ -571,12 +571,15 @@ public final class PceTestData {
         ServiceHandlerHeader serviceHandlerHeader = new ServiceHandlerHeaderBuilder()
                 .setRequestId("request 1")
                 .build();
+
         ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
-                .setServiceRate(Uint32.valueOf(0))
+                .setServiceRate(Uint32.valueOf(100))
+                .setServiceFormat(ServiceFormat.Ethernet)
                 .setNodeId("XPONDER-1-2")
                 .build();
         ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
                 .setServiceRate(Uint32.valueOf(0))
+                .setServiceFormat(ServiceFormat.Ethernet)
                 .setNodeId("XPONDER-3-2")
                 .build();
         PathComputationRequestInput input = new PathComputationRequestInputBuilder()
index 04a5000eecf07f07b0ca01c4f339d3b9c7c05769..51bb5aedac965a292e61bf8999fa8435b3a1c61e 100644 (file)
@@ -324,7 +324,8 @@ public class OpenRoadmInterface710 {
             .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
         // Maint test signal
         MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
-            .setTestPattern(TestPattern.PRBS23)
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
             .setEnabled(false);
 
         // Create an ODUC4 object
@@ -390,7 +391,8 @@ public class OpenRoadmInterface710 {
             .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
         // Maint test signal
         MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
-            .setTestPattern(TestPattern.PRBS23)
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
             .setEnabled(false);
 
         // Create an ODUC4 object
@@ -434,6 +436,138 @@ public class OpenRoadmInterface710 {
         return oduInterfaceBuilder.getName();
     }
 
+    public String createOpenRoadmOtnOducnInterface(String nodeId, String logicalConnPoint,
+        String supportingOtucn)
+        throws OpenRoadmInterfaceException {
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
+                    nodeId, logicalConnPoint));
+        }
+        // Create ODUcn object
+        // Start with OPU object
+        // OPU payload
+        OpuBuilder opuBuilder = new OpuBuilder()
+            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
+        // Maint test signal
+        MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
+            .setEnabled(false);
+
+        // Create an ODUC4 object
+        OduBuilder oduBuilder = new OduBuilder()
+            .setRate(ODUCn.class)
+            .setOducnNRate(Uint16.valueOf(4))
+            .setOduFunction(ODUTTP.class)
+            .setMonitoringMode(MonitoringMode.Terminated)
+            .setTimActEnabled(false)
+            .setTimDetectMode(TimDetectMode.Disabled)
+            .setDegmIntervals(Uint8.valueOf(2))
+            .setDegthrPercentage(Uint16.valueOf(100))
+            .setOpu(opuBuilder.build())
+            .setMaintTestsignal(maintTestsignal.build());
+
+        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class,
+            logicalConnPoint + "-ODUC4");
+
+        // Create a list
+        List<String> listSupportingOtucnInterface = new ArrayList<>();
+        listSupportingOtucnInterface.add(supportingOtucn);
+
+        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
+        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
+
+        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(nodeId, oduInterfaceBuilder);
+
+        // Post the equipment-state change on the device circuit-pack if xpdr node
+        if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
+            this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
+        }
+        // Update the port-mapping with the interface information
+        this.portMapping.updateMapping(nodeId, portMap);
+        return oduInterfaceBuilder.getName();
+    }
+
+
+    // With SAPI and DAPI information
+    public String createOpenRoadmOtnOducnInterface(String anodeId, String alogicalConnPoint,
+        String supportingOtucn, String znodeId, String zlogicalConnPoint)
+        throws OpenRoadmInterfaceException {
+        Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
+        if (portMapA == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
+                    anodeId, alogicalConnPoint));
+        }
+        // On the Zside
+        if (portMapZ == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
+                    znodeId, zlogicalConnPoint));
+
+        }
+        // Create ODUcn object
+        // Start with OPU object
+        // OPU payload
+        OpuBuilder opuBuilder = new OpuBuilder()
+            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
+        // Maint test signal
+        MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
+            .setEnabled(false);
+
+        // Create an ODUC4 object
+        OduBuilder oduBuilder = new OduBuilder()
+            .setRate(ODUCn.class)
+            .setOducnNRate(Uint16.valueOf(4))
+            .setOduFunction(ODUTTP.class)
+            .setMonitoringMode(MonitoringMode.Terminated)
+            .setTimActEnabled(false)
+            .setTimDetectMode(TimDetectMode.Disabled)
+            .setDegmIntervals(Uint8.valueOf(2))
+            .setDegthrPercentage(Uint16.valueOf(100))
+            .setOpu(opuBuilder.build())
+            .setTxSapi(portMapA.getLcpHashVal())
+            .setTxDapi(portMapZ.getLcpHashVal())
+            .setExpectedSapi(portMapZ.getLcpHashVal())
+            .setExpectedDapi(portMapZ.getLcpHashVal())
+            .setMaintTestsignal(maintTestsignal.build());
+
+        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
+            alogicalConnPoint + "-ODUC4");
+
+        // Create a list
+        List<String> listSupportingOtucnInterface = new ArrayList<>();
+        listSupportingOtucnInterface.add(supportingOtucn);
+
+        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
+        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
+
+        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(anodeId, oduInterfaceBuilder);
+
+        // Post the equipment-state change on the device circuit-pack if xpdr node
+        if (portMapA.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
+            this.openRoadmInterfaces.postEquipmentState(anodeId, portMapA.getSupportingCircuitPackName(), true);
+        }
+        // Update the port-mapping with the interface information
+        this.portMapping.updateMapping(anodeId, portMapA);
+        return oduInterfaceBuilder.getName();
+    }
+
     // This is only for transponder
     public String createOpenRoadmOduflexInterface(String nodeId, String logicalConnPoint,
             String supportingOducn)
@@ -451,7 +585,8 @@ public class OpenRoadmInterface710 {
 
         // Maint test signal
         MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
-            .setTestPattern(TestPattern.PRBS23)
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
             .setEnabled(false);
 
         // Parent Odu-allocation
@@ -529,7 +664,8 @@ public class OpenRoadmInterface710 {
 
         // Maint test signal
         MaintTestsignalBuilder maintTestsignal = new MaintTestsignalBuilder()
-            .setTestPattern(TestPattern.PRBS23)
+            // PRBS value should be PRBS31 if enabled is true
+            .setTestPattern(TestPattern.PRBS31)
             .setEnabled(false);
 
         // Parent Odu-allocation
index d053bac6fa9f8d41628672b2d29713d574dc3966..9e49ca1d13fa679dc32190604e8d9f7899528475 100644 (file)
@@ -16,28 +16,33 @@ import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class OpenRoadmInterfaceFactory {
 
     private static final String OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG =
-            "OTN funtions are not supported by Openroadm models 1.2.1";
+            "OTN functions are not supported by Openroadm models 1.2.1";
+    private static  final String OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_2_2_1_MSG =
+            "OTN functions are not supported by Openroadm models 2.2.1";
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterfaceFactory.class);
     private final MappingUtils mappingUtils;
     private final OpenRoadmInterface121 openRoadmInterface121;
     private final OpenRoadmInterface221 openRoadmInterface221;
     private final OpenRoadmInterface710 openRoadmInterface710;
-    private final OpenRoadmOtnInterface221 openRoadmOtnInterface;
+    private final OpenRoadmOtnInterface221 openRoadmOtnInterface221;
+    private final OpenRoadmOtnInterface710 openRoadmOtnInterface710;
 
     public OpenRoadmInterfaceFactory(MappingUtils mappingUtils, OpenRoadmInterface121 openRoadmInterface121,
             OpenRoadmInterface221 openRoadmInterface221, OpenRoadmInterface710 openRoadmInterface710,
-            OpenRoadmOtnInterface221 openRoadmOTNInterface) {
+            OpenRoadmOtnInterface221 openRoadmOTNInterface221, OpenRoadmOtnInterface710 openRoadmOtnInterface710) {
         this.mappingUtils = mappingUtils;
         this.openRoadmInterface121 = openRoadmInterface121;
         this.openRoadmInterface221 = openRoadmInterface221;
         this.openRoadmInterface710 = openRoadmInterface710;
-        this.openRoadmOtnInterface = openRoadmOTNInterface;
+        this.openRoadmOtnInterface221 = openRoadmOTNInterface221;
+        this.openRoadmOtnInterface710 = openRoadmOtnInterface710;
     }
 
     public String createOpenRoadmEthInterface(String nodeId, String logicalConnPoint)
@@ -248,7 +253,7 @@ public class OpenRoadmInterfaceFactory {
     }
 
     public boolean isUsedByXc(String nodeId, String interfaceName, String xc,
-                              DeviceTransactionManager deviceTransactionManager) {
+            DeviceTransactionManager deviceTransactionManager) {
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
             case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
                 return openRoadmInterface121.isUsedByXc(nodeId, interfaceName, xc, deviceTransactionManager);
@@ -273,26 +278,44 @@ public class OpenRoadmInterfaceFactory {
     }
 
     public String createOpenRoadmEth1GInterface(String nodeId,
-                                                String logicalConnPoint) throws OpenRoadmInterfaceException {
+            String logicalConnPoint) throws OpenRoadmInterfaceException {
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
             case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface.createOpenRoadmEth1GInterface(nodeId, logicalConnPoint);
+                return openRoadmOtnInterface221.createOpenRoadmEth1GInterface(nodeId, logicalConnPoint);
             default:
                 return null;
         }
     }
 
     public String createOpenRoadmEth10GInterface(String nodeId,
-                                                 String logicalConnPoint) throws OpenRoadmInterfaceException {
+            String logicalConnPoint) throws OpenRoadmInterfaceException {
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
             case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface.createOpenRoadmEth10GInterface(nodeId, logicalConnPoint);
+                return openRoadmOtnInterface221.createOpenRoadmEth10GInterface(nodeId, logicalConnPoint);
+            default:
+                return null;
+        }
+
+    }
+
+    public String createOpenRoadmEth100GInterface(String nodeId,
+            String logicalConnPoint) throws OpenRoadmInterfaceException {
+
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
+                LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
+                return null;
+            case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
+                LOG.warn("Use Ethernet interface creation for 2.2.1, instead this method of Ether 100G");
+                return openRoadmInterface221.createOpenRoadmEthInterface(nodeId, logicalConnPoint);
+            case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
+                return openRoadmOtnInterface710.createOpenRoadmEth100GInterface(nodeId, logicalConnPoint);
             default:
                 return null;
         }
@@ -307,7 +330,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface.createOpenRoadmOdu0Interface(
+                return openRoadmOtnInterface221.createOpenRoadmOdu0Interface(
                     nodeId, logicalConnPoint, servicename, payLoad, isNetworkPort, tribPortNumber, tribSlot);
             default:
                 return null;
@@ -322,7 +345,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface.createOpenRoadmOdu2Interface(
+                return openRoadmOtnInterface221.createOpenRoadmOdu2Interface(
                     nodeId, logicalConnPoint, servicename, payLoad, isNetworkPort, tribPortNumber, tribSlotIndex);
             default:
                 return null;
@@ -337,7 +360,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface.createOpenRoadmOdu2eInterface(
+                return openRoadmOtnInterface221.createOpenRoadmOdu2eInterface(
                         nodeId, logicalConnPoint, servicename, payLoad, isNetworkPort, tribPortNumber, tribSlotIndex);
             default:
                 return null;
@@ -345,6 +368,26 @@ public class OpenRoadmInterfaceFactory {
 
     }
 
+    public String createOpenRoadmOtnOdu4LoInterface(String nodeId, String logicalConnPoint,
+        String serviceName, String payLoad, boolean isNetworkPort,
+        OpucnTribSlotDef minTribSlotNumber, OpucnTribSlotDef maxTribSlotNumber)
+        throws OpenRoadmInterfaceException {
+
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
+                LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
+                return null;
+            case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
+                LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_2_2_1_MSG);
+                return null;
+            case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
+                return openRoadmOtnInterface710.createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, serviceName,
+                    payLoad, isNetworkPort, minTribSlotNumber, maxTribSlotNumber);
+            default:
+                return null;
+        }
+    }
+
     public String createOpenRoadmOtnOdu4Interface(String nodeId, String logicalConnPoint, String supportingOtuInterface)
             throws OpenRoadmInterfaceException {
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
@@ -368,4 +411,29 @@ public class OpenRoadmInterfaceFactory {
                 return null;
         }
     }
+
+    public String createOpenRoadmOtnOduc4Interface(String nodeId, String logicalConnPoint,
+            String supportingOtuInterface)
+            throws OpenRoadmInterfaceException {
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
+                return openRoadmInterface710
+                    .createOpenRoadmOtnOducnInterface(nodeId, logicalConnPoint, supportingOtuInterface);
+            default:
+                return null;
+        }
+    }
+
+    public String createOpenRoadmOtnOduc4Interface(String anodeId, String alogicalConnPoint,
+            String asupportingOtuInterface, String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
+        switch (mappingUtils.getOpenRoadmVersion(anodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
+                return openRoadmInterface710
+                    .createOpenRoadmOtnOducnInterface(anodeId, alogicalConnPoint, asupportingOtuInterface,
+                        znodeId, zlogicalConnPoint);
+            default:
+                return null;
+        }
+    }
 }
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface710.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface710.java
new file mode 100644 (file)
index 0000000..52ba7bb
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * Copyright Â© 2021 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.renderer.openroadminterface;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.ParentOduAllocationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.parent.odu.allocation.trib.slots.choice.OpucnBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Off;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev200529.Interface1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev200529.ethernet.container.EthernetBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.EthernetCsmacd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.InterfaceType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtnOdu;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCTP;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTPCTP;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.PayloadTypeDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.OduAttributes.MonitoringMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.odu.container.OduBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.opu.OpuBuilder;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OpenRoadmOtnInterface710 {
+    private final PortMapping portMapping;
+    private final OpenRoadmInterfaces openRoadmInterfaces;
+    private static final Logger LOG = LoggerFactory
+        .getLogger(OpenRoadmOtnInterface710.class);
+
+    public OpenRoadmOtnInterface710(PortMapping portMapping,
+        OpenRoadmInterfaces openRoadmInterfaces) {
+        this.portMapping = portMapping;
+        this.openRoadmInterfaces = openRoadmInterfaces;
+    }
+
+    public String createOpenRoadmEth100GInterface(String nodeId,
+        String logicalConnPoint) throws OpenRoadmInterfaceException {
+
+        Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throwException(nodeId, logicalConnPoint);
+        }
+
+        // Ethernet interface specific data
+        EthernetBuilder ethIfBuilder = new EthernetBuilder()
+            .setFec(Off.class)
+            .setSpeed(Uint32.valueOf(100000));
+        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(
+            portMap, EthernetCsmacd.class,
+            logicalConnPoint + "-ETHERNET100G");
+        // Create Interface1 type object required for adding as augmentation
+        Interface1Builder ethIf1Builder = new Interface1Builder();
+        ethInterfaceBldr.addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build()).build());
+        // Post interface on the device
+        this.openRoadmInterfaces.postOTNInterface(nodeId, ethInterfaceBldr);
+        // Post the equipment-state change on the device circuit-pack
+        this.openRoadmInterfaces.postOTNEquipmentState(nodeId,
+            portMap.getSupportingCircuitPackName(), true);
+        this.portMapping.updateMapping(nodeId, portMap);
+        String ethernetInterfaceName = ethInterfaceBldr.getName();
+
+        return ethernetInterfaceName;
+    }
+
+    private void throwException(String nodeId, String logicalConnPoint)
+        throws OpenRoadmInterfaceException {
+
+        throw new OpenRoadmInterfaceException(String.format(
+            "Unable to get mapping from PortMapping for node % and logical connection port %s",
+            nodeId, logicalConnPoint));
+    }
+
+    public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint,
+        String serviceName, String payLoad,
+        boolean isNetworkPort, OpucnTribSlotDef minTribSlotNumber, OpucnTribSlotDef maxTribSlotNumber)
+        throws OpenRoadmInterfaceException {
+        Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
+            throwException(nodeId, logicalConnPoint);
+        }
+        List<String> supportingInterfaceList = new ArrayList<>();
+        String supportingInterface = null;
+        if (isNetworkPort) {
+            supportingInterface = portMap.getSupportingOduc4();
+        } else {
+            supportingInterface = logicalConnPoint + "-ETHERNET100G";
+        }
+
+        if (supportingInterface == null) {
+            throw new OpenRoadmInterfaceException(
+                "Interface Creation failed because of missing supported "
+                    + "ODU4 on network end or Ethernet on client");
+        }
+        // Supporting interface is a list for B100G (7.1) device models
+        supportingInterfaceList.add(supportingInterface);
+
+        InterfaceBuilder oduIfBuilder = createGenericInterfaceBuilder(
+            portMap, OtnOdu.class, logicalConnPoint + "-ODU4-" + serviceName)
+            .setSupportingInterfaceList(supportingInterfaceList);
+        // Agument ODU4 specific interface data
+        OduBuilder oduBuilder = new OduBuilder().setRate(ODU4.class)
+            .setOduFunction(ODUTTPCTP.class)
+            .setMonitoringMode(MonitoringMode.Terminated);
+        LOG.debug("Inside the ODU4 creation {} {} {}", isNetworkPort, minTribSlotNumber.getValue(),
+            maxTribSlotNumber.getValue());
+        // If it is a network port we have fill the required trib-slots and trib-ports
+        if (isNetworkPort) {
+            List<OpucnTribSlotDef> opucnTribSlotDefList = new ArrayList<>();
+            // Escape characters are used to here to take the literal dot
+            Uint16 tribPortNumber = Uint16.valueOf(minTribSlotNumber.getValue().split("\\.")[0]);
+            Uint16 startTribSlot = Uint16.valueOf(minTribSlotNumber.getValue().split("\\.")[1]);
+            Uint16 endTribSlot = Uint16.valueOf(maxTribSlotNumber.getValue().split("\\.")[1]);
+
+            IntStream.range(startTribSlot.intValue(), endTribSlot.intValue() + 1)
+                .forEach(
+                    nbr -> opucnTribSlotDefList.add(OpucnTribSlotDef.getDefaultInstance(tribPortNumber + "." + nbr))
+                );
+            ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
+                .setTribPortNumber(tribPortNumber)
+                .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(opucnTribSlotDefList).build());
+            // reset the ODU function as ODUCTP and the monitoring moode
+            oduBuilder.setOduFunction(ODUCTP.class)
+                .setMonitoringMode(MonitoringMode.NotTerminated)
+                .setParentOduAllocation(parentOduAllocationBuilder.build());
+        }
+        else {
+           //  This is for the client side of the ODU (ODU-TTP-CTP)
+            // Set Opu attributes
+            OpuBuilder opuBuilder = new OpuBuilder()
+                .setExpPayloadType(new PayloadTypeDef(payLoad))
+                .setPayloadType(new PayloadTypeDef(payLoad));
+            oduBuilder.setOpu(opuBuilder.build());
+        }
+
+        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder
+            oduIf1Builder = new
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
+        oduIfBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+        // Post interface on the device
+        this.openRoadmInterfaces.postOTNInterface(nodeId, oduIfBuilder);
+        LOG.info("Returning the ODU4 inteface {}", oduIfBuilder.getName());
+        return oduIfBuilder.getName();
+    }
+
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap,
+        Class<? extends InterfaceType> type, String key) {
+        return new InterfaceBuilder()
+            // .setDescription(" TBD ")
+            // .setCircuitId(" TBD ")
+            .setSupportingCircuitPackName(
+                portMap.getSupportingCircuitPackName())
+            .setSupportingPort(portMap.getSupportingPort())
+            .setAdministrativeState(AdminStates.InService)
+            // TODO get rid of unchecked cast warning
+            .setType(type).setName(key).withKey(new InterfaceKey(key));
+    }
+}
index 16a04c48e83fa4d448f9627b677bf9c1ec1e4fb5..7a9738e9a71a69821375d318de5d86ee92065c5e 100644 (file)
@@ -71,7 +71,7 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.node.interfaces.NodeInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.node.interfaces.NodeInterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.olm.renderer.input.Nodes;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
index ec8ff8a827fe3425cd9d9540e4e642db55d6662b..fbf62e7ca840f9d14700d8537736300fa3bd4feb 100644 (file)
@@ -30,11 +30,12 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.re
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.OtnServicePathOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.OtnServicePathOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.node.interfaces.NodeInterface;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.node.interfaces.NodeInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.node.interfaces.NodeInterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev201211.otn.renderer.input.Nodes;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,28 +85,28 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         nodeInterfaces = createInterface(input);
                         LOG.info("Node interfaces created just fine ");
 
-                        List<String> nodesToUpdate = new ArrayList<>();
-                        if (!nodeInterfaces.isEmpty()) {
-                            for (NodeInterface nodeInterf : nodeInterfaces) {
-                                if (nodeInterf.getOduInterfaceId() != null) {
-                                    List<String> interList = nodeInterf.getOduInterfaceId().stream()
-                                        .filter(id -> id.contains("NETWORK")).collect(Collectors.toList());
-                                    if (!interList.isEmpty()) {
-                                        for (String inter : interList) {
-                                            String tp = inter.split("-ODU")[0];
-                                            String nodeTopo = nodeInterf.getNodeId() + "-" + tp.split("-")[0];
-                                            nodesToUpdate.add(nodeTopo + "--" + tp);
-                                        }
-                                    }
-                                }
-                            }
-                        }
+                        List<String> nodesToUpdate = updateOduNodes(nodeInterfaces, "ODU");
                         updateOtnTopology(null, nodesToUpdate, input.getServiceRate(), input.getTribPortNumber(),
                             input.getTribSlot(), false);
                     } catch (OpenRoadmInterfaceException e) {
                         LOG.warn("Set up service path failed", e);
                         success = false;
                     }
+                } else if ("100G".equals(input.getServiceRate())) {
+                    try {
+                        LOG.info("Calling Node interfaces {} {} {} {} {} {}",
+                            input.getServiceRate(), input.getEthernetEncoding(),
+                            input.getServiceType(), input.getOperation(), input.getOpucnTribSlots(), input.getNodes());
+                        nodeInterfaces = createInterface(input);
+                        LOG.info("Node interfaces created just fine for 100G OTN ");
+                        // TODO: Update the OTN topology accordingly with Opucn-Trib-slots
+                        // List<String> nodesToUpdate = updateOduNodes(nodeInterfaces, "ODUC4");
+                        // updateOtnTopology(null, nodesToUpdate, input.getServiceRate(), input.getTribPortNumber(),
+                        //    input.getTribSlot(), false);
+                    } catch (OpenRoadmInterfaceException e) {
+                        LOG.warn("Set up service path failed", e);
+                        success = false;
+                    }
                 } else {
                     LOG.warn("Unsupported service-rate for service-type Ethernet");
                 }
@@ -119,6 +120,14 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         LOG.warn("Set up service path failed", e);
                         success = false;
                     }
+                } else if ("400G".equals(input.getServiceRate())) {
+                    try {
+                        createOduc4TtpInterface(input, nodeInterfaces, otnNodesProvisioned);
+                        updateOtnTopology(otnNodesProvisioned, null, null, null, null, false);
+                    } catch (OpenRoadmInterfaceException e) {
+                        LOG.warn("Set up service path failed", e);
+                        success = false;
+                    }
                 } else {
                     LOG.warn("Unsupported service-rate for service-type ODU");
                 }
@@ -283,11 +292,37 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
         }
     }
 
+    private List<String> updateOduNodes(List<NodeInterface> nodeInterfaceList, String deLimiter) {
+        List<String> nodesToUpdate = new ArrayList<>();
+        if (!(deLimiter.equals("ODU")) || !(deLimiter.equals("ODUC4"))) {
+            LOG.error("ODU node list update will be incorrect");
+        }
+
+        if (!nodeInterfaceList.isEmpty()) {
+            for (NodeInterface nodeInterf : nodeInterfaceList) {
+                if (nodeInterf.getOduInterfaceId() != null) {
+                    List<String> interList = nodeInterf.getOduInterfaceId().stream()
+                        .filter(id -> id.contains("NETWORK")).collect(Collectors.toList());
+                    if (!interList.isEmpty()) {
+                        for (String inter : interList) {
+                            String tp = inter.split("-" + deLimiter)[0];
+                            String nodeTopo = nodeInterf.getNodeId() + "-" + tp.split("-")[0];
+                            nodesToUpdate.add(nodeTopo + "--" + tp);
+                        }
+                    }
+                }
+            }
+        }
+
+        return nodesToUpdate;
+    }
+
     private List<NodeInterface> createInterface(OtnServicePathInput input) throws OpenRoadmInterfaceException {
         List<NodeInterface> nodeInterfaces = new ArrayList<>();
         LOG.info("Calling Create Interface entry for OTN service path");
         if (input.getServiceRate() == null
-            || !("1G".equals(input.getServiceRate()) || "10G".equals(input.getServiceRate()))) {
+            || !("1G".equals(input.getServiceRate()) || "10G".equals(input.getServiceRate())
+                || "100G".equals(input.getServiceRate()))) {
             LOG.error("Service rate {} not managed yet", input.getServiceRate());
         } else {
             createLowOrderInterfaces(input, nodeInterfaces);
@@ -352,6 +387,37 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                                 input.getTribSlot()));
                     }
                     break;
+                case ("100G"):
+                    LOG.info("Input service is 100G");
+                    // Take the first and last value in the list of OpucnTribSlot (assuming SH would provide
+                    // min and max value only, size two)
+                    OpucnTribSlotDef minOpucnTs = OpucnTribSlotDef.getDefaultInstance(
+                        input.getOpucnTribSlots().get(0).getValue());
+                    OpucnTribSlotDef maxOpucnTs = OpucnTribSlotDef.getDefaultInstance(
+                        input.getOpucnTribSlots().get(1).getValue());
+                    if (node.getClientTp() != null) {
+                        createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth100GInterface(
+                            node.getNodeId(), node.getClientTp()));
+                        // OPUCn trib information is optional when creating ODU4 ethernet (client) interface
+                        createdOduInterfaces.add(
+                            openRoadmInterfaceFactory.createOpenRoadmOtnOdu4LoInterface(node.getNodeId(),
+                            node.getClientTp(), input.getServiceName(), PT_07, false, minOpucnTs,
+                                maxOpucnTs));
+                    }
+                    // Here payload-type is optional and is not used for interface creation (especially for network)
+                    createdOduInterfaces.add(
+                        openRoadmInterfaceFactory.createOpenRoadmOtnOdu4LoInterface(node.getNodeId(),
+                            node.getNetworkTp(), input.getServiceName(), PT_07, true, minOpucnTs,
+                            maxOpucnTs));
+                    // Here payload-type is optional and is not used for service creation
+                    // This is needed if there is an intermediate node
+                    if (node.getNetwork2Tp() != null) {
+                        createdOduInterfaces.add(
+                            openRoadmInterfaceFactory.createOpenRoadmOtnOdu4LoInterface(node.getNodeId(),
+                                node.getNetwork2Tp(), input.getServiceName(), PT_07, true, minOpucnTs,
+                                maxOpucnTs));
+                    }
+                    break;
                 default:
                     LOG.error("service rate {} not managed yet", input.getServiceRate());
                     return;
@@ -374,6 +440,36 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
         }
     }
 
+    private void createOduc4TtpInterface(OtnServicePathInput input, List<NodeInterface> nodeInterfaces,
+        CopyOnWriteArrayList<Nodes> otnNodesProvisioned) throws OpenRoadmInterfaceException {
+        if (input.getNodes() == null) {
+            return;
+        }
+        LOG.info("Creation of ODUC4 TTP interface in OTN service path {}", input);
+        for (int i = 0; i < input.getNodes().size(); i++) {
+            Nodes node = input.getNodes().get(i);
+            String supportingOtuInterface = node.getNetworkTp() + "-OTUC4";
+            List<String> createdOduc4Interfaces = new ArrayList<>();
+            // Adding SAPI/DAPI information to the
+            Nodes tgtNode = null;
+            if (i + 1 == input.getNodes().size()) {
+                // For the end node, tgtNode becomes the first node in the list
+                tgtNode = input.getNodes().get(0);
+            } else {
+                tgtNode = input.getNodes().get(i + 1);
+            }
+            createdOduc4Interfaces.add(openRoadmInterfaceFactory.createOpenRoadmOtnOduc4Interface(node.getNodeId(),
+                node.getNetworkTp(), supportingOtuInterface, tgtNode.getNodeId(), tgtNode.getNetworkTp()));
+
+            NodeInterfaceBuilder nodeInterfaceBuilder = new NodeInterfaceBuilder()
+                .withKey(new NodeInterfaceKey(node.getNodeId()))
+                .setNodeId(node.getNodeId())
+                .setOduInterfaceId(createdOduc4Interfaces); // though this is odu, actually it has ODUC4 interfaces
+            nodeInterfaces.add(nodeInterfaceBuilder.build());
+            otnNodesProvisioned.add(node);
+        }
+    }
+
     private void createODU4TtpInterface(OtnServicePathInput input, List<NodeInterface> nodeInterfaces,
         CopyOnWriteArrayList<Nodes> otnNodesProvisioned) throws OpenRoadmInterfaceException {
         if (input.getNodes() == null) {
index baa04add60517d236ce63724abad4a5e2d8252d6..1113ffee66e3bef5eafb3a93fbba069a0d2ea7d3 100644 (file)
@@ -53,7 +53,9 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceImplementationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCn;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OTU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OTUCn;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat;
@@ -123,7 +125,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     case Service: case RoadmLine: // This takes into account of Ethernet 100G, 1G, 10G and ODU4
                         LOG.info("RPC implementation for {}", input.getConnectionType());
                         if (((input.getServiceAEnd().getServiceRate() != null)
-                            && (input.getServiceAEnd().getServiceRate().intValue() == 100))
+                            && ((input.getServiceAEnd().getServiceRate().intValue() == 100))
+                            || (input.getServiceAEnd().getServiceRate().intValue() == 400))
                             && ((input.getServiceAEnd().getServiceFormat().getName().equals("Ethernet"))
                                 || (input.getServiceAEnd().getServiceFormat().getName().equals("OC")))) {
                             LOG.info("Service format for {} is {} and rate is {}", input.getServiceName(),
@@ -133,7 +136,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                                     OPERATION_FAILED);
                             }
                         } else { // This implies, service-rate is 1 or 10G
-                            // This includes the lower-order odu (1G, 10G) and this is A-Z side
+                            // This includes the lower-order odu (1G, 10G, 100G) and this is A-Z side
                             LOG.info("RPC implementation for LO-ODU");
                             String serviceRate = ""; // Assuming service at A-side and Z-side has same service rate
                             if (input.getServiceAEnd().getServiceRate() != null) {
@@ -162,23 +165,34 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                         break;
                     case Infrastructure:
                         LOG.info("RPC implementation for {}", input.getConnectionType());
-                        if ((input.getServiceAEnd().getOtuServiceRate() != null)
-                            && (input.getServiceAEnd().getOtuServiceRate().equals(OTU4.class))) {
-                            // For the service of OTU4 infrastructure
-                            // First create the OCH and OTU interfaces
-                            String serviceRate = "100G"; // For OtnDeviceRendererServiceImpl
-                            if (!createServicepathInput(input)) {
-                                return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED,
-                                    OPERATION_FAILED);
+                        if (input.getServiceAEnd().getOtuServiceRate() != null) {
+                            if ((input.getServiceAEnd().getOtuServiceRate().equals(OTU4.class))
+                                || (input.getServiceAEnd().getOtuServiceRate().equals(OTUCn.class))) {
+                                // For the service of OTU4 or OTUCn infrastructure
+                                // Create the OCH and OTU interfaces for OTU4 class
+                                // Create OTSi, OTSi-group and OTUCn interface
+                                if (!createServicepathInput(input)) {
+                                    return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED,
+                                        OPERATION_FAILED);
+                                }
                             }
                         }
-                        if ((input.getServiceAEnd().getOduServiceRate() != null)
-                            && (input.getServiceAEnd().getOduServiceRate().equals(ODU4.class))) {
-                            // For the service of OTU4 infrastructure
-                            String serviceRate = "100G"; // For OtnDeviceRendererServiceImpl
+                        if (input.getServiceAEnd().getOduServiceRate() != null) {
+                            String serviceRate = null;
+                            if (input.getServiceAEnd().getOduServiceRate().equals(ODU4.class)) {
+                                // For the service of OTU4 infrastructure
+                                serviceRate = "100G"; // For OtnDeviceRendererServiceImpl
+                            }
+                            else if (input.getServiceAEnd().getOduServiceRate().equals(ODUCn.class)) {
+                                // For the service of OTUCn infrastructure
+                                // TODO: what happens if split-lambda where to be used? We will have ODUC2 rate,
+                                // TODO: which case service-rate would be 200
+                                // TODO: in that case it would be 200G?? Need to understand more
+                                serviceRate = "400G"; // For OtnDeviceRendererServiceImpl
+                            }
                             LOG.info("Service format for {} is {} and rate is {}", input.getServiceName(),
                                 input.getServiceAEnd().getOduServiceRate(), serviceRate);
-                            // Now start rendering ODU4 interface
+                            // Now start rendering ODU4 or ODUC4 interface
                             // This is A-Z side
                             OtnServicePathInput otnServicePathInputAtoZ = ModelMappingUtils
                                 .rendererCreateOtnServiceInput(input.getServiceName(),
index 2bae23d8363c34527b55c0a0623ad3b9608ace9b..b93e7cf370b7f7cfb872b64e09cd29faadba4e6e 100644 (file)
@@ -43,19 +43,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <argument ref="openRoadmInterfaces"/>
   </bean>
 
-  <bean id="openRoadmOtnInterface"
+  <bean id="openRoadmOtnInterface221"
         class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221">
     <argument ref="portMapping"/>
     <argument ref="openRoadmInterfaces"/>
   </bean>
 
+  <bean id="openRoadmOtnInterface710"
+    class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710">
+    <argument ref="portMapping"/>
+    <argument ref="openRoadmInterfaces"/>
+  </bean>
+
   <bean id="openRoadmInterfaceFactory"
         class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory">
     <argument ref="mappingUtils"/>
     <argument ref="openRoadmInterface121"/>
     <argument ref="openRoadmInterface221"/>
     <argument ref="openRoadmInterface710"/>
-    <argument ref="openRoadmOtnInterface"/>
+    <argument ref="openRoadmOtnInterface221"/>
+    <argument ref="openRoadmOtnInterface710"/>
   </bean>
 
   <bean id="deviceRenderer" class="org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl" >
index 9c3c0c23638df41bfeed4bdad7204ae7bafb5945..f236801bfb71997ddc7eabeeee88467c0a1777d7 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -43,6 +44,7 @@ import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterf
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.utils.CreateOtsOmsDataUtils;
 import org.opendaylight.transportpce.renderer.utils.MountPointUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
@@ -75,6 +77,7 @@ public class DeviceRendererServiceImplCreateOtsOmsTest extends AbstractTest {
     private PortMappingVersion121 portMappingVersion121;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl221;
+    private CrossConnectImpl710 crossConnectImpl710;
 
     private void setMountPoint(MountPoint mountPoint) {
         MountPointService mountPointService = new MountPointServiceStub(mountPoint);
@@ -102,14 +105,17 @@ public class DeviceRendererServiceImplCreateOtsOmsTest extends AbstractTest {
         OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping,openRoadmInterfaces);
         OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping,openRoadmInterfaces);
         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
-        OpenRoadmOtnInterface221 openRoadmOTNInterface = new OpenRoadmOtnInterface221(portMapping, openRoadmInterfaces);
+        OpenRoadmOtnInterface221 openRoadmOTNInterface221 = new OpenRoadmOtnInterface221(portMapping,
+            openRoadmInterfaces);
+        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
+            openRoadmInterfaces);
         this.openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(this.mappingUtils,openRoadmInterface121,
-            openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface);
+            openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface221, openRoadmOtnInterface710);
 
         this.crossConnectImpl121 = new CrossConnectImpl121(this.deviceTransactionManager);
         this.crossConnectImpl221 = new CrossConnectImpl221(this.deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(this.deviceTransactionManager, this.mappingUtils,
-            this.crossConnectImpl121, this.crossConnectImpl221);
+            this.crossConnectImpl121, this.crossConnectImpl221, this.crossConnectImpl710);
         this.crossConnect = Mockito.spy(this.crossConnect);
         this.deviceRendererService = new DeviceRendererServiceImpl(this.getDataBroker(),
             this.deviceTransactionManager, this.openRoadmInterfaceFactory, this.openRoadmInterfaces,
index 8517c79816e14c8078becb2d61a88b104d0d9f89..6efbbe22c0ba6aabbf495352eeb1440fc7060715 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -48,6 +49,7 @@ import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterf
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.stub.OlmServiceStub;
 import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock;
 import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils;
@@ -94,6 +96,7 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
     private PortMappingVersion121 portMappingVersion121;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl221;
+    private CrossConnectImpl710 crossConnectImpl710;
     private OtnDeviceRendererService otnDeviceRendererService;
 
     private void setMountPoint(MountPoint mountPoint) {
@@ -117,14 +120,18 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-            this.crossConnectImpl221);
+            this.crossConnectImpl221, this.crossConnectImpl710);
         this.crossConnect = Mockito.spy(crossConnect);
         OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping,openRoadmInterfaces);
         OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping,openRoadmInterfaces);
         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping,openRoadmInterfaces);
-        OpenRoadmOtnInterface221 openRoadmOTNInterface = new OpenRoadmOtnInterface221(portMapping, openRoadmInterfaces);
+        OpenRoadmOtnInterface221 openRoadmOTNInterface221 = new OpenRoadmOtnInterface221(portMapping,
+            openRoadmInterfaces);
+        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
+            openRoadmInterfaces);
         OpenRoadmInterfaceFactory openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(this.mappingUtils,
-             openRoadmInterface121, openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface);
+            openRoadmInterface121, openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface221,
+            openRoadmOtnInterface710);
 
         this.deviceRenderer = new DeviceRendererServiceImpl(getDataBroker(),
             this.deviceTransactionManager, openRoadmInterfaceFactory, openRoadmInterfaces, crossConnect,
index 25b112ccf6ff66dc962d7c67c62d42f1005ceda5..e5a9f50ff374d15d3069dced12a0bcdb19a77764 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
@@ -44,6 +45,7 @@ import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterf
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
+import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.stub.OlmServiceStub;
 import org.opendaylight.transportpce.renderer.utils.MountPointUtils;
 import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock;
@@ -88,6 +90,7 @@ public class RendererServiceOperationsImplTest extends AbstractTest {
     private PortMappingVersion121 portMappingVersion121;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl221;
+    private CrossConnectImpl710 crossConnectImpl710;
 
     private void setMountPoint(MountPoint mountPoint) {
         this.mountPointService = new MountPointServiceStub(mountPoint);
@@ -110,13 +113,16 @@ public class RendererServiceOperationsImplTest extends AbstractTest {
         OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping,openRoadmInterfaces);
         OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping,openRoadmInterfaces);
         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping,openRoadmInterfaces);
-        OpenRoadmOtnInterface221 openRoadmOTNInterface = new OpenRoadmOtnInterface221(portMapping, openRoadmInterfaces);
+        OpenRoadmOtnInterface221 openRoadmOTNInterface221 = new OpenRoadmOtnInterface221(portMapping,
+            openRoadmInterfaces);
+        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
+            openRoadmInterfaces);
         this.openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(this.mappingUtils,openRoadmInterface121,
-            openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface);
+            openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface221, openRoadmOtnInterface710);
         this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         this.crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
         this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-            this.crossConnectImpl221);
+            this.crossConnectImpl221, this.crossConnectImpl710);
     }
 
     @Before
index eb6b0b9b463a77dc4cda404f7c2e5a2e7c3de75b..13b15e32f91150547dbb46dba47f53be4410335a 100644 (file)
@@ -367,7 +367,7 @@ public class ConvertORTopoToTapiFullTopo {
         for (TerminationPoint tp : this.oorNetworkPortList) {
             TpId tpid1 = tp.getTpId();
             TpId tpid2 = new TpId(tp.augmentation(
-                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
                 .getAssociatedConnectionMapPort());
             List<TpId> tpList = new ArrayList<>();
             tpList.add(tpid1);
index 2de29bb5151f8f5fa123d956de04737c4f3d7531..2a83ea0023e17700c1e470a83087fd17bab79dd3 100644 (file)
@@ -261,7 +261,7 @@ public class ConvertORTopoToTapiTopo {
         for (TerminationPoint tp : this.oorNetworkPortList) {
             TpId tpid1 = tp.getTpId();
             TpId tpid2 = new TpId(tp.augmentation(
-                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
                 .getAssociatedConnectionMapPort());
             List<TpId> tpList = new ArrayList<>();
             tpList.add(tpid1);
index fa1e91788e9d3d80c234133b333eb724938459a0..6688a9a65038fca4d908abb8cd7ce95a229b5fab 100644 (file)
@@ -398,7 +398,7 @@ public class TapiTopologyImpl implements TapiTopologyService, TapiCommonService
         String networkLcp;
         if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)) {
             networkLcp = tp.augmentation(
-                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
                 .getAssociatedConnectionMapPort();
         } else {
             networkLcp = tp.getTpId().getValue();
index 9dfd23745abee9c862c2526ccb7a318a47e18f22..27b7e79e1c8583e77d01e307810374559cac1ae8 100644 (file)
@@ -215,7 +215,7 @@ public final class TopologyUtils {
         String networkLcp;
         if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)) {
             networkLcp = tp.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
                     .getAssociatedConnectionMapPort();
         } else {
             networkLcp = tp.getTpId().getValue();
diff --git a/tests/sample_configs/honeynode-otntopo400G.json b/tests/sample_configs/honeynode-otntopo400G.json
new file mode 100644 (file)
index 0000000..c23fb1b
--- /dev/null
@@ -0,0 +1,354 @@
+{
+    "network": [
+        {
+            "network-id": "otn-topology",
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "node": [
+                {
+                    "node-id": "XPDR-A2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-A2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/tests/sample_configs/honeynode-otntopo400GwithODUC4.json b/tests/sample_configs/honeynode-otntopo400GwithODUC4.json
new file mode 100644 (file)
index 0000000..5d69ad0
--- /dev/null
@@ -0,0 +1,620 @@
+{
+    "network": [
+        {
+            "network-id": "otn-topology",
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "node": [
+                {
+                    "node-id": "XPDR-A2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-A2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                                                        "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODUCn",
+                                "ts-pool": [
+                                    1,
+                                    2,
+                                    3,
+                                    4,
+                                    5,
+                                    6,
+                                    7,
+                                    8,
+                                    9,
+                                    10,
+                                    15,
+                                    16,
+                                    13,
+                                    14,
+                                    19,
+                                    20,
+                                    17,
+                                    18,
+                                    11,
+                                    12,
+                                    31,
+                                    32,
+                                    29,
+                                    30,
+                                    35,
+                                    36,
+                                    33,
+                                    34,
+                                    23,
+                                    24,
+                                    21,
+                                    22,
+                                    27,
+                                    28,
+                                    25,
+                                    26,
+                                    47,
+                                    48,
+                                    45,
+                                    46,
+                                    51,
+                                    52,
+                                    49,
+                                    50,
+                                    39,
+                                    40,
+                                    37,
+                                    38,
+                                    43,
+                                    44,
+                                    41,
+                                    42,
+                                    63,
+                                    64,
+                                    61,
+                                    62,
+                                    67,
+                                    68,
+                                    65,
+                                    66,
+                                    55,
+                                    56,
+                                    53,
+                                    54,
+                                    59,
+                                    60,
+                                    57,
+                                    58,
+                                    79,
+                                    80,
+                                    77,
+                                    78,
+                                    71,
+                                    72,
+                                    69,
+                                    70,
+                                    75,
+                                    76,
+                                    73,
+                                    74
+                                ],
+                                "odtu-tpn-pool": [
+                                    {
+                                        "odtu-type": "org-openroadm-otn-common-types:ODTUCn.ts",
+                                        "tpn-pool": [
+                                            1,
+                                            3,
+                                            2,
+                                            4
+                                        ]
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                                                        "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODUCn",
+                                "ts-pool": [
+                                    1,
+                                    2,
+                                    3,
+                                    4,
+                                    5,
+                                    6,
+                                    7,
+                                    8,
+                                    9,
+                                    10,
+                                    15,
+                                    16,
+                                    13,
+                                    14,
+                                    19,
+                                    20,
+                                    17,
+                                    18,
+                                    11,
+                                    12,
+                                    31,
+                                    32,
+                                    29,
+                                    30,
+                                    35,
+                                    36,
+                                    33,
+                                    34,
+                                    23,
+                                    24,
+                                    21,
+                                    22,
+                                    27,
+                                    28,
+                                    25,
+                                    26,
+                                    47,
+                                    48,
+                                    45,
+                                    46,
+                                    51,
+                                    52,
+                                    49,
+                                    50,
+                                    39,
+                                    40,
+                                    37,
+                                    38,
+                                    43,
+                                    44,
+                                    41,
+                                    42,
+                                    63,
+                                    64,
+                                    61,
+                                    62,
+                                    67,
+                                    68,
+                                    65,
+                                    66,
+                                    55,
+                                    56,
+                                    53,
+                                    54,
+                                    59,
+                                    60,
+                                    57,
+                                    58,
+                                    79,
+                                    80,
+                                    77,
+                                    78,
+                                    71,
+                                    72,
+                                    69,
+                                    70,
+                                    75,
+                                    76,
+                                    73,
+                                    74
+                                ],
+                                "odtu-tpn-pool": [
+                                    {
+                                        "odtu-type": "org-openroadm-otn-common-types:ODTUCn.ts",
+                                        "tpn-pool": [
+                                            1,
+                                            3,
+                                            2,
+                                            4
+                                        ]
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        }
+                    ]
+                }
+            ],
+                       "ietf-network-topology:link": [
+                {
+                    "link-id": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-A2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-C2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "0",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "400000",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
+                },
+                {
+                    "link-id": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-C2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-A2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "0",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "400000",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
+                },
+                {
+                    "link-id": "ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-A2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-C2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "400000",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "0",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "transportpce-topology:otn-link-type": "ODUC4",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
+                },
+                {
+                    "link-id": "ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-C2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-A2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "400000",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "0",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "transportpce-topology:otn-link-type": "ODUC4",
+                    "org-openroadm-common-network:opposite-link": "ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
+                }
+            ]
+        }
+    ]
+}
diff --git a/tests/sample_configs/honeynode-otntopo400GwithOTUC4.json b/tests/sample_configs/honeynode-otntopo400GwithOTUC4.json
new file mode 100644 (file)
index 0000000..74f345a
--- /dev/null
@@ -0,0 +1,392 @@
+{
+    "network": [
+        {
+            "network-id": "otn-topology",
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "node": [
+                {
+                    "node-id": "XPDR-A2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR1",
+                    "org-openroadm-common-network:node-type": "TPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 1
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-400GE"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR1",
+                                    "tp-ref": "XPDR1-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-A2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-A2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-A2-XPDR2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPDR-C2-XPDR2",
+                    "org-openroadm-common-network:node-type": "MUXPDR",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-otn-network-topology:xpdr-attributes": {
+                        "xpdr-number": 2
+                    },
+                    "org-openroadm-otn-network-topology:switching-pools": {
+                        "odu-switching-pools": [
+                            {
+                                "switching-pool-number": 1,
+                                "switching-pool-type": "non-blocking",
+                                "non-blocking-list": [
+                                    {
+                                        "nbl-number": 1,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-NETWORK1",
+                                            "XPDR2-CLIENT1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    },
+                                    {
+                                        "nbl-number": 2,
+                                        "interconnect-bandwidth-unit": 1000000000,
+                                        "tp-list": [
+                                            "XPDR2-CLIENT2",
+                                            "XPDR2-NETWORK1"
+                                        ],
+                                        "available-interconnect-bandwidth": 10
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "supporting-termination-point": [
+                                {
+                                    "network-ref": "openroadm-topology",
+                                    "node-ref": "XPDR-C2-XPDR2",
+                                    "tp-ref": "XPDR2-NETWORK1"
+                                }
+                            ],
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-otsi-otsigroup"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT1",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        },
+                        {
+                            "tp-id": "XPDR2-CLIENT2",
+                            "org-openroadm-otn-network-topology:tp-supported-interfaces": {
+                                "supported-interface-capability": [
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                                    },
+                                    {
+                                        "if-cap-type": "org-openroadm-port-types:if-100GE-ODU4"
+                                    }
+                                ]
+                            },
+                            "org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes": {
+                                "rate": "org-openroadm-otn-common-types:ODU4"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "openroadm-topology",
+                            "node-ref": "XPDR-C2-XPDR2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        }
+                    ]
+                }
+            ],
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-A2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-C2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "400000",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "0",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
+                },
+                {
+                    "link-id": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1",
+                    "source": {
+                        "source-node": "XPDR-C2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-node": "XPDR-A2-XPDR2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-otn-network-topology:available-bandwidth": "400000",
+                    "org-openroadm-otn-network-topology:used-bandwidth": "0",
+                    "org-openroadm-common-network:link-type": "OTN-LINK",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
index 29b0e40c53b3022f65d4aef295981a0a841ee19c..854adea78d767b089d60a2a6dcc99d80fbb99f87 100644 (file)
     "network": [
         {
             "network-id": "openroadm-topology",
-            "ietf-network-topology:link": [
-                {
-                    "link-id": "XPDR-C2-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP4-TXRX",
-                    "source": {
-                        "source-node": "XPDR-C2-XPDR1",
-                        "source-tp": "XPDR1-NETWORK1"
-                    },
-                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
-                    "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-PP4-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1",
-                    "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "SRG1-PP4-TXRX",
-                        "dest-node": "ROADM-C1-SRG1"
-                    }
-                },
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "node": [
                 {
-                    "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-DEG2",
-                        "source-tp": "DEG2-TTP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "node-id": "ROADM-A1-SRG3",
+                    "org-openroadm-common-network:node-type": "SRG",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "DEG1-TTP-TXRX",
-                        "dest-node": "ROADM-C1-DEG1"
-                    },
-                    "org-openroadm-network-topology:OMS-attributes": {
-                        "span": {
-                            "auto-spanloss": true,
-                            "spanloss-current": 12,
-                            "engineered-spanloss": 12.2,
-                            "spanloss-base": 11.4,
-                            "link-concatenation": [
-                                {
-                                    "SRLG-Id": 0,
-                                    "fiber-type": "smf",
-                                    "pmd": 0.5,
-                                    "SRLG-length": 100000
-                                }
-                            ]
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG3-PP3-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG3-PP2-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG3-CP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
+                        },
+                        {
+                            "tp-id": "SRG3-PP1-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG3-PP4-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
                         }
-                    }
-                },
-                {
-                    "link-id": "XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX",
-                    "source": {
-                        "source-node": "XPDR-C1-XPDR1",
-                        "source-tp": "XPDR1-NETWORK1"
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
                     },
-                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
-                    "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1",
-                    "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "SRG1-PP1-TXRX",
-                        "dest-node": "ROADM-C1-SRG1"
-                    }
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-C1-DEG1",
-                        "source-tp": "DEG1-CTP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "node-id": "XPDR-A2-XPDR1",
+                    "org-openroadm-common-network:node-type": "XPONDER",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "SRG1-CP-TXRX",
-                        "dest-node": "ROADM-C1-SRG1"
-                    }
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "ROADM-A1-SRG1--SRG1-PP1-TXRX"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-SRG3",
-                        "source-tp": "SRG3-CP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "node-id": "XPDR-C2-XPDR1",
+                    "org-openroadm-common-network:node-type": "XPONDER",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "DEG1-CTP-TXRX",
-                        "dest-node": "ROADM-A1-DEG1"
-                    }
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "ROADM-C1-SRG1--SRG1-PP1-TXRX"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-SRG3",
-                        "source-tp": "SRG3-CP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "node-id": "XPDR-A2-XPDR2",
+                    "org-openroadm-common-network:node-type": "XPONDER",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "DEG2-CTP-TXRX",
-                        "dest-node": "ROADM-A1-DEG2"
-                    }
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "ROADM-A1-SRG1--SRG1-PP2-TXRX"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-A2"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-DEG1",
-                        "source-tp": "DEG1-CTP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "node-id": "XPDR-C2-XPDR2",
+                    "org-openroadm-common-network:node-type": "XPONDER",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "SRG3-CP-TXRX",
-                        "dest-node": "ROADM-A1-SRG3"
-                    }
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR2-NETWORK1",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "ROADM-C1-SRG1--SRG1-PP2-TXRX"
+                            },
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDR-C2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1",
-                    "source": {
-                        "source-node": "ROADM-A1-SRG1",
-                        "source-tp": "SRG1-PP1-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "node-id": "ROADM-C1-SRG1",
+                    "org-openroadm-common-network:node-type": "SRG",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "XPDR1-NETWORK1",
-                        "dest-node": "XPDR-A1-XPDR1"
-                    }
-                },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
+                        }
+                    ]
+                },
                 {
-                    "link-id": "ROADM-A1-SRG1-SRG1-PP4-TXRXtoXPDR-A2-XPDR1-XPDR1-NETWORK1",
-                    "source": {
-                        "source-node": "ROADM-A1-SRG1",
-                        "source-tp": "SRG1-PP4-TXRX"
+                    "node-id": "ROADM-A1-SRG1",
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
                     },
-                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "ROADM-A1-DEG1",
+                    "org-openroadm-common-network:node-type": "DEGREE",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP4-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "XPDR1-NETWORK1",
-                        "dest-node": "XPDR-A2-XPDR1"
-                    }
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-C1-DEG1",
-                        "source-tp": "DEG1-TTP-TXRX"
+                    "node-id": "ROADM-A1-DEG2",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
                     },
-                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "ROADM-C1-DEG1",
+                    "org-openroadm-common-network:node-type": "DEGREE",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "DEG2-TTP-TXRX",
-                        "dest-node": "ROADM-A1-DEG2"
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
                     },
-                    "org-openroadm-network-topology:OMS-attributes": {
-                        "span": {
-                            "auto-spanloss": true,
-                            "spanloss-current": 12,
-                            "engineered-spanloss": 12.2,
-                            "spanloss-base": 11.4,
-                            "link-concatenation": [
-                                {
-                                    "SRLG-Id": 0,
-                                    "fiber-type": "smf",
-                                    "pmd": 0.5,
-                                    "SRLG-length": 100000
-                                }
-                            ]
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
                         }
-                    }
+                    ]
                 },
                 {
-                    "link-id": "ROADM-C1-SRG1-SRG1-PP4-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1",
+                    "node-id": "ROADM-C1-DEG2",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map-granularity": 6.25,
+                                "start-edge-freq": 191.325,
+                                "effective-bits": 768,
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
+                        }
+                    ]
+                }
+            ],
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "ROADM-A1-SRG1-SRG1-PP2-TXRXtoXPDR-A2-XPDR2-XPDR2-NETWORK1",
                     "source": {
-                        "source-node": "ROADM-C1-SRG1",
-                        "source-tp": "SRG1-PP4-TXRX"
+                        "source-node": "ROADM-A1-SRG1",
+                        "source-tp": "SRG1-PP2-TXRX"
                     },
                     "org-openroadm-common-network:link-type": "XPONDER-INPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "XPDR-C2-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP4-TXRX",
+                    "org-openroadm-common-network:opposite-link": "XPDR-A2-XPDR2-XPDR2-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "XPDR1-NETWORK1",
-                        "dest-node": "XPDR-C2-XPDR1"
+                        "dest-tp": "XPDR2-NETWORK1",
+                        "dest-node": "XPDR-A2-XPDR2"
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "link-id": "ROADM-C1-SRG1-SRG1-PP2-TXRXtoXPDR-C2-XPDR2-XPDR2-NETWORK1",
                     "source": {
-                        "source-node": "ROADM-C1-DEG2",
-                        "source-tp": "DEG2-CTP-TXRX"
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-PP2-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "XPDR-C2-XPDR2-XPDR2-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "DEG1-CTP-TXRX",
-                        "dest-node": "ROADM-C1-DEG1"
+                        "dest-tp": "XPDR2-NETWORK1",
+                        "dest-node": "XPDR-C2-XPDR2"
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
+                    "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
                     "source": {
-                        "source-node": "ROADM-C1-DEG2",
-                        "source-tp": "DEG2-CTP-TXRX"
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-TTP-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "SRG1-CP-TXRX",
-                        "dest-node": "ROADM-C1-SRG1"
+                        "dest-tp": "DEG1-TTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG1"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "auto-spanloss": true,
+                            "spanloss-current": 12,
+                            "engineered-spanloss": 12.2,
+                            "spanloss-base": 11.4,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": 0.5,
+                                    "SRLG-length": 100000
+                                }
+                            ]
+                        }
                     }
                 },
                 {
-                    "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP4-TXRX",
+                    "link-id": "XPDR-A2-XPDR2-XPDR2-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX",
                     "source": {
-                        "source-node": "XPDR-A2-XPDR1",
-                        "source-tp": "XPDR1-NETWORK1"
+                        "source-node": "XPDR-A2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
                     },
                     "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-PP4-TXRXtoXPDR-A2-XPDR1-XPDR1-NETWORK1",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-PP2-TXRXtoXPDR-A2-XPDR2-XPDR2-NETWORK1",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "SRG1-PP4-TXRX",
+                        "dest-tp": "SRG1-PP2-TXRX",
                         "dest-node": "ROADM-A1-SRG1"
                     }
                 },
                 {
-                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
                     "source": {
-                        "source-node": "ROADM-A1-DEG2",
-                        "source-tp": "DEG2-CTP-TXRX"
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
                     },
                     "org-openroadm-common-network:link-type": "DROP-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "SRG1-CP-TXRX",
-                        "dest-node": "ROADM-A1-SRG1"
+                        "dest-node": "ROADM-C1-SRG1"
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1",
                     "source": {
-                        "source-node": "ROADM-C1-DEG1",
-                        "source-tp": "DEG1-CTP-TXRX"
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-PP1-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "XPDR-C2-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "DEG2-CTP-TXRX",
-                        "dest-node": "ROADM-C1-DEG2"
+                        "dest-tp": "XPDR1-NETWORK1",
+                        "dest-node": "XPDR-C2-XPDR1"
                     }
                 },
                 {
-                    "link-id": "XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX",
+                    "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX",
                     "source": {
-                        "source-node": "XPDR-A1-XPDR1",
+                        "source-node": "XPDR-A2-XPDR1",
                         "source-tp": "XPDR1-NETWORK1"
                     },
                     "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A2-XPDR1-XPDR1-NETWORK1",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "SRG1-PP1-TXRX",
                     }
                 },
                 {
-                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-DEG2",
-                        "source-tp": "DEG2-CTP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
-                    "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
-                    "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "DEG1-CTP-TXRX",
-                        "dest-node": "ROADM-A1-DEG1"
-                    }
-                },
-                {
-                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
                     "source": {
-                        "source-node": "ROADM-A1-SRG1",
-                        "source-tp": "SRG1-CP-TXRX"
+                        "source-node": "ROADM-A1-SRG3",
+                        "source-tp": "SRG3-CP-TXRX"
                     },
                     "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "DEG1-CTP-TXRX",
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1",
+                    "link-id": "ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A2-XPDR1-XPDR1-NETWORK1",
                     "source": {
-                        "source-node": "ROADM-C1-SRG1",
+                        "source-node": "ROADM-A1-SRG1",
                         "source-tp": "SRG1-PP1-TXRX"
                     },
                     "org-openroadm-common-network:link-type": "XPONDER-INPUT",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX",
+                    "org-openroadm-common-network:opposite-link": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "XPDR1-NETWORK1",
-                        "dest-node": "XPDR-C1-XPDR1"
-                    }
-                },
-                {
-                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
-                    "source": {
-                        "source-node": "ROADM-A1-DEG2",
-                        "source-tp": "DEG2-CTP-TXRX"
-                    },
-                    "org-openroadm-common-network:link-type": "DROP-LINK",
-                    "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
-                    "org-openroadm-common-network:administrative-state": "inService",
-                    "destination": {
-                        "dest-tp": "SRG3-CP-TXRX",
-                        "dest-node": "ROADM-A1-SRG3"
+                        "dest-node": "XPDR-A2-XPDR1"
                     }
                 },
                 {
-                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
                     "source": {
-                        "source-node": "ROADM-A1-SRG1",
-                        "source-tp": "SRG1-CP-TXRX"
+                        "source-node": "ROADM-A1-SRG3",
+                        "source-tp": "SRG3-CP-TXRX"
                     },
                     "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "DEG2-CTP-TXRX",
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
                     "source": {
-                        "source-node": "ROADM-C1-SRG1",
-                        "source-tp": "SRG1-CP-TXRX"
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "DEG2-CTP-TXRX",
-                        "dest-node": "ROADM-C1-DEG2"
+                        "dest-tp": "SRG3-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG3"
                     }
                 },
                 {
-                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
                     "source": {
-                        "source-node": "ROADM-A1-DEG1",
-                        "source-tp": "DEG1-CTP-TXRX"
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-TTP-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "SRG1-CP-TXRX",
-                        "dest-node": "ROADM-A1-SRG1"
+                        "dest-tp": "DEG2-TTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "auto-spanloss": true,
+                            "spanloss-current": 12,
+                            "engineered-spanloss": 12.2,
+                            "spanloss-base": 11.4,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": 0.5,
+                                    "SRLG-length": 100000
+                                }
+                            ]
+                        }
                     }
                 },
                 {
-                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
                     "source": {
-                        "source-node": "ROADM-C1-SRG1",
-                        "source-tp": "SRG1-CP-TXRX"
+                        "source-node": "ROADM-C1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
                         "dest-tp": "DEG1-CTP-TXRX",
                     }
                 },
                 {
-                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
                     "source": {
-                        "source-node": "ROADM-A1-DEG1",
-                        "source-tp": "DEG1-CTP-TXRX"
+                        "source-node": "ROADM-C1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
                     },
-                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "destination": {
-                        "dest-tp": "DEG2-CTP-TXRX",
-                        "dest-node": "ROADM-A1-DEG2"
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-C1-SRG1"
                     }
-                }
-            ],
-            "network-types": {
-                "org-openroadm-common-network:openroadm-common-network": {}
-            },
-            "node": [
+                },
                 {
-                    "node-id": "ROADM-A1-SRG3",
-                    "org-openroadm-common-network:node-type": "SRG",
-                    "org-openroadm-common-network:operational-state": "inService",
-                    "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:srg-attributes": {
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "SRG3-PP3-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG3-PP2-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG3-CP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
-                        },
-                        {
-                            "tp-id": "SRG3-PP1-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG3-PP4-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-A1"
-                        }
-                    ]
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG1"
+                    }
                 },
                 {
-                    "node-id": "XPDR-A2-XPDR1",
-                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "XPDR1-CLIENT1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
-                            "org-openroadm-network-topology:xpdr-network-attributes": {
-                                "tail-equipment-id": "ROADM-A1-SRG1--SRG1-PP4-TXRX"
-                            },
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "XPDR-A2"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG2"
+                    }
                 },
                 {
-                    "node-id": "XPDR-C2-XPDR1",
-                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "link-id": "XPDR-C2-XPDR2-XPDR2-NETWORK1toROADM-C1-SRG1-SRG1-PP2-TXRX",
+                    "source": {
+                        "source-node": "XPDR-C2-XPDR2",
+                        "source-tp": "XPDR2-NETWORK1"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-PP2-TXRXtoXPDR-C2-XPDR2-XPDR2-NETWORK1",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "XPDR1-CLIENT1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
-                            "org-openroadm-network-topology:xpdr-network-attributes": {
-                                "tail-equipment-id": "ROADM-C1-SRG1--SRG1-PP4-TXRX"
-                            },
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "XPDR-C2"
-                        },
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeC"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-TXRX",
+                        "dest-node": "ROADM-C1-SRG1"
+                    }
                 },
                 {
-                    "node-id": "XPDR-C1-XPDR1",
-                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "XPDR1-CLIENT1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-CLIENT2",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK2",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK2",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT2",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
-                            "org-openroadm-network-topology:xpdr-network-attributes": {
-                                "tail-equipment-id": "ROADM-C1-SRG1--SRG1-PP1-TXRX"
-                            },
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeC"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "XPDR-C1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    }
                 },
                 {
-                    "node-id": "ROADM-C1-SRG1",
-                    "org-openroadm-common-network:node-type": "SRG",
+                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:srg-attributes": {
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "SRG1-PP4-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP1-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP2-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP3-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-CP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeC"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-C1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    }
                 },
                 {
-                    "node-id": "ROADM-A1-SRG1",
-                    "org-openroadm-common-network:node-type": "SRG",
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:srg-attributes": {
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "SRG1-PP4-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP1-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP2-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-PP3-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP"
-                        },
-                        {
-                            "tp-id": "SRG1-CP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-A1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "SRG3-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG3"
+                    }
                 },
                 {
-                    "node-id": "ROADM-A1-DEG1",
-                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:degree-attributes": {
-                        "degree-number": 1,
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "DEG1-CTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
-                        },
-                        {
-                            "tp-id": "DEG1-TTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-A1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    }
                 },
                 {
-                    "node-id": "ROADM-A1-DEG2",
-                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:degree-attributes": {
-                        "degree-number": 2,
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "DEG2-TTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
-                        },
-                        {
-                            "tp-id": "DEG2-CTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-A1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG2"
+                    }
                 },
                 {
-                    "node-id": "XPDR-A1-XPDR1",
-                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "XPDR1-CLIENT1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-CLIENT2",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK2",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK2",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT2",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        },
-                        {
-                            "tp-id": "XPDR1-NETWORK1",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
-                            "org-openroadm-network-topology:xpdr-network-attributes": {
-                                "tail-equipment-id": "ROADM-A1-SRG1--SRG1-PP1-TXRX"
-                            },
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "XPDR-A1"
-                        },
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeA"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG1"
+                    }
                 },
                 {
-                    "node-id": "ROADM-C1-DEG1",
-                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:degree-attributes": {
-                        "degree-number": 1,
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
-                    },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "DEG1-CTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
-                        },
-                        {
-                            "tp-id": "DEG1-TTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeC"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-C1"
-                        }
-                    ]
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG1"
+                    }
                 },
                 {
-                    "node-id": "ROADM-C1-DEG2",
-                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "link-id": "XPDR-C2-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX",
+                    "source": {
+                        "source-node": "XPDR-C2-XPDR1",
+                        "source-tp": "XPDR1-NETWORK1"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
                     "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "org-openroadm-network-topology:degree-attributes": {
-                        "degree-number": 2,
-                        "avail-freq-maps": [
-                            {
-                                "map-name": "cband",
-                                "freq-map-granularity": 6.25,
-                                "start-edge-freq": 191.325,
-                                "effective-bits": 768,
-                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
-                            }
-                        ]
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-TXRX",
+                        "dest-node": "ROADM-C1-SRG1"
+                    }
+                },
+                {
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
                     },
-                    "ietf-network-topology:termination-point": [
-                        {
-                            "tp-id": "DEG2-TTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP"
-                        },
-                        {
-                            "tp-id": "DEG2-CTP-TXRX",
-                            "org-openroadm-common-network:operational-state": "inService",
-                            "org-openroadm-common-network:administrative-state": "inService",
-                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP"
-                        }
-                    ],
-                    "supporting-node": [
-                        {
-                            "network-ref": "clli-network",
-                            "node-ref": "NodeC"
-                        },
-                        {
-                            "network-ref": "openroadm-network",
-                            "node-ref": "ROADM-C1"
-                        }
-                    ]
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    }
                 }
             ]
         }
index b7355eec13b7704b4eda2d5998fb8362cc318a36..59132c4e9add81f9597c8921e1590fb8a4b5f6d4 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
   <netconf xmlns="urn:ietf:params:xml:ns:netmod:notification">
-  <streams>
-    <stream>
-      <name>OPENROADM</name>
-    </stream>
-  </streams>
-</netconf>
+    <streams>
+      <stream>
+        <name>OPENROADM</name>
+      </stream>
+    </streams>
+  </netconf>
   <org-openroadm-device xmlns="http://org/openroadm/device">
     <info>
       <node-id>XPDR-A2</node-id>
         <slot-name>slot-2</slot-name>
         <label>2</label>
         <provisioned-circuit-pack>1/0/1-PLUG-CLIENT</provisioned-circuit-pack>
+        <slot-status>installed-prov-match</slot-status>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-3</slot-name>
         <label>3</label>
-        <slot-status>empty-not-prov</slot-status>
+        <provisioned-circuit-pack>1/0/3-PLUG-CLIENT</provisioned-circuit-pack>
+        <slot-status>installed-prov-match</slot-status>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-4</slot-name>
         <label>4</label>
         <slot-status>empty-not-prov</slot-status>
       </cp-slots>
+      <cp-slots>
+        <slot-name>slot-5</slot-name>
+        <label>5</label>
+        <slot-status>empty-not-prov</slot-status>
+      </cp-slots>
+      <cp-slots>
+        <slot-name>slot-6</slot-name>
+        <label>6</label>
+        <slot-status>empty-not-prov</slot-status>
+      </cp-slots>
+      <cp-slots>
+        <slot-name>slot-7</slot-name>
+        <label>7</label>
+        <provisioned-circuit-pack>1/0/7-PLUG-NET</provisioned-circuit-pack>
+        <slot-status>installed-prov-match</slot-status>
+      </cp-slots>
     </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/0/1-PLUG-NET</circuit-pack-name>
         <port-capabilities xmlns="http://org/openroadm/port-capability">
           <supported-interface-capability>
             <if-cap-type xmlns:org-openroadm-port-types="http://org/openroadm/port/types">org-openroadm-port-types:if-otsi-otsigroup</if-cap-type>
-            <otsigroup-capability-profile-name>otsigroup-profile1</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
           </supported-interface-capability>
         </port-capabilities>
       </ports>
         <lifecycle-state>deployed</lifecycle-state>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
-        <transponder-port>
-          <port-power-capability-min-rx>-22.00</port-power-capability-min-rx>
-          <port-power-capability-min-tx>-5.00</port-power-capability-min-tx>
-          <port-power-capability-max-rx>1.00</port-power-capability-max-rx>
-          <port-power-capability-max-tx>0.00</port-power-capability-max-tx>
-        </transponder-port>
         <port-capabilities xmlns="http://org/openroadm/port-capability">
           <supported-interface-capability>
             <if-cap-type xmlns:org-openroadm-port-types="http://org/openroadm/port/types">org-openroadm-port-types:if-400GE</if-cap-type>
         </port-capabilities>
       </ports>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/0/3-PLUG-CLIENT</circuit-pack-name>
+      <circuit-pack-type>client_pluggable</circuit-pack-type>
+      <circuit-pack-product-code>Client_P</circuit-pack-product-code>
+      <lifecycle-state>deployed</lifecycle-state>
+      <administrative-state>inService</administrative-state>
+      <vendor>VendorA</vendor>
+      <model>QSFP28</model>
+      <serial-id>serial-1234</serial-id>
+      <type>client_pluggable</type>
+      <product-code>clientXPDR</product-code>
+      <manufacture-date>2007-10-10T00:00:00Z</manufacture-date>
+      <clei>12345678901</clei>
+      <hardware-version>0.1</hardware-version>
+      <operational-state>inService</operational-state>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>1</shelf>
+      <slot>1</slot>
+      <subSlot>3</subSlot>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <is-physical>true</is-physical>
+      <is-passive>true</is-passive>
+      <faceplate-label>xponder-XPDRA</faceplate-label>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/0</circuit-pack-name>
+        <cp-slot-name>slot-3</cp-slot-name>
+      </parent-circuit-pack>
+      <ports>
+        <port-name>C3</port-name>
+        <administrative-state>inService</administrative-state>
+        <operational-state>inService</operational-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+            <otn-capability>
+              <mpdr-client-restriction>
+                <network-ho-odu-circuit-pack-name>1/0/7-PLUG-NETWORK</network-ho-odu-circuit-pack-name>
+                <muxp-profile-name>ABCD-4-BY-100G-1</muxp-profile-name>
+                <muxp-profile-name>ABCD-3-BY-100G-1</muxp-profile-name>
+                <network-ho-odu-port-name>1</network-ho-odu-port-name>
+              </mpdr-client-restriction>
+            </otn-capability>
+          </supported-interface-capability>
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+            <otn-capability>
+              <mpdr-client-restriction>
+                <network-ho-odu-circuit-pack-name>1/0/7-PLUG-NETWORK</network-ho-odu-circuit-pack-name>
+                <muxp-profile-name>ABCD-4-BY-100G-1</muxp-profile-name>
+                <muxp-profile-name>ABCD-3-BY-100G-1</muxp-profile-name>
+                <network-ho-odu-port-name>1</network-ho-odu-port-name>
+              </mpdr-client-restriction>
+            </otn-capability>
+          </supported-interface-capability>
+        </port-capabilities>
+        <port-type>QSFP28</port-type>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>switch-client</port-qual>
+      </ports>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/0/7-PLUG-NETWORK</circuit-pack-name>
+      <circuit-pack-type>CFP2-DCO</circuit-pack-type>
+      <circuit-pack-product-code>Line_NW_P</circuit-pack-product-code>
+      <lifecycle-state>deployed</lifecycle-state>
+      <administrative-state>inService</administrative-state>
+      <vendor>VendorA</vendor>
+      <model>CFP2-DCO</model>
+      <serial-id>serial-1234</serial-id>
+      <type>line_pluggable</type>
+      <product-code>lineXPDR</product-code>
+      <manufacture-date>2007-10-10T00:00:00Z</manufacture-date>
+      <clei>12345678901</clei>
+      <hardware-version>0.1</hardware-version>
+      <operational-state>inService</operational-state>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-mode>NORMAL</circuit-pack-mode>
+      <shelf>1</shelf>
+      <slot>1</slot>
+      <subSlot>7</subSlot>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <is-physical>true</is-physical>
+      <is-passive>true</is-passive>
+      <faceplate-label>xponder-XPDRA</faceplate-label>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/0</circuit-pack-name>
+        <cp-slot-name>slot-7</cp-slot-name>
+      </parent-circuit-pack>
+      <ports>
+        <port-name>L2</port-name>
+        <administrative-state>inService</administrative-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>pluggable</faceplate-label>
+        <is-physical>true</is-physical>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13.0</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5.0</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22.0</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0.0</port-power-capability-max-tx>
+        </transponder-port>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>switch-network</port-qual>
+      </ports>
+    </circuit-packs>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC2.4-OTUC2</profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otucn-n-rate>2</otucn-n-rate>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC3.6-OTUC3</profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic3.6</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otucn-n-rate>3</otucn-n-rate>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC4.8-OTUC4</profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otucn-n-rate>4</otucn-n-rate>
+    </otsigroup-capability-profile>
+    <muxp-profile>
+      <profile-name>ABCD-4-BY-100G-1</profile-name>
+      <network-ho-odu-trib-port-number>1</network-ho-odu-trib-port-number>
+      <network-ho-odu-opucn-trib-slots>1.3</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.2</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.5</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.4</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.1</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.18</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.17</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.16</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.15</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.7</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.6</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.9</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.19</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.8</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.10</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.20</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.14</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.13</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.12</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.11</network-ho-odu-opucn-trib-slots>
+      <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTUCn.ts</odtu-type>
+    </muxp-profile>
+    <muxp-profile>
+      <profile-name>ABCD-4-BY-100G-2</profile-name>
+      <network-ho-odu-trib-port-number>2</network-ho-odu-trib-port-number>
+      <network-ho-odu-opucn-trib-slots>2.2</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.1</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.4</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.3</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.9</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.16</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.6</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.17</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.5</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.18</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.8</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.19</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.7</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.12</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.13</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.14</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.15</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.20</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.10</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>2.11</network-ho-odu-opucn-trib-slots>
+      <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTUCn.ts</odtu-type>
+    </muxp-profile>
+    <muxp-profile>
+      <profile-name>ABCD-4-BY-100G-3</profile-name>
+      <network-ho-odu-trib-port-number>3</network-ho-odu-trib-port-number>
+      <network-ho-odu-opucn-trib-slots>3.1</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.3</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.2</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.9</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.8</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.17</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.5</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.18</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.4</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.19</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.7</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.6</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.13</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.14</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.15</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.16</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.20</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.10</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.11</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>3.12</network-ho-odu-opucn-trib-slots>
+      <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTUCn.ts</odtu-type>
+      </muxp-profile>
+    <muxp-profile>
+      <profile-name>ABCD-4-BY-100G-4</profile-name>
+      <network-ho-odu-trib-port-number>4</network-ho-odu-trib-port-number>
+      <network-ho-odu-opucn-trib-slots>4.2</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.1</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.8</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.7</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.9</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.19</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.4</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.18</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.3</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.6</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.5</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.15</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.14</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.17</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.16</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.11</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.10</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.13</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.12</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>4.20</network-ho-odu-opucn-trib-slots>
+      <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTUCn.ts</odtu-type>
+    </muxp-profile>
+    <muxp-profile>
+      <profile-name>ABCD-3-BY-100G-1</profile-name>
+      <network-oducn-n-rate>3</network-oducn-n-rate>
+      <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTUCn.ts</odtu-type>
+      <network-ho-odu-trib-port-number>1</network-ho-odu-trib-port-number>
+      <network-ho-odu-opucn-trib-slots>1.3</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.2</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.5</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.4</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.1</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.18</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.17</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.16</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.15</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.7</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.6</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.9</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.8</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.19</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.10</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.20</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.14</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.13</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.12</network-ho-odu-opucn-trib-slots>
+      <network-ho-odu-opucn-trib-slots>1.11</network-ho-odu-opucn-trib-slots>
+      <network-odu-rate xmlns:x="http://org/openroadm/otn-common-types">x:ODUCn</network-odu-rate>
+    </muxp-profile>
     <xponder>
       <xpdr-number>1</xpdr-number>
       <xpdr-type>tpdr</xpdr-type>
         <eqpt-srg-id>1</eqpt-srg-id>
       </xpdr-port>
     </xponder>
+    <xponder>
+      <xpdr-number>2</xpdr-number>
+      <xpdr-type>mpdr</xpdr-type>
+      <xpdr-port>
+        <index>1</index>
+        <circuit-pack-name>1/0/7-PLUG-NETWORK</circuit-pack-name>
+        <port-name>L2</port-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>2</index>
+        <circuit-pack-name>1/0/3-PLUG-CLIENT</circuit-pack-name>
+        <port-name>C3</port-name>
+      </xpdr-port>
+    </xponder>
     <connection-map>
       <connection-map-number>1</connection-map-number>
       <source>
         <port-name>C1</port-name>
       </destination>
     </connection-map>
-    <otsigroup-capability-profile>
-      <profile-name>otsigroup-profile1</profile-name>
-      <if-cap-type xmlns:org-openroadm-port-types="http://org/openroadm/port/types">org-openroadm-port-types:if-OTUCn-ODUCn</if-cap-type>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:org-openroadm-common-optical-channel-types="http://org/openroadm/common-optical-channel-types">org-openroadm-common-optical-channel-types:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
-    </otsigroup-capability-profile>
     <mc-capability-profile>
       <profile-name>mc-capa-profile1</profile-name>
       <center-freq-granularity>3.125</center-freq-granularity>
       <max-slots>14</max-slots>
     </mc-capability-profile>
   </org-openroadm-device>
-</data>
+</data>
\ No newline at end of file
index 5bf14635fc5f4a72a85c05ccfceb7fbc27ee9a07..ae93ca30e09d4c4b15e32c6f79aaf0ab86abc73d 100644 (file)
         <port-name>C1</port-name>
       </destination>
     </connection-map>
+    <mc-capability-profile>
+      <profile-name>mc-capa-profile1</profile-name>
+      <center-freq-granularity>3.125</center-freq-granularity>
+      <min-edge-freq>191.325</min-edge-freq>
+      <max-edge-freq>196.125</max-edge-freq>
+      <slot-width-granularity>6.25</slot-width-granularity>
+      <min-slots>1</min-slots>
+      <max-slots>14</max-slots>
+    </mc-capability-profile>
   </org-openroadm-device>
-  <current-pm-list xmlns="http://org/openroadm/pm">
-  <current-pm-entry>
-    <pm-resource-instance xmlns:d="http://org/openroadm/device">/d:org-openroadm-device/d:interface[d:name='XPDR1-NETWORK1-OTU']</pm-resource-instance>
-    <pm-resource-type>interface</pm-resource-type>
-    <pm-resource-type-extension></pm-resource-type-extension>
-    <retrieval-time>2018-06-07T13:22:58+00:00</retrieval-time>
-    <current-pm>
-      <type>opticalPowerOutput</type>
-      <extension></extension>
-      <location>nearEnd</location>
-      <direction>tx</direction>
-      <measurement>
-        <granularity>15min</granularity>
-        <pmParameterValue>2.5</pmParameterValue>
-        <pmParameterUnit>dBm</pmParameterUnit>
-        <validity>complete</validity>
-      </measurement>
-      <measurement>
-        <granularity>24Hour</granularity>
-        <pmParameterValue>2.23</pmParameterValue>
-        <pmParameterUnit>dBm</pmParameterUnit>
-        <validity>complete</validity>
-      </measurement>
-    </current-pm>
-    <current-pm>
-      <type>opticalPowerInput</type>
-      <extension></extension>
-      <location>nearEnd</location>
-      <direction>rx</direction>
-      <measurement>
-        <granularity>15min</granularity>
-        <pmParameterValue>-45.1</pmParameterValue>
-        <pmParameterUnit>dBm</pmParameterUnit>
-        <validity>complete</validity>
-      </measurement>
-      <measurement>
-        <granularity>24Hour</granularity>
-        <pmParameterValue>-49.3</pmParameterValue>
-        <pmParameterUnit>dBm</pmParameterUnit>
-        <validity>complete</validity>
-      </measurement>
-    </current-pm>
-  </current-pm-entry>
-</current-pm-list>
 </data>
index a2e9c3bff546ce35875379abcccae3fdda907ad0..7e877b30fa7a2536d388f513f8110af78f9f723b 100644 (file)
         "node-model": "model1",
         "node-ip-address": "1.2.3.4"
       },
-      "mapping": [],
+      "mapping": [
+        {
+          "logical-connection-point": "XPDR1-CLIENT1",
+          "port-qual": "xpdr-client"
+        }
+      ],
       "mc-capabilities": [],
       "cp-to-degree": [],
       "switching-pool-lcp": []
         "node-model": "model1",
         "node-ip-address": "1.2.3.4"
       },
-      "mapping": [],
+      "mapping": [
+        {
+          "logical-connection-point": "XPDR1-CLIENT1",
+          "port-qual": "xpdr-client"
+        }
+      ],
       "mc-capabilities": [],
       "cp-to-degree": [],
       "switching-pool-lcp": []
         "node-model": "model1",
         "node-ip-address": "1.2.3.4"
       },
-      "mapping": [],
+      "mapping": [
+        {
+          "logical-connection-point": "XPDR1-CLIENT1",
+          "port-qual": "xpdr-client"
+        }
+      ],
       "mc-capabilities": [],
       "cp-to-degree": [],
       "switching-pool-lcp": []
         "node-model": "model1",
         "node-ip-address": "1.2.3.4"
       },
-      "mapping": [],
+      "mapping": [
+        {
+          "logical-connection-point": "XPDR1-CLIENT1",
+          "port-qual": "xpdr-client"
+        }
+      ],
       "mc-capabilities": [],
       "cp-to-degree": [],
       "switching-pool-lcp": []
         "node-model": "model1",
         "node-ip-address": "1.2.3.4"
       },
-      "mapping": [],
+      "mapping": [
+        {
+          "logical-connection-point": "XPDR1-CLIENT1",
+          "port-qual": "xpdr-client"
+        }
+      ],
       "mc-capabilities": [],
       "cp-to-degree": [],
       "switching-pool-lcp": []
index 7d0e4f7984fb71b069be595d31c5102b1817f277..377bde837913c091b85feaa7291e1fb52a1ba43a 100644 (file)
 {
     "network": {
         "nodes": [
+            {
+                "node-id": "XPDR-A2",
+                "node-info": {
+                    "node-clli": "NodeA",
+                    "node-vendor": "vendorA",
+                    "openroadm-version": "7.1",
+                    "node-ip-address": "1.2.3.4",
+                    "node-type": "xpdr",
+                    "node-model": "model"
+                },
+                "switching-pool-lcp": [
+                    {
+                        "switching-pool-number": 1,
+                        "switching-pool-type": "blocking",
+                        "non-blocking-list": [
+                            {
+                                "nbl-number": 2,
+                                "lcp-list": [
+                                    "XPDR2-NETWORK1",
+                                    "XPDR2-CLIENT2"
+                                ],
+                                "interconnect-bandwidth": 0
+                            },
+                            {
+                                "nbl-number": 1,
+                                "lcp-list": [
+                                    "XPDR2-CLIENT1",
+                                    "XPDR2-NETWORK1"
+                                ],
+                                "interconnect-bandwidth": 0
+                            }
+                        ]
+                    }
+                ],
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR2-CLIENT1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
+                        "mpdr-restrictions": {
+                            "min-trib-slot": "1.1",
+                            "max-trib-slot": "1.20"
+                        },
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE-ODU4",
+                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                        ],
+                        "port-oper-state": "InService",
+                        "port-direction": "bidirectional",
+                        "lcp-hash-val": "AK+Cna4EclRH",
+                        "supporting-port": "C1",
+                        "port-qual": "switch-client"
+                    },
+                    {
+                        "logical-connection-point": "XPDR1-NETWORK1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-otsi-otsigroup"
+                        ],
+                        "port-oper-state": "InService",
+                        "connection-map-lcp": "XPDR1-CLIENT1",
+                        "port-direction": "bidirectional",
+                        "xponder-type": "tpdr",
+                        "lcp-hash-val": "AIGiVAQ4gDil",
+                        "supporting-port": "L1",
+                        "port-qual": "xpdr-network"
+                    },
+                    {
+                        "logical-connection-point": "XPDR2-CLIENT2",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
+                        "mpdr-restrictions": {
+                            "min-trib-slot": "2.1",
+                            "max-trib-slot": "2.20"
+                        },
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE-ODU4",
+                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                        ],
+                        "port-oper-state": "InService",
+                        "port-direction": "bidirectional",
+                        "lcp-hash-val": "AK+Cna4EclRE",
+                        "supporting-port": "C1",
+                        "port-qual": "switch-client"
+                    },
+                    {
+                        "logical-connection-point": "XPDR1-CLIENT1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-400GE"
+                        ],
+                        "port-oper-state": "InService",
+                        "connection-map-lcp": "XPDR1-NETWORK1",
+                        "port-direction": "bidirectional",
+                        "lcp-hash-val": "AODABTVSOHH0",
+                        "supporting-port": "C1",
+                        "port-qual": "xpdr-client"
+                    },
+                    {
+                        "logical-connection-point": "XPDR2-NETWORK1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-otsi-otsigroup"
+                        ],
+                        "port-oper-state": "InService",
+                        "port-direction": "bidirectional",
+                        "xponder-type": "mpdr",
+                        "lcp-hash-val": "LY9PxYJqUbw=",
+                        "supporting-port": "L1",
+                        "port-qual": "switch-network"
+                    }
+                ],
+                "mc-capabilities": [
+                    {
+                        "mc-node-name": "XPDR-mcprofile",
+                        "center-freq-granularity": 3.125,
+                        "slot-width-granularity": 6.25
+                    }
+                ]
+            },
             {
                 "node-id": "ROADM-C1",
                 "node-info": {
-                    "node-type": "rdm",
-                    "node-model": "model2",
-                    "node-ip-address": "127.0.0.13",
                     "node-clli": "NodeC",
+                    "node-vendor": "vendorA",
                     "openroadm-version": "2.2.1",
-                    "node-vendor": "vendorA"
+                    "node-ip-address": "127.0.0.13",
+                    "node-type": "rdm",
+                    "node-model": "model2"
                 },
                 "cp-to-degree": [
                     {
                 ],
                 "mapping": [
                     {
-                        "logical-connection-point": "SRG1-PP3-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG1-PP2-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C3"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C2",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP1-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG1-PP4-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C4",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "DEG1-TTP-TXRX",
-                        "supporting-oms": "OMS-DEG1-TTP-TXRX",
-                        "supporting-circuit-pack-name": "1/0",
-                        "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                        "logical-connection-point": "DEG2-TTP-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "L1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "2/0",
+                        "supporting-port": "L1",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP2-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG1-PP3-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C2"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C3",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP4-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "DEG1-TTP-TXRX",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/0",
+                        "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                        "port-oper-state": "InService",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C4"
+                        "supporting-port": "L1",
+                        "supporting-oms": "OMS-DEG1-TTP-TXRX"
                     },
                     {
-                        "logical-connection-point": "DEG2-TTP-TXRX",
-                        "supporting-circuit-pack-name": "2/0",
+                        "logical-connection-point": "SRG1-PP1-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "L1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C1",
+                        "port-oper-state": "InService"
                     }
                 ],
                 "mc-capabilities": [
                 ]
             },
             {
-                "node-id": "XPDR-A2",
+                "node-id": "XPDR-C2",
+                "node-info": {
+                    "node-clli": "NodeC",
+                    "node-vendor": "vendorA",
+                    "openroadm-version": "7.1",
+                    "node-ip-address": "1.2.3.4",
+                    "node-type": "xpdr",
+                    "node-model": "model"
+                },
+                "switching-pool-lcp": [
+                    {
+                        "switching-pool-number": 1,
+                        "switching-pool-type": "blocking",
+                        "non-blocking-list": [
+                            {
+                                "nbl-number": 2,
+                                "lcp-list": [
+                                    "XPDR2-NETWORK1",
+                                    "XPDR2-CLIENT2"
+                                ],
+                                "interconnect-bandwidth": 0
+                            },
+                            {
+                                "nbl-number": 1,
+                                "lcp-list": [
+                                    "XPDR2-CLIENT1",
+                                    "XPDR2-NETWORK1"
+                                ],
+                                "interconnect-bandwidth": 0
+                            }
+                        ]
+                    }
+                ],
                 "mapping": [
+                    {
+                        "logical-connection-point": "XPDR2-CLIENT1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
+                        "mpdr-restrictions": {
+                            "min-trib-slot": "1.1",
+                            "max-trib-slot": "1.20"
+                        },
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE-ODU4",
+                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                        ],
+                        "port-oper-state": "InService",
+                        "port-direction": "bidirectional",
+                        "lcp-hash-val": "AP2/mp+mI1y5",
+                        "supporting-port": "C1",
+                        "port-qual": "switch-client"
+                    },
                     {
                         "logical-connection-point": "XPDR1-NETWORK1",
-                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
                         "supported-interface-capability": [
-                            "org-openroadm-port-types:if-OTUCn-ODUCn"
+                            "org-openroadm-port-types:if-otsi-otsigroup"
                         ],
-                        "lcp-hash-val": "AIGiVAQ4gDil",
+                        "port-oper-state": "InService",
+                        "connection-map-lcp": "XPDR1-CLIENT1",
                         "port-direction": "bidirectional",
                         "xponder-type": "tpdr",
+                        "lcp-hash-val": "ZbICgmaBrJM=",
                         "supporting-port": "L1",
-                        "port-qual": "xpdr-network",
-                        "connection-map-lcp": "XPDR1-CLIENT1"
+                        "port-qual": "xpdr-network"
                     },
                     {
-                        "logical-connection-point": "XPDR1-CLIENT1",
-                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT",
+                        "logical-connection-point": "XPDR2-CLIENT2",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
+                        "mpdr-restrictions": {
+                            "min-trib-slot": "2.1",
+                            "max-trib-slot": "2.20"
+                        },
                         "supported-interface-capability": [
-                            "org-openroadm-port-types:if-400GE"
+                            "org-openroadm-port-types:if-100GE-ODU4",
+                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
-                        "lcp-hash-val": "AODABTVSOHH0",
+                        "port-oper-state": "InService",
                         "port-direction": "bidirectional",
+                        "lcp-hash-val": "AP2/mp+mI1y6",
                         "supporting-port": "C1",
-                        "port-qual": "xpdr-client",
-                        "connection-map-lcp": "XPDR1-NETWORK1"
-                    }
-                ],
-                "node-info": {
-                    "node-type": "xpdr",
-                    "node-model": "model2",
-                    "node-ip-address": "1.2.3.4",
-                    "node-clli": "NodeA",
-                    "openroadm-version": "7.1",
-                    "node-vendor": "vendorA"
-                }
-            },
-            {
-                "node-id": "XPDR-C2",
-                "mapping": [
+                        "port-qual": "switch-client"
+                    },
                     {
-                        "logical-connection-point": "XPDR1-NETWORK1",
-                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET",
+                        "logical-connection-point": "XPDR1-CLIENT1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
                         "supported-interface-capability": [
-                            "org-openroadm-port-types:if-OTUCn-ODUCn"
+                            "org-openroadm-port-types:if-400GE"
                         ],
-                        "lcp-hash-val": "ZbICgmaBrJM=",
+                        "port-oper-state": "InService",
+                        "connection-map-lcp": "XPDR1-NETWORK1",
                         "port-direction": "bidirectional",
-                        "xponder-type": "tpdr",
-                        "supporting-port": "L1",
-                        "port-qual": "xpdr-network",
-                        "connection-map-lcp": "XPDR1-CLIENT1"
+                        "lcp-hash-val": "M5cViLS5z3o=",
+                        "supporting-port": "C1",
+                        "port-qual": "xpdr-client"
                     },
                     {
-                        "logical-connection-point": "XPDR1-CLIENT1",
-                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT",
+                        "logical-connection-point": "XPDR2-NETWORK1",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
                         "supported-interface-capability": [
-                            "org-openroadm-port-types:if-400GE"
+                            "org-openroadm-port-types:if-otsi-otsigroup"
                         ],
-                        "lcp-hash-val": "M5cViLS5z3o=",
+                        "port-oper-state": "InService",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C1",
-                        "port-qual": "xpdr-client",
-                        "connection-map-lcp": "XPDR1-NETWORK1"
+                        "xponder-type": "mpdr",
+                        "lcp-hash-val": "Nmbu2MNHvc4=",
+                        "supporting-port": "L1",
+                        "port-qual": "switch-network"
                     }
                 ],
-                "node-info": {
-                    "node-type": "xpdr",
-                    "node-model": "model2",
-                    "node-ip-address": "1.2.3.4",
-                    "node-clli": "NodeC",
-                    "openroadm-version": "7.1",
-                    "node-vendor": "vendorA"
-                }
+                "mc-capabilities": [
+                    {
+                        "mc-node-name": "XPDR-mcprofile",
+                        "center-freq-granularity": 3.125,
+                        "slot-width-granularity": 6.25
+                    }
+                ]
             },
             {
                 "node-id": "ROADM-A1",
                 "node-info": {
-                    "node-type": "rdm",
-                    "node-model": "model2",
-                    "node-ip-address": "127.0.0.11",
                     "node-clli": "NodeA",
+                    "node-vendor": "vendorA",
                     "openroadm-version": "2.2.1",
-                    "node-vendor": "vendorA"
+                    "node-ip-address": "127.0.0.11",
+                    "node-type": "rdm",
+                    "node-model": "model2"
                 },
                 "cp-to-degree": [
                     {
                 ],
                 "mapping": [
                     {
-                        "logical-connection-point": "SRG1-PP3-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG3-PP1-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C3"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "5/0",
+                        "supporting-port": "C1",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG3-PP2-TXRX",
-                        "supporting-circuit-pack-name": "5/0",
+                        "logical-connection-point": "SRG1-PP2-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C2"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C2",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP1-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG3-PP4-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "5/0",
+                        "supporting-port": "C4",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "DEG1-TTP-TXRX",
-                        "supporting-circuit-pack-name": "1/0",
+                        "logical-connection-point": "SRG1-PP4-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "L1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C4",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG3-PP1-TXRX",
-                        "supporting-circuit-pack-name": "5/0",
+                        "logical-connection-point": "SRG3-PP3-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "5/0",
+                        "supporting-port": "C3",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP2-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "DEG2-TTP-TXRX",
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "2/0",
+                        "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                        "port-oper-state": "InService",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C2"
+                        "supporting-port": "L1",
+                        "supporting-oms": "OMS-DEG2-TTP-TXRX"
                     },
                     {
-                        "logical-connection-point": "SRG1-PP4-TXRX",
-                        "supporting-circuit-pack-name": "3/0",
+                        "logical-connection-point": "SRG1-PP3-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C4"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C3",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG3-PP4-TXRX",
-                        "supporting-circuit-pack-name": "5/0",
+                        "logical-connection-point": "SRG3-PP2-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C4"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "5/0",
+                        "supporting-port": "C2",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "SRG3-PP3-TXRX",
-                        "supporting-circuit-pack-name": "5/0",
+                        "logical-connection-point": "DEG1-TTP-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "C3"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "1/0",
+                        "supporting-port": "L1",
+                        "port-oper-state": "InService"
                     },
                     {
-                        "logical-connection-point": "DEG2-TTP-TXRX",
-                        "supporting-oms": "OMS-DEG2-TTP-TXRX",
-                        "supporting-circuit-pack-name": "2/0",
-                        "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                        "logical-connection-point": "SRG1-PP1-TXRX",
                         "port-direction": "bidirectional",
-                        "supporting-port": "L1"
+                        "port-admin-state": "InService",
+                        "supporting-circuit-pack-name": "3/0",
+                        "supporting-port": "C1",
+                        "port-oper-state": "InService"
                     }
                 ],
                 "mc-capabilities": [
index 189e9245bfc6362af9ddefa5b9b26439e20552ac..0a8ed732056f88dff2aa63c083691c0f9f524488 100644 (file)
@@ -33,7 +33,22 @@ class TransportPCE400Gtesting(unittest.TestCase):
             TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                             "..", "..", "sample_configs", "honeynode-topo400G.json")
             with open(TOPO_BI_DIR_FILE, 'r') as topo_bi_dir:
-                cls.simple_topo_bi_dir_data = topo_bi_dir.read()
+                cls.topo_bi_dir_data = topo_bi_dir.read()
+
+            OTN_TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                            "..", "..", "sample_configs", "honeynode-otntopo400G.json")
+            with open(OTN_TOPO_BI_DIR_FILE, 'r') as otn_topo_bi_dir:
+                cls.otn_topo_bi_dir_data = otn_topo_bi_dir.read()
+
+            OTUC4_OTN_TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                            "..", "..", "sample_configs", "honeynode-otntopo400GwithOTUC4.json")
+            with open(OTUC4_OTN_TOPO_BI_DIR_FILE, 'r') as otuc4_otn_topo_bi_dir:
+                cls.otuc4_otn_topo_bi_dir_data = otuc4_otn_topo_bi_dir.read()
+
+            ODUC4_OTN_TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                            "..", "..", "sample_configs", "honeynode-otntopo400GwithODUC4.json")
+            with open(ODUC4_OTN_TOPO_BI_DIR_FILE, 'r') as oduc4_otn_topo_bi_dir:
+                cls.oduc4_otn_topo_bi_dir_data = oduc4_otn_topo_bi_dir.read()
 
             PORT_MAPPING_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                                      "..", "..", "sample_configs", "pce_portmapping_71.json")
@@ -71,14 +86,14 @@ class TransportPCE400Gtesting(unittest.TestCase):
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.created))
         time.sleep(2)
 
-    # Load simple bidirectional topology
-    def test_02_load_simple_topology_bi(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_bi_dir_data)
+    # Load openroadm topology
+    def test_02_load_openroadm_topology_bi(self):
+        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.topo_bi_dir_data)
         self.assertEqual(response.status_code, requests.codes.ok)
         time.sleep(2)
 
     # Path Computation success
-    def test_03_path_computation_xpdr_bi(self):
+    def test_03_path_computation_400G_xpdr_bi(self):
         response = test_utils.path_computation_request("request-1", "service-1",
                                                        {"node-id": "XPDR-A2", "service-rate": "400",
                                                            "service-format": "Ethernet", "clli": "nodeA"},
@@ -112,18 +127,125 @@ class TransportPCE400Gtesting(unittest.TestCase):
                          ['zToA-direction']['modulation-format'])
         time.sleep(5)
 
-    # Test deleted complex topology
-    def test_04_test_topology_complex_deleted(self):
-        response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        time.sleep(1)
+    # Load otn topology
+    def test_04_load_otn_topology_bi(self):
+        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.otn_topo_bi_dir_data)
+        self.assertEqual(response.status_code, requests.codes.ok)
+        time.sleep(2)
+
+    # Path Computation success
+    def test_05_path_computation_OTUC4_xpdr_bi(self):
+        response = test_utils.path_computation_request("request-1", "service-OTUC4",
+                                                       {"service-rate": "400", "clli": "NodeA",
+                                                           "service-format": "OTU", "node-id": "XPDR-A2",
+                                                           "rx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
+                                                       },
+                                                       {"service-rate": "400", "clli": "NodeC",
+                                                           "service-format": "OTU", "node-id": "XPDR-C2",
+                                                           "rx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
+                                                       })
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertIn('Path is calculated',
+                      res['output']['configuration-response-common']['response-message'])
+
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-wavelength-number'])
+        self.assertEqual(400, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['rate'])
+        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-min-frequency'])
+        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-max-frequency'])
+        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['modulation-format'])
+
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-wavelength-number'])
+        self.assertEqual(400, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['rate'])
+        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-min-frequency'])
+        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-max-frequency'])
+        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['modulation-format'])
+        time.sleep(5)
+
+    # Load otn topology with OTUC4 links
+    def test_06_load_otuc4_otn_topology_bi(self):
+        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.otuc4_otn_topo_bi_dir_data)
+        self.assertEqual(response.status_code, requests.codes.ok)
+        time.sleep(2)
+
+    # Path Computation success
+    def test_07_path_computation_ODUC4_xpdr_bi(self):
+        response = test_utils.path_computation_request("request-1", "service-ODUC4",
+                                                       {"service-rate": "400", "clli": "NodeA", "service-format": "ODU",
+                                                           "node-id": "XPDR-A2-XPDR2",
+                                                           "tx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
+                                                       },
+                                                       {"service-rate": "400", "clli": "NodeC", "service-format": "ODU",
+                                                           "node-id": "XPDR-C2-XPDR2",
+                                                           "tx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
+                                                       })
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertIn('Path is calculated',
+                      res['output']['configuration-response-common']['response-message'])
+
+        self.assertEqual(400, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['rate'])
+        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['modulation-format'])
+
+        self.assertEqual(400, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['rate'])
+        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['modulation-format'])
+        time.sleep(5)
 
-    # Delete portmapping
-    def test_05_delete_port_mapping(self):
-        response = test_utils.delete_request(test_utils.URL_FULL_PORTMAPPING)
+    # Load otn topology with OTUC4 links
+    def test_08_load_oduc4_otn_topology_bi(self):
+        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.oduc4_otn_topo_bi_dir_data)
         self.assertEqual(response.status_code, requests.codes.ok)
         time.sleep(2)
 
+    # Path Computation success
+    def test_09_path_computation_100G_xpdr_bi(self):
+        response = test_utils.path_computation_request("request-1", "service-100GE",
+                                                       {"service-rate": "100", "clli": "NodeA", "service-format": "Ethernet",
+                                                        "node-id": "XPDR-A2",
+                                                        "tx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2",
+                                                           "port-name": "XPDR2-CLIENT1"}}},
+                                                       {"service-rate": "100", "clli": "NodeC", "service-format": "Ethernet",
+                                                        "node-id": "XPDR-C2",
+                                                        "tx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2",
+                                                           "port-name": "XPDR2-CLIENT1"}}})
+
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertIn('Path is calculated',
+                      res['output']['configuration-response-common']['response-message'])
+
+        self.assertEqual(100, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['rate'])
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['trib-port-number'])
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['trib-slot-number'])
+        self.assertEqual('dp-qpsk', res['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['modulation-format'])
+
+        self.assertEqual(100, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['rate'])
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['trib-port-number'])
+        self.assertEqual(1, res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['trib-slot-number'])
+        self.assertEqual('dp-qpsk', res['output']['response-parameters']['path-description']
+                         ['zToA-direction']['modulation-format'])
+        time.sleep(5)
 
 if __name__ == "__main__":
     unittest.main(verbosity=2)
index a94da1f3c9c47fa7851cb14e1256edd2679a48ab..d440821b64d5beb889034965f4f501e39645f347 100644 (file)
@@ -106,11 +106,62 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             res['mapping'])
 
-    def test_06_xpdr_device_disconnection(self):
+    # Check the port-mapping for the switch-client and switch-network port-quals
+    def test_06_xpdr2_portmapping_NETWORK1(self):
+        response = test_utils.portmapping_request("XPDR-A2/mapping/XPDR2-NETWORK1")
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertIn(
+            {'supported-interface-capability':
+               ['org-openroadm-port-types:if-otsi-otsigroup'],
+             'supporting-port': 'L2',
+             'supporting-circuit-pack-name': '1/0/7-PLUG-NETWORK',
+             'logical-connection-point': 'XPDR2-NETWORK1',
+             'port-qual': 'switch-network',
+             'port-direction': 'bidirectional',
+             'lcp-hash-val': 'LY9PxYJqUbw=',
+             'port-admin-state': 'InService',
+             'port-oper-state': 'InService',
+             'xponder-type': 'mpdr'
+             },
+            res['mapping'])
+
+    def test_07_xpdr2_portmapping_CLIENT1(self):
+        response = test_utils.portmapping_request("XPDR-A2/mapping/XPDR2-CLIENT1")
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertIn(
+            {'supported-interface-capability':
+               ['org-openroadm-port-types:if-100GE-ODU4',
+                'org-openroadm-port-types:if-OCH-OTU4-ODU4'],
+             'supporting-port': 'C3',
+             'supporting-circuit-pack-name': '1/0/3-PLUG-CLIENT',
+             'logical-connection-point': 'XPDR2-CLIENT1',
+             'port-direction': 'bidirectional',
+              'port-qual': 'switch-client',
+             'lcp-hash-val': 'AK+Cna4EclRH',
+             'port-admin-state': 'InService',
+             'port-oper-state': 'InService',
+             "mpdr-restrictions": {
+               "min-trib-slot": "1.1",
+               "max-trib-slot": "1.20"
+             }},
+            res['mapping'])
+
+    # Added test to check mc-capability-profile for a transponder
+    def test_08_check_mccapprofile(self):
+        response = test_utils.portmapping_request("XPDR-A2/mc-capabilities/XPDR-mcprofile")
+        self.assertEqual(response.status_code, requests.codes.ok)
+        res = response.json()
+        self.assertEqual(res['mc-capabilities'][0]['mc-node-name'], 'XPDR-mcprofile')
+        self.assertEqual(res['mc-capabilities'][0]['center-freq-granularity'], 3.125)
+        self.assertEqual(res['mc-capabilities'][0]['slot-width-granularity'], 6.25)
+
+    def test_09_xpdr_device_disconnection(self):
         response = test_utils.unmount_device("XPDR-A2")
         self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
 
-    def test_07_xpdr_device_disconnected(self):
+    def test_10_xpdr_device_disconnected(self):
         response = test_utils.get_netconf_oper_request("XPDR-A2")
         self.assertEqual(response.status_code, requests.codes.conflict)
         res = response.json()
@@ -120,7 +171,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                               "relevant data model content does not exist"},
             res['errors']['error'])
 
-    def test_08_xpdr_device_not_connected(self):
+    def test_11_xpdr_device_not_connected(self):
         response = test_utils.portmapping_request("XPDR-A2")
         self.assertEqual(response.status_code, requests.codes.conflict)
         res = response.json()