Merge "Portmapping for SRGs with multiple circuit packs"
authorGuillaume Lambert <guillaume.lambert@orange.com>
Mon, 7 Feb 2022 08:35:42 +0000 (08:35 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 7 Feb 2022 08:35:42 +0000 (08:35 +0000)
14 files changed:
common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridConstant.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java
tests/transportpce_tests/1.2.1/test04_renderer_service_path_nominal.py
tests/transportpce_tests/2.2.1/test05_flex_grid.py
tests/transportpce_tests/2.2.1/test06_renderer_service_path_nominal.py
tests/transportpce_tests/2.2.1/test07_otn_renderer.py
tests/transportpce_tests/2.2.1/test08_otn_sh_renderer.py
tests/transportpce_tests/7.1/test02_otn_renderer.py [new file with mode: 0644]
tests/transportpce_tests/common/test_utils.py
tests/transportpce_tests/common/test_utils_rfc8040.py
tox.ini

index 7282bec3cc5c42678c2533a6a1d68853a4883cd1..efb8fb7172062f8335bf13a619a8ab0afaf5fac7 100644 (file)
@@ -98,8 +98,8 @@ public final class GridConstant {
     private static Table<Uint32, ModulationFormat, String> initFrequencyWidthTable() {
         Table<Uint32, ModulationFormat, String> frequencyWidthTable = HashBasedTable.create();
         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_200, ModulationFormat.DpQpsk, String.valueOf(WIDTH_75));
+        frequencyWidthTable.put(ServiceRateConstant.RATE_300, ModulationFormat.DpQam8, String.valueOf(WIDTH_75));
         frequencyWidthTable.put(ServiceRateConstant.RATE_400, ModulationFormat.DpQam16, String.valueOf(WIDTH_75));
         return frequencyWidthTable;
     }
index 6f3608710e9183a85f41f1565a274b477ebe7213..d3b6df0ffdb7ab5afa895e0b232431fce54e03ff 100644 (file)
@@ -31,6 +31,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If1G
 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.If400GE;
 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.IfOCHOTU2EODU2E;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU2ODU2;
 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.IfOTUCnODUCn;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
@@ -57,6 +59,8 @@ public class MappingUtilsImpl implements MappingUtils {
             put("If100GE", If100GE.class);
             put("If10GE", If10GE.class);
             put("If1GE", If1GE.class);
+            put("IfOCHOTU2EODU2E", IfOCHOTU2EODU2E.class);
+            put("IfOCHOTU2ODU2", IfOCHOTU2ODU2.class);
         }
     };
 
index 58ea3e154365a7d4845570355915b62704962edc..3c0f3a9f0c648f332a27bb824f1549691be98b30 100644 (file)
@@ -690,7 +690,6 @@ public class PortMappingVersion221 {
         nodesList.put(nodes.key(),nodes);
 
         Network network = new NetworkBuilder().setNodes(nodesList).build();
-
         final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
         InstanceIdentifier<Network> nodesIID = InstanceIdentifier.builder(Network.class).build();
         writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, nodesIID, network);
@@ -869,7 +868,9 @@ public class PortMappingVersion221 {
             List<Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327
                 .SupportedIfCapability>> supportedIntf = new ArrayList<>();
             for (Class<? extends SupportedIfCapability> sup: port.getSupportedInterfaceCapability()) {
-                supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sup.getSimpleName()));
+                if (MappingUtilsImpl.convertSupIfCapa(sup.getSimpleName()) != null) {
+                    supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sup.getSimpleName()));
+                }
             }
             mpBldr.setSupportedInterfaceCapability(supportedIntf);
         }
index 135819767a5f5ea3c27a4fdd304d181d9f817825..1fe13910eeec53d13f1bed82240308f470a13587 100644 (file)
@@ -45,17 +45,12 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev20032
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OduRateIdentity;
 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.Link1Builder;
-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.Node1Builder;
 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.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharing;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfaces;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
@@ -91,9 +86,25 @@ public final class OpenRoadmOtnTopology {
     private static final String CLIENT = "-CLIENT";
     private static final String NETWORK = "-NETWORK";
     private static final String XPDR = "-XPDR";
+    private static final String OTN_PARAMS_ERROR = "Error with otn parameters of supported link {}";
     private static final int NB_TRIB_PORTS = 80;
     private static final int NB_TRIB_SLOTS = 80;
-    private static final int NB_TRIB_SLOT_PER_10GE = 8;
+
+    private static Map<String, Class<? extends OduRateIdentity>> rateMap = Map.of(
+        "If100GEODU4", ODU4.class,
+        "IfOCHOTU4ODU4", ODU4.class,
+        "If1GEODU0", ODU0.class,
+        "If10GEODU2", ODU2.class,
+        "If10GEODU2e", ODU2e.class);
+    private static Map<OtnLinkType, Long> otnLinkTypeBwMap = Map.of(
+        OtnLinkType.ODTU4, 100000L,
+        OtnLinkType.ODUC4, 400000L,
+        OtnLinkType.ODUC3, 300000L,
+        OtnLinkType.ODUC2, 200000L);
+    private static Map<Uint32, Long> serviceRateBwIncrMap = Map.of(
+        Uint32.valueOf(1), 1000L,
+        Uint32.valueOf(10), 10000L,
+        Uint32.valueOf(100), 100000L);
 
     private OpenRoadmOtnTopology() {
     }
@@ -122,12 +133,13 @@ public final class OpenRoadmOtnTopology {
     }
 
     public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
-        OtnLinkType linkType) {
-        List<Link> links = null;
-        if (OtnLinkType.OTU4.equals(linkType) || OtnLinkType.OTUC4.equals(linkType)) {
-            links = initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType);
-        }
-        return new TopologyShard(null, links);
+            OtnLinkType linkType) {
+
+        return new TopologyShard(
+            null,
+            OtnLinkType.OTU4.equals(linkType) || OtnLinkType.OTUC4.equals(linkType)
+                ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType)
+                : null);
     }
 
     public static TopologyShard createOtnLinks(
@@ -135,17 +147,19 @@ public final class OpenRoadmOtnTopology {
                 .Link notifLink,
             OtnLinkType linkType) {
 
-        return new TopologyShard(null, initialiseOtnLinks(notifLink.getATermination().getNodeId(),
-            notifLink.getATermination().getTpId(), notifLink.getZTermination().getNodeId(),
-            notifLink.getZTermination().getTpId(), linkType));
+        return new TopologyShard(
+            null,
+            initialiseOtnLinks(notifLink.getATermination().getNodeId(),
+            notifLink.getATermination().getTpId(),
+            notifLink.getZTermination().getNodeId(),
+            notifLink.getZTermination().getTpId(),
+            linkType));
     }
 
     public static TopologyShard createOtnLinks(
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
                 .Link notifLink,
-            List<Link> supportedOtu4links,
-            List<TerminationPoint> supportedTPs,
-            OtnLinkType linkType) {
+            List<Link> supportedOtu4links, List<TerminationPoint> supportedTPs, OtnLinkType linkType) {
 
         List<Link> links;
         switch (linkType) {
@@ -166,6 +180,7 @@ public final class OpenRoadmOtnTopology {
                     updatedTPs.add(updateTp(tp, true, linkType));
                 }
                 return new TopologyShard(null, links, updatedTPs);
+                //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
             default:
                 return null;
         }
@@ -173,29 +188,24 @@ public final class OpenRoadmOtnTopology {
 
     public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
             OtnLinkType linkType) {
+
         List<Link> links = new ArrayList<>();
         for (Link link : suppOtuLinks) {
             if (link.augmentation(Link1.class) == null) {
-                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+                LOG.error("Error with OTN parameters of supported link {}", link.getLinkId().getValue());
                 continue;
             }
-            if (OtnLinkType.ODTU4.equals(linkType)
-                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(100000))) {
-                links.add(updateOtnLinkBwParameters(link, 0L, 100000L));
-            } else if (OtnLinkType.ODUC4.equals(linkType)
-                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(400000))) {
-                links.add(updateOtnLinkBwParameters(link, 0L, 400000L));
-            } else if (OtnLinkType.ODUC3.equals(linkType)
-                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(300000))) {
-                links.add(updateOtnLinkBwParameters(link, 0L, 300000L));
-            } else if (OtnLinkType.ODUC2.equals(linkType)
-                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(200000))) {
-                links.add(updateOtnLinkBwParameters(link, 0L, 200000L));
-            } else {
-                LOG.error("Unsupported OTN Link Type link or unsufficient available bandwith: {}",
-                    link.getLinkId().getValue());
+            if (!otnLinkTypeBwMap.containsKey(linkType)) {
+                LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue());
+                continue;
             }
-            //TODO use a Map here instead of multiple else-if-blocks
+            if (!link.augmentation(Link1.class).getAvailableBandwidth()
+                    .equals(Uint32.valueOf(otnLinkTypeBwMap.get(linkType)))) {
+                    //TODO shouldn't it be < rather than !equals() here ?
+                LOG.error("Error with link {} : unsufficient available bandwith", link.getLinkId().getValue());
+                continue;
+            }
+            links.add(updateOtnLinkBwParameters(link, 0L, otnLinkTypeBwMap.get(linkType)));
         }
         if (links.size() == 2) {
             links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
@@ -208,53 +218,42 @@ public final class OpenRoadmOtnTopology {
         for (TerminationPoint tp : oldTps) {
             tps.add(updateTp(tp, true, linkType));
         }
-        if (links.size() == 4 && tps.size() == 2) {
-            return new TopologyShard(null, links, tps);
-        } else {
-            return new TopologyShard(null, null, null);
-        }
+        return links.size() == 4 && tps.size() == 2
+            ?  new TopologyShard(null, links, tps)
+            :  new TopologyShard(null, null, null);
     }
 
     public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
-        Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
+            Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
+
         List<Link> links = new ArrayList<>();
-        Long bwIncr;
-        switch (serviceRate.intValue()) {
-            case 1:
-                bwIncr = 1000L;
-                break;
-            case 10:
-                bwIncr = 10000L;
-                break;
-            case 100:
-                bwIncr = 100000L;
-                break;
-            default:
-                LOG.warn("Error with not managed service rate {}", serviceRate.toString());
-                return new TopologyShard(null, null, null);
+        if (!serviceRateBwIncrMap.containsKey(serviceRate)) {
+            LOG.warn("Error with not managed service rate {}", serviceRate.toString());
+            return new TopologyShard(null, null, null);
         }
+        Long bwIncr = serviceRateBwIncrMap.get(serviceRate);
         for (Link link : suppOduLinks) {
-            if (link.augmentation(Link1.class) != null && link.augmentation(Link1.class).getAvailableBandwidth() != null
-                && link.augmentation(Link1.class).getUsedBandwidth() != null) {
+            if (link.augmentation(Link1.class) == null
+                    || link.augmentation(Link1.class).getAvailableBandwidth() == null
+                    || link.augmentation(Link1.class).getUsedBandwidth() == null) {
+                LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
+            } else {
                 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
                 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
                 if (avlBw.toJava() < bwIncr) {
                     bwIncr = 0L;
                 }
-                if (isDeletion) {
-                    links.add(updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr,
-                        usedBw.toJava() - bwIncr));
-                } else {
-                    links.add(updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr,
-                        usedBw.toJava() + bwIncr));
-                }
-            } else {
-                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+                links.add(
+                    isDeletion
+                        ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr)
+                        : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr)
+                );
             }
         }
         List<TerminationPoint> tps = new ArrayList<>();
         for (TerminationPoint tp : oldTps) {
             if (bwIncr != 0) {
+            //TODO shouldn't it be 0L rather?
                 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
             }
         }
@@ -267,18 +266,19 @@ public final class OpenRoadmOtnTopology {
     }
 
     public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
+
         List<Link> links = new ArrayList<>();
         for (Link link : suppOtuLinks) {
             if (link.augmentation(Link1.class) == null
                 || link.augmentation(Link1.class).getAvailableBandwidth() == null
                 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
-                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+                LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
             } else {
-                if (isDeletion) {
-                    links.add(updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0)));
-                } else {
-                    links.add(updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000)));
-                }
+                links.add(
+                    isDeletion
+                        ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0))
+                        : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000))
+                );
             }
         }
         if (links.isEmpty()) {
@@ -291,44 +291,46 @@ public final class OpenRoadmOtnTopology {
 
     public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
             OtnLinkType linkType) {
+
         List<Link> links = new ArrayList<>();
         OtnLinkType otnLinkType = null;
         for (Link link : suppOtuLinks) {
-            if (link.augmentation(Link1.class) != null && link.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class) != null) {
-                otnLinkType = link.augmentation(
-                        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class).getOtnLinkType();
-                if (OtnLinkType.OTU4.equals(otnLinkType)) {
-                    links.add(updateOtnLinkBwParameters(link, 100000L, 0L));
-                } else if (OtnLinkType.OTUC4.equals(otnLinkType)) {
-                    links.add(updateOtnLinkBwParameters(link, 400000L, 0L));
-                } else {
-                    LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
-                }
-            } else {
-                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+            if (link.augmentation(Link1.class) == null
+                    || link.augmentation(
+                        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class) == null) {
+                LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
                 return new TopologyShard(null, null, null);
             }
+            otnLinkType = link.augmentation(
+                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class).getOtnLinkType();
+            if (OtnLinkType.OTU4.equals(otnLinkType)) {
+                links.add(updateOtnLinkBwParameters(link, 100000L, 0L));
+            } else if (OtnLinkType.OTUC4.equals(otnLinkType)) {
+                links.add(updateOtnLinkBwParameters(link, 400000L, 0L));
+            } else {
+                LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
+            }
+            //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
         }
         List<TerminationPoint> tps = new ArrayList<>();
         for (TerminationPoint tp : oldTps) {
             tps.add(updateTp(tp, false, linkType));
         }
-        if (!links.isEmpty() && !tps.isEmpty()) {
-            return new TopologyShard(null, links, tps);
-        } else {
-            return new TopologyShard(null, null, null);
-        }
+        return
+            links.isEmpty() || tps.isEmpty()
+                ? new TopologyShard(null, null, null)
+                : new TopologyShard(null, links, tps);
     }
 
     private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
             OtnLinkType linkType) {
+
         List<Link> links = new ArrayList<>();
         String nodeATopo = formatNodeName(nodeA, tpA);
         String nodeZTopo = formatNodeName(nodeZ, tpZ);
         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1 tpceLink1
             = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder()
-            .setOtnLinkType(linkType).build();
+                .setOtnLinkType(linkType).build();
         Link1Builder otnLink1Bldr = new Link1Builder()
             .setUsedBandwidth(Uint32.valueOf(0));
         switch (linkType) {
@@ -343,6 +345,7 @@ public final class OpenRoadmOtnTopology {
             default:
                 LOG.error("unable to set available bandwidth to unknown link type");
                 break;
+            //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
         }
         // create link A-Z
         LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
@@ -353,10 +356,10 @@ public final class OpenRoadmOtnTopology {
                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
                         ietfLinkAZBldr.augmentation(
                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
-                        .setLinkType(OpenroadmLinkType.OTNLINK)
-                        .setOperationalState(State.InService)
-                        .setAdministrativeState(AdminStates.InService)
-                        .build());
+                    .setLinkType(OpenroadmLinkType.OTNLINK)
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build());
         links.add(ietfLinkAZBldr.build());
         // create link Z-A
         LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
@@ -367,15 +370,16 @@ public final class OpenRoadmOtnTopology {
                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
                         ietfLinkZABldr.augmentation(
                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
-                        .setLinkType(OpenroadmLinkType.OTNLINK)
-                        .setOperationalState(State.InService)
-                        .setAdministrativeState(AdminStates.InService)
-                        .build());
+                    .setLinkType(OpenroadmLinkType.OTNLINK)
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build());
         links.add(ietfLinkZABldr.build());
         return links;
     }
 
     private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
+
         LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
         LinkBuilder updatedLinkBldr = new LinkBuilder(link);
         Link1Builder updatedLink1Bldr = new Link1Builder(link.augmentation(Link1.class))
@@ -386,6 +390,7 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
+
         LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
         Uint32 usedBw;
         switch (linkType) {
@@ -399,6 +404,7 @@ public final class OpenRoadmOtnTopology {
                 usedBw = Uint32.valueOf(0);
                 break;
         }
+        //TODO shouldn't other linkt type listed in otnLinkTypeBwMap be handled too ?
         List<Link> updatedlinks = new ArrayList<>();
         for (Link link : supportedLinks) {
             LinkBuilder updatedLinkBldr = new LinkBuilder(link);
@@ -413,12 +419,13 @@ public final class OpenRoadmOtnTopology {
 
     private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
             OtnLinkType linkType) {
+
         LOG.debug("in updateTp");
         TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp);
-        TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder(
-            tpBldr.augmentation(TerminationPoint1.class));
-        XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr
-            .getXpdrTpPortConnectionAttributes());
+        TerminationPoint1Builder otnTp1Bldr =
+            new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
+        XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
+            new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes());
         if (addingTsTpnPoolTermination) {
             List<Uint16> tsPool = new ArrayList<>();
             for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
@@ -433,8 +440,10 @@ public final class OpenRoadmOtnTopology {
             for (int i = 1; i <= nbTribPort; i++) {
                 tpnPool.add(Uint16.valueOf(i));
             }
-            OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder().setOdtuType(ODTU4TsAllocated.class)
-                .setTpnPool(tpnPool).build();
+            OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
+                .setOdtuType(ODTU4TsAllocated.class)
+                .setTpnPool(tpnPool)
+                .build();
             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
         } else {
             xtpcaBldr.setTsPool(null);
@@ -444,12 +453,14 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
-        Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
+            Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
+
         LOG.debug("in updateNodeTpTsPool");
         TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
         @Nullable
-        XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(
-            tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
+        XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
+            new XpdrTpPortConnectionAttributesBuilder(
+                tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
         List<Uint16> tsPool = new ArrayList<>(xtpcaBldr.getTsPool());
         if (isDeletion) {
             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
@@ -463,15 +474,15 @@ public final class OpenRoadmOtnTopology {
         xtpcaBldr.setTsPool(tsPool);
         List<Uint16> tpnPool;
         List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
-        if (odtuTpnPoolValues.get(0).getTpnPool() != null) {
+        if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
+            tpnPool = new ArrayList<>();
+        } else {
             tpnPool = new ArrayList<>(odtuTpnPoolValues.get(0).getTpnPool());
             if (isDeletion) {
                 tpnPool.add(Uint16.valueOf(tribPortNb));
             } else {
                 tpnPool.remove(Uint16.valueOf(tribPortNb));
             }
-        } else {
-            tpnPool = new ArrayList<>();
         }
         Class<? extends OdtuTypeIdentity> odtuType = null;
         switch (serviceRate.intValue()) {
@@ -486,111 +497,109 @@ public final class OpenRoadmOtnTopology {
                 LOG.warn("Unable to set the odtu-type");
                 break;
         }
-        OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder().setOdtuType(odtuType)
-            .setTpnPool(tpnPool).build();
+        OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder()
+            .setOdtuType(odtuType)
+            .setTpnPool(tpnPool)
+            .build();
         xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool));
-
-        tpBldr.addAugmentation(new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class))
-                .setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build());
+        tpBldr.addAugmentation(
+            new TerminationPoint1Builder(
+                tp.augmentation(TerminationPoint1.class))
+                    .setXpdrTpPortConnectionAttributes(xtpcaBldr.build())
+                    .build());
         return tpBldr.build();
     }
 
     private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
-        List<Mapping> networkMappings = mappingNode.nonnullMapping().values()
-                .stream().filter(k -> k.getLogicalConnectionPoint()
-            .contains("NETWORK")).collect(Collectors.toList());
+
+        List<Mapping> networkMappings =
+            mappingNode.nonnullMapping().values().stream()
+                .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
+                .collect(Collectors.toList());
         Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
         for (Mapping mapping : networkMappings) {
             Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
             if (!xpdrMap.containsKey(xpdrNb)) {
-                List<Mapping> xpdrNetMaps = mappingNode.nonnullMapping().values()
-                        .stream().filter(k -> k.getLogicalConnectionPoint()
-                    .contains("XPDR" + xpdrNb + NETWORK)).collect(Collectors.toList());
-                List<Mapping> xpdrClMaps = mappingNode.nonnullMapping().values()
-                        .stream().filter(k -> k.getLogicalConnectionPoint()
-                    .contains("XPDR" + xpdrNb + CLIENT)).collect(Collectors.toList());
-                OtnTopoNode otnNode = null;
-                if (mapping.getXponderType() != null) {
-                    otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
-                        mapping.getXponderType(), fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps),
-                        xpdrNetMaps, xpdrClMaps);
-                } else {
-                    otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
-                        XpdrNodeTypes.Tpdr, fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps),
-                        xpdrNetMaps, xpdrClMaps);
-                }
-                xpdrMap.put(xpdrNb, otnNode);
+                List<Mapping> xpdrNetMaps =
+                    mappingNode.nonnullMapping().values().stream()
+                        .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + NETWORK))
+                        .collect(Collectors.toList());
+                List<Mapping> xpdrClMaps =
+                    mappingNode.nonnullMapping().values().stream()
+                        .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + CLIENT))
+                        .collect(Collectors.toList());
+                xpdrMap.put(
+                    xpdrNb,
+                    new OtnTopoNode(
+                        mappingNode.getNodeId(),
+                        mappingNode.getNodeInfo().getNodeClli(),
+                        xpdrNb,
+                        mapping.getXponderType() == null
+                            ? XpdrNodeTypes.Tpdr
+                            : mapping.getXponderType(),
+                        fillConnectionMapLcp(xpdrNetMaps),
+                        fillConnectionMapLcp(xpdrClMaps),
+                        xpdrNetMaps,
+                        xpdrClMaps
+                    ));
             }
         }
         LOG.debug("there are {} xpdr to build", xpdrMap.size());
-        xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}", k, v.getNodeId(), v.getNodeType(),
-            v.getNbTpClient(), v.getNbTpNetwork()));
+        xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}",
+            k, v.getNodeId(), v.getNodeType(), v.getNbTpClient(), v.getNbTpNetwork()));
         return xpdrMap;
     }
 
     private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
+
         Map<String, String> xpdrConnectionMap = new HashMap<>();
         for (Mapping map : mappingList) {
-            if (map.getConnectionMapLcp() != null) {
-                xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
-            } else {
-                xpdrConnectionMap.put(map.getLogicalConnectionPoint(), null);
-            }
+            xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
         }
         return xpdrConnectionMap;
     }
 
     private static Node createTpdr(OtnTopoNode node) {
-        // create otn-topology node augmentation
-        XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
-            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
-            .build();
-        Node1 otnNodeAug = new Node1Builder()
-            .setXpdrAttributes(xpdrAttr)
-            .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
-                    .setNodeType(OpenroadmNodeType.TPDR)
-                    .setOperationalState(State.InService)
-                    .setAdministrativeState(AdminStates.InService)
-                    .build();
-        // create ietf node augmentation to add TP list
+
+        // prepare ietf node augmentation to add TP list
         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
-        // creation of tps
         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
-
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
-            new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
-            .setTerminationPoint(tpMap)
-            .build();
-
         // return ietfNode
         return new NodeBuilder()
             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
             .setSupportingNode(createSupportingNodes(node))
-            .addAugmentation(otnNodeAug)
-            .addAugmentation(ocnNodeAug)
-            .addAugmentation(ietfNodeAug)
+            .addAugmentation(
+                new Node1Builder()
+                    .setXpdrAttributes(
+                        new XpdrAttributesBuilder()
+                            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
+                            .build())
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
+                    .setNodeType(OpenroadmNodeType.TPDR)
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .Node1Builder()
+                        .setTerminationPoint(tpMap)
+                        .build())
             .build();
     }
 
     private static Node createMuxpdr(OtnTopoNode node) {
-        // create otn-topology node augmentation
-        // TODO: will need to be completed
-        TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
-        XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
-            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
-            .build();
 
+        // prepare otn-topology node augmentation
+        // TODO: will need to be completed
         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
         for (int i = 1; i <= node.getNbTpClient(); i++) {
             List<TpId> tpList = new ArrayList<>();
-            TpId tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
-            tpList.add(tpId);
-            tpId = new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1");
-            tpList.add(tpId);
+            tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
+            tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"));
             NonBlockingList nbl = new NonBlockingListBuilder()
                 .setNblNumber(Uint16.valueOf(i))
                 .setTpList(tpList)
@@ -604,53 +613,49 @@ public final class OpenRoadmOtnTopology {
             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
             .setNonBlockingList(nbMap)
             .build();
-        SwitchingPools switchingPools = new SwitchingPoolsBuilder()
-            .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
-            .build();
-        Node1 otnNodeAug = new Node1Builder()
-            .setTpBandwidthSharing(tpBwSh)
-            .setXpdrAttributes(xpdrAttr)
-            .setSwitchingPools(switchingPools)
-            .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
-                    .setNodeType(OpenroadmNodeType.MUXPDR)
-                    .setAdministrativeState(AdminStates.InService)
-                    .setOperationalState(State.InService)
-                    .build();
-
-        // create ietf node augmentation to add TP list
+        // prepare ietf node augmentation to add TP list
         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
-        // creation of tps
         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
-
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
-            new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
-            .setTerminationPoint(tpMap)
-            .build();
-
         // return ietfNode
         return new NodeBuilder()
             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
             .setSupportingNode(createSupportingNodes(node))
-            .addAugmentation(otnNodeAug)
-            .addAugmentation(ocnNodeAug)
-            .addAugmentation(ietfNodeAug)
+            .addAugmentation(
+                new Node1Builder()
+                    .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
+                    .setXpdrAttributes(
+                        new XpdrAttributesBuilder()
+                            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
+                            .build())
+                    .setSwitchingPools(
+                        new SwitchingPoolsBuilder()
+                            .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
+                            .build())
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
+                    .setNodeType(OpenroadmNodeType.MUXPDR)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .Node1Builder()
+                        .setTerminationPoint(tpMap)
+                        .build())
             .build();
     }
 
     private static Node createSwitch(OtnTopoNode node) {
+
         List<TpId> tpl = new ArrayList<>();
-        TpId tpId = null;
         for (int i = 1; i <= node.getNbTpClient(); i++) {
-            tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
-            tpl.add(tpId);
+            tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
         }
         for (int i = 1; i <= node.getNbTpNetwork(); i++) {
-            tpId = new TpId("XPDR" + node.getXpdrNb() + NETWORK + i);
-            tpl.add(tpId);
+            tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i));
         }
         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
         NonBlockingList nbl = new NonBlockingListBuilder()
@@ -658,7 +663,6 @@ public final class OpenRoadmOtnTopology {
             .setTpList(tpl)
             .build();
         nbMap.put(nbl.key(),nbl);
-
         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
             .setSwitchingPoolNumber(Uint16.valueOf(1))
             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
@@ -666,52 +670,44 @@ public final class OpenRoadmOtnTopology {
             .build();
         Map<OduSwitchingPoolsKey, OduSwitchingPools> oduSwitchPoolList = new HashMap<>();
         oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool);
-        SwitchingPools switchingPools = new SwitchingPoolsBuilder()
-            .setOduSwitchingPools(oduSwitchPoolList)
-            .build();
-
-        // create otn-topology node augmentation
-        // TODO: will need to be completed
-        TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
-        XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
-            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
-            .build();
-
-        Node1 otnNodeAug = new Node1Builder()
-            .setTpBandwidthSharing(tpBwSh)
-            .setXpdrAttributes(xpdrAttr)
-            .setSwitchingPools(switchingPools)
-            .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
-                    .setNodeType(OpenroadmNodeType.SWITCH)
-                    .setOperationalState(State.InService)
-                    .setAdministrativeState(AdminStates.InService)
-                    .build();
-
-        // create ietf node augmentation to add TP list
+        // prepare ietf node augmentation to add TP list
         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
-        // creation of tps
         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
-            new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
-            .setTerminationPoint(tpMap)
-            .build();
-
         // return ietfNode
         return new NodeBuilder()
             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
             .setSupportingNode(createSupportingNodes(node))
-            .addAugmentation(otnNodeAug)
-            .addAugmentation(ocnNodeAug)
-            .addAugmentation(ietfNodeAug)
+            .addAugmentation(
+                new Node1Builder()
+                    .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
+                    .setXpdrAttributes(
+                        new XpdrAttributesBuilder()
+                            .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
+                            .build())
+                    .setSwitchingPools(
+                        new SwitchingPoolsBuilder()
+                            .setOduSwitchingPools(oduSwitchPoolList)
+                            .build())
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
+                    .setNodeType(OpenroadmNodeType.SWITCH)
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .Node1Builder()
+                        .setTerminationPoint(tpMap)
+                        .build())
             .build();
     }
 
     private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
             OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
+
         List<Mapping> mappings = null;
         switch (tpType) {
             case XPONDERNETWORK:
@@ -729,11 +725,15 @@ public final class OpenRoadmOtnTopology {
 
     private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
             OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
+
         for (Mapping mapping : mappings) {
             // openroadm-otn-topoology augmentation
             Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
             TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder();
-            if (mapping.getSupportedInterfaceCapability() != null) {
+            if (mapping.getSupportedInterfaceCapability() == null) {
+                LOG.warn("mapping {} of node {} has no if-cap-type",
+                    mapping.getLogicalConnectionPoint(), node.getNodeId());
+            } else {
                 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
                 for (Class<? extends SupportedIfCapability> supInterCapa : mapping.getSupportedInterfaceCapability()) {
                     SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
@@ -742,25 +742,27 @@ public final class OpenRoadmOtnTopology {
                         .build();
                     supIfMap.put(supIfCapa.key(), supIfCapa);
                 }
-                TpSupportedInterfaces tpSupIf = new TpSupportedInterfacesBuilder()
-                    .setSupportedInterfaceCapability(supIfMap)
-                    .build();
-                otnTp1Bldr.setTpSupportedInterfaces(tpSupIf);
+                otnTp1Bldr.setTpSupportedInterfaces(
+                    new TpSupportedInterfacesBuilder()
+                        .setSupportedInterfaceCapability(supIfMap)
+                        .build()
+                );
                 //TODO: It is not logical to assign a priori one of the possible rate to the TP.
                 //Would be worth assigning per default "unallocated" at the tp creation step,
                 //and updating it with correct rate when it supports a specific service.
                 if (withRate) {
-                    xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability()));
-                    otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build());
+                    otnTp1Bldr.setXpdrTpPortConnectionAttributes(
+                        xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build());
                 }
-            } else {
-                LOG.warn("mapping {} of node {} has no if-cap-type", mapping.getLogicalConnectionPoint(),
-                    node.getNodeId());
             }
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr =
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder();
-            TpId tpId = new TpId(mapping.getLogicalConnectionPoint());
-            setclientNwTpAttr(tpMap, node, tpId, tpType, otnTp1Bldr.build(), tpceTp1Bldr, mapping);
+            setclientNwTpAttr(
+                tpMap,
+                node,
+                new TpId(mapping.getLogicalConnectionPoint()),
+                tpType,
+                otnTp1Bldr.build(),
+                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder(),
+                mapping);
         }
     }
 
@@ -768,6 +770,7 @@ public final class OpenRoadmOtnTopology {
             OpenroadmTpType tpType, TerminationPoint1 otnTp1,
             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
             Mapping mapping) {
+
         switch (tpType) {
             case XPONDERNETWORK:
                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
@@ -778,8 +781,8 @@ public final class OpenRoadmOtnTopology {
                     .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
                     .setTpRef(tpId)
                     .build();
-                TerminationPoint ietfTpNw = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp),
-                    mapping);
+                TerminationPoint ietfTpNw =
+                    buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
                 tpMap.put(ietfTpNw.key(),ietfTpNw);
                 break;
             case XPONDERCLIENT:
@@ -796,12 +799,7 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static Class<? extends OduRateIdentity> fixRate(List<Class<? extends SupportedIfCapability>> list) {
-        Map<String, Class<? extends OduRateIdentity>> rateMap = Map.of(
-            "If100GEODU4", ODU4.class,
-            "IfOCHOTU4ODU4", ODU4.class,
-            "If1GEODU0", ODU0.class,
-            "If10GEODU2", ODU2.class,
-            "If10GEODU2e", ODU2e.class);
+
         for (Class<? extends SupportedIfCapability> class1 : list) {
             if (rateMap.containsKey(class1.getSimpleName())) {
                 return rateMap.get(class1.getSimpleName());
@@ -811,23 +809,30 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
+
         SupportingNode suppNode1 = new SupportingNodeBuilder()
             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
             .setNodeRef(new NodeId(node.getNodeId()))
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
-                new NodeId(node.getNodeId())))
+            .withKey(
+                new SupportingNodeKey(
+                    new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
+                    new NodeId(node.getNodeId())))
             .build();
         SupportingNode suppNode2 = new SupportingNodeBuilder()
             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
             .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
-                new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
+            .withKey(
+                new SupportingNodeKey(
+                    new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
+                    new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
             .build();
         SupportingNode suppNode3 = new SupportingNodeBuilder()
             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
             .setNodeRef(new NodeId(node.getClli()))
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
-                new NodeId(node.getClli())))
+            .withKey(
+                new SupportingNodeKey(
+                    new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
+                    new NodeId(node.getClli())))
             .build();
         Map<SupportingNodeKey,SupportingNode> suppNodeMap = new HashMap<>();
         suppNodeMap.put(suppNode1.key(),suppNode1);
@@ -837,9 +842,9 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static TerminationPoint buildIetfTp(
-        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
-        TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
-        Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
+            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
+            TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
+            Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
 
         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
         if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) {
@@ -848,21 +853,21 @@ public final class OpenRoadmOtnTopology {
         if (supportTpMap != null) {
             ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
         }
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
+        return ietfTpBldr
+            .setTpId(tpId)
+            .withKey(new TerminationPointKey(tpId))
+            .addAugmentation(otnTp1)
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
                     .setTpType(tpType)
                     .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
                     .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
-                    .build();
-
-        return ietfTpBldr.setTpId(tpId)
-                .withKey(new TerminationPointKey(tpId))
-                .addAugmentation(otnTp1)
-                .addAugmentation(ocnTp)
-                .build();
+                    .build())
+            .build();
     }
 
     private static String formatNodeName(String nodeName, String tpName) {
+
         return nodeName.contains(XPDR)
                 ? nodeName
                 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();
index b2cc9356aac33bf476240d258b3b8e4e2ed52345..35276d5e0c2b4e86e60f0c00e2a1e3162817170f 100644 (file)
@@ -17,7 +17,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
@@ -90,16 +89,18 @@ public class PceOtnNode implements PceNode {
         this.usedXpdrClientTps.clear();
         this.availableXpdrClientTps = new ArrayList<>();
         this.usableXpdrClientTps = new ArrayList<>();
-        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.org.openroadm.common.network.rev200529
-                .Node1.class).getOperationalState();
+        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.org.openroadm.common.network.rev200529.Node1.class)
+            .getOperationalState();
         this.tpAvailableTribPort.clear();
         checkAvailableTribPort();
         this.tpAvailableTribSlot.clear();
         checkAvailableTribSlot();
-        if ((node == null) || (nodeId == null) || (nodeType != OpenroadmNodeType.MUXPDR)
-            && (nodeType != OpenroadmNodeType.SWITCH) && (nodeType != OpenroadmNodeType.TPDR)) {
+        if (node == null || nodeId == null || nodeType != OpenroadmNodeType.MUXPDR
+                && nodeType != OpenroadmNodeType.SWITCH && nodeType != OpenroadmNodeType.TPDR) {
             LOG.error("PceOtnNode: one of parameters is not populated : nodeId, node type");
             this.valid = false;
         }
@@ -108,112 +109,117 @@ public class PceOtnNode implements PceNode {
     public void initXndrTps(String mode) {
         LOG.info("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue());
         this.availableXponderTp.clear();
-
         this.modeType = mode;
-
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 nodeTp
-            = this.node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                .ietf.network.topology.rev180226.Node1.class);
+            = this.node
+                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .Node1.class);
         List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-                .node.TerminationPoint> allTps = new ArrayList<>(nodeTp.nonnullTerminationPoint().values());
+                .node.TerminationPoint> allTps =
+            new ArrayList<>(nodeTp.nonnullTerminationPoint().values());
         this.valid = false;
         if (allTps.isEmpty()) {
             LOG.error("PceOtnNode: initXndrTps: XPONDER TerminationPoint list is empty for node {}", this);
             return;
         }
-
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
                 .node.TerminationPoint tp : allTps) {
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.@Nullable TerminationPoint1 ocnTp1
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp1
                 = 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())) {
-                TerminationPoint1 ontTp1;
-                if (tp.augmentation(TerminationPoint1.class) != null) {
-                    ontTp1 = tp.augmentation(TerminationPoint1.class);
-                } else {
-                    continue;
-                }
-                switch (this.otnServiceType) {
-                    case StringConstants.SERVICE_TYPE_100GE_S:
-                        // TODO verify the capability of network port to support ODU4 CTP interface creation
-                    case StringConstants.SERVICE_TYPE_ODU4:
-                    case StringConstants.SERVICE_TYPE_ODUC2:
-                    case StringConstants.SERVICE_TYPE_ODUC3:
-                    case StringConstants.SERVICE_TYPE_ODUC4:
-                        if (!checkTpForOdtuTermination(ontTp1)) {
-                            LOG.error("TP {} of {} does not allow ODU4 termination creation",
+                        .TerminationPoint1.class);
+            if (ocnTp1 == null) {
+                LOG.warn("null ocn TP {}", tp);
+                continue;
+            }
+            //TODO many nested structures below, this needs to be reworked
+            switch (ocnTp1.getTpType()) {
+                case XPONDERNETWORK:
+                    if (tp.augmentation(TerminationPoint1.class) == null) {
+                        continue;
+                    }
+                    TerminationPoint1 ontTp1 = tp.augmentation(TerminationPoint1.class);
+                    switch (this.otnServiceType) {
+                        case StringConstants.SERVICE_TYPE_100GE_S:
+                            // TODO verify the capability of network port to support ODU4 CTP interface creation
+                        case StringConstants.SERVICE_TYPE_ODU4:
+                        case StringConstants.SERVICE_TYPE_ODUC2:
+                        case StringConstants.SERVICE_TYPE_ODUC3:
+                        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 ODU2e 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;
-                        }
-                        break;
+                    }
+                    LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
+                    this.availableXpdrNWTps.add(tp.getTpId());
+                    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());
+                case XPONDERCLIENT:
+                    if (StringConstants.SERVICE_TYPE_10GE.equals(this.otnServiceType)
+                            || StringConstants.SERVICE_TYPE_100GE_M.equals(this.otnServiceType)
+                            || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
+                            || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType)) {
+                        if (tp.augmentation(TerminationPoint1.class) == null) {
                             continue;
                         }
-                        break;
-                    case StringConstants.SERVICE_TYPE_100GE_M:
-                        if (!checkOdtuTTPforLoOduCreation(ontTp1, 20)) {
-                            LOG.error("TP {} of {} does not allow ODU4 termination creation",
+                        if (checkClientTp(tp.augmentation(TerminationPoint1.class))) {
+                            LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
+                            this.availableXpdrClientTps.add(tp.getTpId());
+                        } else {
+                            LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) 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;
+                    }
+                    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_100GE_M.equals(this.otnServiceType)
-                    || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
-                    || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))) {
-                TerminationPoint1 ontTp1;
-                if (tp.augmentation(TerminationPoint1.class) != null) {
-                    ontTp1 = tp.augmentation(TerminationPoint1.class);
-                } else {
-                    continue;
-                }
-                if (checkClientTp(ontTp1)) {
-                    LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue());
-                    this.availableXpdrClientTps.add(tp.getTpId());
-                } else {
-                    LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation",
-                        tp.getTpId().getValue(), node.getNodeId().getValue());
-                }
+                default:
+                    LOG.debug("unsupported ocn TP type {}", ocnTp1.getTpType());
             }
         }
-
-        if ((StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType)
+        if (StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType)
                 || StringConstants.SERVICE_TYPE_ODUC4.equals(this.otnServiceType)
                 || StringConstants.SERVICE_TYPE_ODUC3.equals(this.otnServiceType)
-                || StringConstants.SERVICE_TYPE_ODUC2.equals(this.otnServiceType))
-            || ((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))
+                || StringConstants.SERVICE_TYPE_ODUC2.equals(this.otnServiceType)
+                || ((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)))
-               )
-            || (StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
-                && (mode.equals("AZ") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 1, 1)))
-            || (StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
-                && (mode.equals("intermediate") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 0, 2)))
-            ) {
+                    )
+                || (StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
+                    && (mode.equals("AZ") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 1, 1)))
+                || (StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)
+                    && (mode.equals("intermediate") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 0, 2)))
+        ) {
             this.valid = true;
         } else {
             this.valid = false;
@@ -226,10 +232,9 @@ public class PceOtnNode implements PceNode {
             netwTps.sort(Comparator.comparing(TpId::getValue));
             for (TpId nwTp : netwTps) {
                 for (TpId clTp : clientTps) {
-                    @Nullable
-                    List<NonBlockingList> nblList = new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools()
-                        .nonnullOduSwitchingPools().values().stream().findFirst().get().getNonBlockingList().values());
-                    for (NonBlockingList nbl : nblList) {
+                    for (NonBlockingList nbl : new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools()
+                            .nonnullOduSwitchingPools().values().stream().findFirst().get()
+                                .getNonBlockingList().values())) {
                         if (nbl.getTpList().contains(clTp) && nbl.getTpList().contains(nwTp)) {
                             usableXpdrClientTps.add(clTp);
                             usableXpdrNWTps.add(nwTp);
@@ -241,14 +246,12 @@ public class PceOtnNode implements PceNode {
                     }
                 }
             }
-
         }
         if (netwTps != null && nbClient == 0 && nbNetw == 2) {
             netwTps.sort(Comparator.comparing(TpId::getValue));
-            @Nullable
-            List<NonBlockingList> nblList = new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools()
-                .nonnullOduSwitchingPools().values().stream().findFirst().get().getNonBlockingList().values());
-            for (NonBlockingList nbl : nblList) {
+            for (NonBlockingList nbl : new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools()
+                    .nonnullOduSwitchingPools().values().stream().findFirst().get()
+                        .getNonBlockingList().values())) {
                 for (TpId nwTp : netwTps) {
                     if (nbl.getTpList().contains(nwTp)) {
                         usableXpdrNWTps.add(nwTp);
@@ -276,19 +279,20 @@ public class PceOtnNode implements PceNode {
     }
 
     private boolean checkOdtuTTPforLoOduCreation(TerminationPoint1 ontTp1, int tsNb) {
-        return (ontTp1.getXpdrTpPortConnectionAttributes() != null
+        return ontTp1.getXpdrTpPortConnectionAttributes() != null
             && ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() != null
             && ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool() != null
             && (ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
-                .stream().findFirst().get().getOdtuType()
-                .equals(ODTU4TsAllocated.class)
+                        .stream().findFirst().get().getOdtuType()
+                    .equals(ODTU4TsAllocated.class)
                 ||
                 ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
-                .stream().findFirst().get().getOdtuType()
-                .equals(ODTUCnTs.class))
+                        .stream().findFirst().get().getOdtuType()
+                    .equals(ODTUCnTs.class))
             && !ontTp1.getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values()
-                .stream().findFirst().get().getTpnPool().isEmpty()
-            && (ontTp1.getXpdrTpPortConnectionAttributes().getTsPool().size() >= tsNb));
+                        .stream().findFirst().get().getTpnPool()
+                    .isEmpty()
+            && ontTp1.getXpdrTpPortConnectionAttributes().getTsPool().size() >= tsNb;
     }
 
     private boolean checkClientTp(TerminationPoint1 ontTp1) {
@@ -360,11 +364,9 @@ public class PceOtnNode implements PceNode {
                 }
             }
         }
-
         LOG.debug("validateSwitchingPoolBandwidth: No valid Switching pool for crossconnecting tp {} and {}",
             tp1.getTpId(), tp2.getTpId());
         return false;
-
     }
 
     public void validateIntermediateSwitch() {
@@ -376,23 +378,24 @@ public class PceOtnNode implements PceNode {
         }
         // Validate switch for use as an intermediate XPONDER on the path
         initXndrTps("intermediate");
-        if (!this.valid) {
-            LOG.debug("validateIntermediateSwitch: Switch unusable for transit == {}", nodeId.getValue());
-        } else {
+        if (this.valid) {
             LOG.info("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue());
+        } else {
+            LOG.debug("validateIntermediateSwitch: Switch unusable for transit == {}", nodeId.getValue());
         }
     }
 
     public void checkAvailableTribPort() {
-        List<TerminationPoint> networkTpList = node.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
+        List<TerminationPoint> networkTpList = node
+            .augmentation(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .getTerminationPoint().values().stream()
             .filter(type -> type
                 .augmentation(
                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1.class)
-                .getTpType().equals(OpenroadmTpType.XPONDERNETWORK))
+                .getTpType()
+                .equals(OpenroadmTpType.XPONDERNETWORK))
             .collect(Collectors.toList());
-
         for (TerminationPoint tp : networkTpList) {
             if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes() != null
                 && tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool() != null
@@ -400,9 +403,9 @@ public class PceOtnNode implements PceNode {
                     .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();
+                List<Uint16> tpnPool =
+                    tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getOdtuTpnPool()
+                        .values().stream().findFirst().get().getTpnPool();
                 if (tpnPool != null) {
                     tpAvailableTribPort.put(tp.getTpId().getValue(), tpnPool);
                 }
@@ -419,21 +422,20 @@ public class PceOtnNode implements PceNode {
                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1.class)
                 .getTpType().equals(OpenroadmTpType.XPONDERNETWORK))
             .collect(Collectors.toList());
-
         for (TerminationPoint tp : networkTpList) {
             if (tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes() != null
-                && tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getTsPool() != null) {
-                @Nullable
-                List<Uint16> tsPool = tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes()
-                    .getTsPool();
+                    && tp.augmentation(TerminationPoint1.class)
+                        .getXpdrTpPortConnectionAttributes().getTsPool() != null) {
+                List<Uint16> tsPool =
+                    tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes().getTsPool();
                 tpAvailableTribSlot.put(tp.getTpId().getValue(), tsPool);
             }
         }
     }
 
     public boolean isValid() {
-        if ((node == null) || (nodeId == null) || (nodeType == null) || (this.getSupNetworkNodeId() == null)
-            || (this.getSupClliNodeId() == null)) {
+        if (node == null || nodeId == null || nodeType == null || this.getSupNetworkNodeId() == null
+                || this.getSupClliNodeId() == null) {
             LOG.error("PceNode: one of parameters is not populated : nodeId, node type, supporting nodeId");
             valid = false;
         }
@@ -449,12 +451,10 @@ public class PceOtnNode implements PceNode {
             );
             return false;
         }
-
         if (!isNodeTypeValid(pceOtnNode)) {
             LOG.error("PceOtnNode node type: node type isn't one of MUXPDR or SWITCH or TPDR");
             return false;
         }
-
         return isOtnServiceTypeValid(pceOtnNode);
     }
 
@@ -462,17 +462,15 @@ public class PceOtnNode implements PceNode {
         if (pceOtnNode.modeType == null) {
             return false;
         }
-
         //Todo refactor Strings (mode and otnServiceType ) to enums
-        if ((pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_ODU4)
-                && pceOtnNode.modeType.equals("AZ"))) {
+        if (pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_ODU4)
+                && pceOtnNode.modeType.equals("AZ")) {
             return true;
         }
-
-        return ((pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_10GE)
+        return (pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_10GE)
                 || pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_1GE)
                 || pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_100GE_S))
-                && (isAz(pceOtnNode) || isIntermediate(pceOtnNode)));
+                && (isAz(pceOtnNode) || isIntermediate(pceOtnNode));
     }
 
     private boolean isIntermediate(PceOtnNode pceOtnNode) {
@@ -486,9 +484,9 @@ public class PceOtnNode implements PceNode {
     }
 
     private boolean isNodeTypeValid(final PceOtnNode pceOtnNode) {
-        return (pceOtnNode.nodeType == OpenroadmNodeType.MUXPDR)
-                || (pceOtnNode.nodeType  == OpenroadmNodeType.SWITCH)
-                || (pceOtnNode.nodeType  == OpenroadmNodeType.TPDR);
+        return pceOtnNode.nodeType == OpenroadmNodeType.MUXPDR
+                || pceOtnNode.nodeType  == OpenroadmNodeType.SWITCH
+                || pceOtnNode.nodeType  == OpenroadmNodeType.TPDR;
     }
 
     @Override
index 6b9f3cb987dc1ca785832cbc972687c08cfed257..954c4d907aafb295b8401cf36d2fa3a1a21cbaec 100644 (file)
@@ -88,7 +88,7 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     def test_05_service_path_create(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -101,7 +101,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                 'max-freq': 195.825,
                 'lower-spectral-slot-number': 713,
                 'higher-spectral-slot-number': 720
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ROADMA01', response['output']['result'])
 
@@ -242,7 +242,7 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     def test_14_service_path_delete(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -255,7 +255,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                 'max-freq': 195.825,
                 'lower-spectral-slot-number': 713,
                 'higher-spectral-slot-number': 720
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(response['output'], {'result': 'Request processed', 'success': True})
 
index 860d242d4f453c7c66cc10f574170599955fb633..f75caed0262912c991a4c5b6d04d4e8a8b5fed72 100644 (file)
@@ -97,7 +97,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
     # Renderer interface creations
     def test_07_device_renderer(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'modulation-format': 'dp-qpsk',
                 'operation': 'create',
                 'service-name': 'testNMC-MC',
@@ -115,7 +115,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                 'max-freq': 196.09375,
                 'lower-spectral-slot-number': 749,
                 'higher-spectral-slot-number': 763
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
         time.sleep(10)
index ceeb049c4f1150b01bce69fe04489978aecb2c7f..98397892ad20fc225bb37f1a69b42082560bf2e9 100644 (file)
@@ -85,7 +85,7 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     def test_05_service_path_create(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -98,7 +98,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                 'max-freq': 195.825,
                 'lower-spectral-slot-number': 713,
                 'higher-spectral-slot-number': 720
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ROADM-A1', response['output']['result'])
 
@@ -261,7 +261,7 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     def test_17_service_path_delete(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -274,7 +274,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                 'max-freq': 195.825,
                 'lower-spectral-slot-number': 713,
                 'higher-spectral-slot-number': 720
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(response['output'], {'result': 'Request processed', 'success': True})
 
index 6bb1fd6641851068d949fc7b42c26d45940ed93f..d8aeb23d8cc0d9f6312e8edc1a99c45a748811c4 100644 (file)
@@ -89,7 +89,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_04_service_path_create_OCH_OTU4(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -101,7 +101,7 @@ class TransportPCEtesting(unittest.TestCase):
                 'max-freq': 196.125,
                 'lower-spectral-slot-number': 761,
                 'higher-spectral-slot-number': 768
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
         self.assertTrue(response['output']['success'])
@@ -160,13 +160,13 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_08_otn_service_path_create_ODU4(self):
         response = test_utils_rfc8040.device_renderer_otn_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_ODU4',
                 'operation': 'create',
                 'service-rate': '100',
                 'service-format': 'ODU',
                 'nodes': [{'node-id': 'SPDR-SA1', 'network-tp': 'XPDR1-NETWORK1'}]
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Otn Service path was set up successfully for node :SPDR-SA1', response['output']['result'])
         self.assertTrue(response['output']['success'])
@@ -206,7 +206,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_11_otn_service_path_create_10GE(self):
         response = test_utils_rfc8040.device_renderer_otn_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service1',
                 'operation': 'create',
                 'service-rate': '10',
@@ -215,7 +215,7 @@ class TransportPCEtesting(unittest.TestCase):
                 'ethernet-encoding': 'eth encode',
                 'trib-slot': ['1'],
                 'trib-port-number': '1'
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Otn Service path was set up successfully for node :SPDR-SA1', response['output']['result'])
         self.assertTrue(response['output']['success'])
@@ -314,7 +314,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_16_otn_service_path_delete_10GE(self):
         response = test_utils_rfc8040.device_renderer_otn_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service1',
                 'operation': 'delete',
                 'service-rate': '10',
@@ -323,7 +323,7 @@ class TransportPCEtesting(unittest.TestCase):
                 'ethernet-encoding': 'eth encode',
                 'trib-slot': ['1'],
                 'trib-port-number': '1'
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Request processed', response['output']['result'])
         self.assertTrue(response['output']['success'])
@@ -349,13 +349,13 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_21_otn_service_path_delete_ODU4(self):
         response = test_utils_rfc8040.device_renderer_otn_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_ODU4',
                 'operation': 'delete',
                 'service-rate': '100',
                 'service-format': 'ODU',
                 'nodes': [{'node-id': 'SPDR-SA1', 'network-tp': 'XPDR1-NETWORK1'}]
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Request processed', response['output']['result'])
         self.assertTrue(response['output']['success'])
@@ -366,7 +366,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_23_service_path_delete_OCH_OTU4(self):
         response = test_utils_rfc8040.device_renderer_service_path_request(
-            {'input': {
+            {
                 'service-name': 'service_test',
                 'wave-number': '7',
                 'modulation-format': 'dp-qpsk',
@@ -378,7 +378,7 @@ class TransportPCEtesting(unittest.TestCase):
                 'max-freq': 196.125,
                 'lower-spectral-slot-number': 761,
                 'higher-spectral-slot-number': 768
-            }})
+            })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Request processed', response['output']['result'])
         self.assertTrue(response['output']['success'])
index 87e459063bf348a1e12603979a015c23fb264e87..14796e391aa52f28432952b40b7c85a29d58adbc 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils  # nopep8
+import test_utils_rfc8040  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -30,176 +30,163 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils.start_tpce()
-        cls.processes = test_utils.start_sims([('spdra', cls.NODE_VERSION),
-                                               ('spdrc', cls.NODE_VERSION)])
+        cls.processes = test_utils_rfc8040.start_tpce()
+        cls.processes = test_utils_rfc8040.start_sims([('spdra', cls.NODE_VERSION),
+                                                       ('spdrc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils.shutdown_process(process)
+            test_utils_rfc8040.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
         time.sleep(5)
 
     def test_01_connect_SPDR_SA1(self):
-        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        response = test_utils_rfc8040.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils.CODE_SHOULD_BE_201)
+                         test_utils_rfc8040.CODE_SHOULD_BE_201)
         time.sleep(10)
 
-        response = test_utils.get_netconf_oper_request("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['node'][0]['netconf-node-topology:connection-status'],
-            'connected')
+        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['connection-status'], 'connected')
 
     def test_02_connect_SPDR_SC1(self):
-        response = test_utils.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
+        response = test_utils_rfc8040.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils.CODE_SHOULD_BE_201)
+                         test_utils_rfc8040.CODE_SHOULD_BE_201)
         time.sleep(10)
 
-        response = test_utils.get_netconf_oper_request("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['node'][0]['netconf-node-topology:connection-status'],
-            'connected')
+        response = test_utils_rfc8040.check_device_connection("SPDR-SC1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['connection-status'], 'connected')
 
     def test_03_service_create_OTU4(self):
-        url = "{}/operations/transportpce-renderer:service-implementation-request"
-        data = {
-            "transportpce-renderer:input": {
-                "transportpce-renderer:service-name": "SPDRA-SPDRC-OTU4-ODU4",
-                "transportpce-renderer:connection-type": "infrastructure",
-                "transportpce-renderer:service-handler-header": {
-                    "transportpce-renderer:request-id": "abcd12-efgh34"
+        response = test_utils_rfc8040.device_renderer_service_implementation_request(
+            {
+                'service-name': 'SPDRA-SPDRC-OTU4-ODU4',
+                'connection-type': 'infrastructure',
+                'service-handler-header': {
+                    'request-id': 'abcd12-efgh34'
                 },
-                "transportpce-renderer:service-a-end": {
-                    "transportpce-renderer:service-format": "OTU",
-                    "transportpce-renderer:otu-service-rate": "org-openroadm-otn-common-types:OTU4",
-                    "transportpce-renderer:clli": "nodeSA",
-                    "transportpce-renderer:node-id": "SPDR-SA1"
+                'service-a-end': {
+                    'service-format': 'OTU',
+                    'otu-service-rate': 'org-openroadm-otn-common-types:OTU4',
+                    'clli': 'nodeSA',
+                    'node-id': 'SPDR-SA1'
 
                 },
-                "transportpce-renderer:service-z-end": {
-                    "transportpce-renderer:service-format": "OTU",
-                    "transportpce-renderer:otu-service-rate": "org-openroadm-otn-common-types:OTU4",
-                    "transportpce-renderer:clli": "nodeSC",
-                    "transportpce-renderer:node-id": "SPDR-SC1"
+                'service-z-end': {
+                    'service-format': 'OTU',
+                    'otu-service-rate': 'org-openroadm-otn-common-types:OTU4',
+                    'clli': 'nodeSC',
+                    'node-id': 'SPDR-SC1'
                 },
-                "transportpce-renderer:path-description": {
-                    "aToZ-direction": {
-                        "rate": 100,
-                        "transportpce-renderer:modulation-format": "dp-qpsk",
-                        "aToZ-wavelength-number": 1,
-                        "aToZ": [
+                'path-description': {
+                    'aToZ-direction': {
+                        'rate': 100,
+                        'modulation-format': 'dp-qpsk',
+                        'aToZ-wavelength-number': 1,
+                        'aToZ': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": ""
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': ''
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": ""
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': ''
                                 }
                             }
                         ],
-                        "transportpce-renderer:aToZ-min-frequency": 196.075,
-                        "transportpce-renderer:aToZ-max-frequency": 196.125
+                        'aToZ-min-frequency': 196.075,
+                        'aToZ-max-frequency': 196.125
                     },
-                    "transportpce-renderer:zToA-direction": {
-                        "transportpce-renderer:zToA-wavelength-number": "1",
-                        "transportpce-renderer:rate": "100",
-                        "transportpce-renderer:modulation-format": "dp-qpsk",
-                        "zToA": [
+                    'zToA-direction': {
+                        'zToA-wavelength-number': '1',
+                        'rate': '100',
+                        'modulation-format': 'dp-qpsk',
+                        'zToA': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": ""
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': ''
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": ""
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': ''
                                 }
                             }
                         ],
-                        "transportpce-renderer:zToA-min-frequency": 196.075,
-                        "transportpce-renderer:zToA-max-frequency": 196.125
+                        'zToA-min-frequency': 196.075,
+                        'zToA-max-frequency': 196.125
                     }
                 }
-            }
-        }
-        response = test_utils.post_request(url, data)
-        time.sleep(3)
-        print(response.json())
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
-                      res["output"]["configuration-response-common"]["response-message"])
+                      response['output']['configuration-response-common']['response-message'])
 
     # Test OCH-OTU interfaces on SPDR-A1
     def test_04_check_interface_och(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-761:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP1-CFP0',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP1-CFP0-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertIn(
+            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
+            [{'frequency': '196.1000', 'rate': 'org-openroadm-common-types:R100G',
+              'transmit-power': '-5', 'modulation-format': 'dp-qpsk'},
+             {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
+              'transmit-power': -5, 'modulation-format': 'dp-qpsk'}])
 
     def test_05_check_interface_OTU(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -214,35 +201,32 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     # Test OCH-OTU interfaces on SPDR-C1
     def test_06_check_interface_och(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-1',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP1-CFP0',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP1-CFP0-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertIn(
+            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
+            [{'frequency': '196.1000', 'rate': 'org-openroadm-common-types:R100G',
+              'transmit-power': '-5', 'modulation-format': 'dp-qpsk'},
+             {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
+              'transmit-power': -5, 'modulation-format': 'dp-qpsk'}])
 
     def test_07_check_interface_OTU(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-OTU")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -257,124 +241,113 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     # Test creation of ODU4 service
     def test_08_service_create_ODU4(self):
-        url = "{}/operations/transportpce-renderer:service-implementation-request"
-
-        data = {
-            "transportpce-renderer:input": {
-                "transportpce-renderer:service-name":
-                "SPDRA-SPDRC-OTU4-ODU4",
-                "transportpce-renderer:connection-type": "infrastructure",
-                "transportpce-renderer:service-handler-header": {
-                    "transportpce-renderer:request-id": "abcd12-efgh34"
+        response = test_utils_rfc8040.device_renderer_service_implementation_request(
+            {
+                'service-name':
+                'SPDRA-SPDRC-OTU4-ODU4',
+                'connection-type': 'infrastructure',
+                'service-handler-header': {
+                    'request-id': 'abcd12-efgh34'
                 },
-                "transportpce-renderer:service-a-end": {
-                    "transportpce-renderer:service-format": "ODU",
-                    "transportpce-renderer:odu-service-rate":
-                    "org-openroadm-otn-common-types:ODU4",
-                    "transportpce-renderer:clli": "nodeSA",
-                    "transportpce-renderer:node-id": "SPDR-SA1"
+                'service-a-end': {
+                    'service-format': 'ODU',
+                    'odu-service-rate':
+                    'org-openroadm-otn-common-types:ODU4',
+                    'clli': 'nodeSA',
+                    'node-id': 'SPDR-SA1'
 
                 },
-                "transportpce-renderer:service-z-end": {
-                    "transportpce-renderer:service-format": "ODU",
-                    "transportpce-renderer:odu-service-rate":
-                    "org-openroadm-otn-common-types:ODU4",
-                    "transportpce-renderer:clli": "nodeSC",
-                    "transportpce-renderer:node-id": "SPDR-SC1"
+                'service-z-end': {
+                    'service-format': 'ODU',
+                    'odu-service-rate':
+                    'org-openroadm-otn-common-types:ODU4',
+                    'clli': 'nodeSC',
+                    'node-id': 'SPDR-SC1'
                 },
-                "transportpce-renderer:path-description": {
-                    "aToZ-direction": {
-                        "rate": 100,
-                        "aToZ": [
+                'path-description': {
+                    'aToZ-direction': {
+                        'rate': 100,
+                        'aToZ': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": ""
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': ''
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": ""
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': ''
                                 }
                             }
                         ]
                     },
-                    "transportpce-renderer:zToA-direction": {
-                        "transportpce-renderer:rate": "100",
-                        "zToA": [
+                    'zToA-direction': {
+                        'rate': '100',
+                        'zToA': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": ""
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': ''
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": ""
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': ''
                                 }
                             }
                         ]
                     }
                 }
-            }
-        }
-        response = test_utils.post_request(url, data)
-        time.sleep(3)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
-                      res["output"]["configuration-response-common"]
-                      ["response-message"])
+                      response['output']['configuration-response-common']['response-message'])
 
     # Test ODU4 interfaces on SPDR-A1 and SPDR-C1
     def test_09_check_interface_ODU4(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -389,20 +362,19 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'AMf1n5hK6Xkk',
                         'tx-sapi': 'H/OelLynehI='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_10_check_interface_ODU4(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -417,145 +389,134 @@ class TransportPCEtesting(unittest.TestCase):
                         'expected-sapi': 'H/OelLynehI=',
                         'expected-dapi': 'AMf1n5hK6Xkk'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     # Test creation of 10G service
     def test_11_service_create_10GE(self):
-        url = "{}/operations/transportpce-renderer:service-implementation-request"
-
-        data = {
-            "transportpce-renderer:input": {
-                "transportpce-renderer:service-name": "SPDRA-SPDRC-10G",
-                "transportpce-renderer:connection-type": "service",
-                "transportpce-renderer:service-handler-header": {
-                    "transportpce-renderer:request-id": "abcd12-efgh34"
+        response = test_utils_rfc8040.device_renderer_service_implementation_request(
+            {
+                'service-name': 'SPDRA-SPDRC-10G',
+                'connection-type': 'service',
+                'service-handler-header': {
+                    'request-id': 'abcd12-efgh34'
                 },
-                "transportpce-renderer:service-a-end": {
-                    "transportpce-renderer:service-format": "Ethernet",
-                    "transportpce-renderer:service-rate": "10",
-                    "transportpce-renderer:clli": "nodeSA",
-                    "transportpce-renderer:node-id": "SPDR-SA1"
+                'service-a-end': {
+                    'service-format': 'Ethernet',
+                    'service-rate': '10',
+                    'clli': 'nodeSA',
+                    'node-id': 'SPDR-SA1'
                 },
-                "transportpce-renderer:service-z-end": {
-                    "transportpce-renderer:service-format": "Ethernet",
-                    "transportpce-renderer:service-rate": "10",
-                    "transportpce-renderer:clli": "nodeSC",
-                    "transportpce-renderer:node-id": "SPDR-SC1"
+                'service-z-end': {
+                    'service-format': 'Ethernet',
+                    'service-rate': '10',
+                    'clli': 'nodeSC',
+                    'node-id': 'SPDR-SC1'
                 },
-                "transportpce-renderer:path-description": {
-                    "aToZ-direction": {
-                        "rate": 10,
-                        "min-trib-slot": "1.1",
-                        "max-trib-slot": "1.8",
-                        "aToZ": [
+                'path-description': {
+                    'aToZ-direction': {
+                        'rate': 10,
+                        'min-trib-slot': '1.1',
+                        'max-trib-slot': '1.8',
+                        'aToZ': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-CLIENT1"
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-CLIENT1'
 
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-CLIENT1"
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-CLIENT1'
                                 }
                             }
                         ]
                     },
-                    "transportpce-renderer:zToA-direction": {
-                        "rate": "10",
-                        "min-trib-slot": "1.1",
-                        "max-trib-slot": "1.8",
-                        "zToA": [
+                    'zToA-direction': {
+                        'rate': '10',
+                        'min-trib-slot': '1.1',
+                        'max-trib-slot': '1.8',
+                        'zToA': [
                             {
-                                "id": "0",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-CLIENT1"
+                                'id': '0',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-CLIENT1'
                                 }
                             },
                             {
-                                "id": "1",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SC1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '1',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SC1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "2",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-NETWORK1"
+                                'id': '2',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-NETWORK1'
                                 }
                             },
                             {
-                                "id": "3",
-                                "resource": {
-                                    "tp-node-id": "SPDR-SA1-XPDR1",
-                                    "tp-id": "XPDR1-CLIENT1"
+                                'id': '3',
+                                'resource': {
+                                    'tp-node-id': 'SPDR-SA1-XPDR1',
+                                    'tp-id': 'XPDR1-CLIENT1'
 
                                 }
                             }
                         ]
                     }
                 }
-            }
-        }
-
-        response = test_utils.post_request(url, data)
-        time.sleep(3)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
-                      res["output"]["configuration-response-common"]
-                      ["response-message"])
+                      response['output']['configuration-response-common']['response-message'])
 
     # Test the interfaces on SPDR-A1
     def test_12_check_interface_10GE_CLIENT(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'], 10000)
 
     def test_13_check_interface_ODU2E_CLIENT(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
@@ -567,38 +528,36 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'terminated'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_14_check_ODU2E_connection(self):
-        response = test_utils.check_netconf_node_request(
+        response = test_utils_rfc8040.check_node_attribute_request(
             "SPDR-SA1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            "odu-connection", "XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_15_check_interface_ODU2E_NETWORK(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "interface/XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -609,29 +568,27 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'monitored'}
-
         input_dict_3 = {'trib-port-number': 1}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn(1,
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['trib-slots'])
 
     # Test the interfaces on SPDR-C1
     def test_16_check_interface_ODU2E_NETWORK(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -642,44 +599,39 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'monitored'}
-
         input_dict_3 = {'trib-port-number': 1}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn(1,
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['trib-slots'])
 
     def test_17_check_interface_10GE_CLIENT(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'], 10000)
 
     def test_18_check_interface_ODU2E_CLIENT(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
@@ -690,39 +642,36 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'terminated'}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_19_check_ODU2E_connection(self):
-        response = test_utils.check_netconf_node_request(
+        response = test_utils_rfc8040.check_node_attribute_request(
             "SPDR-SC1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            "odu-connection", "XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G-x-XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_20_check_interface_ODU2E_NETWORK(self):
-        response = test_utils.check_netconf_node_request("SPDR-SC1", "interface/XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -736,18 +685,18 @@ class TransportPCEtesting(unittest.TestCase):
 
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn(1,
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['trib-slots'])
 
@@ -755,14 +704,12 @@ class TransportPCEtesting(unittest.TestCase):
     # TODO: Delete interfaces (SPDR-A1, SPDR-C1)
 
     def test_21_disconnect_SPDR_SA1(self):
-        response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        response = test_utils_rfc8040.unmount_device("SPDR-SA1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_22_disconnect_SPDR_SC1(self):
-        response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        response = test_utils_rfc8040.unmount_device("SPDR-SC1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
diff --git a/tests/transportpce_tests/7.1/test02_otn_renderer.py b/tests/transportpce_tests/7.1/test02_otn_renderer.py
new file mode 100644 (file)
index 0000000..2ef26c1
--- /dev/null
@@ -0,0 +1,851 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2022 AT&T, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+import unittest
+import time
+import requests
+# pylint: disable=wrong-import-order
+import sys
+sys.path.append('transportpce_tests/common')
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils_rfc8040  # nopep8
+
+
+class TransportPCE400GPortMappingTesting(unittest.TestCase):
+
+    processes = None
+    NETWORK2_CHECK_DICT = {"logical-connection-point": "XPDR2-NETWORK1",
+                           "supporting-port": "L1",
+                           "supported-interface-capability": [
+                               "org-openroadm-port-types:if-otsi-otsigroup"
+                           ],
+                           "port-direction": "bidirectional",
+                           "port-qual": "switch-network",
+                           "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                           "xponder-type": "mpdr",
+                           'lcp-hash-val': 'LY9PxYJqUbw=',
+                           'port-admin-state': 'InService',
+                           'port-oper-state': 'InService'}
+    NODE_VERSION = '7.1'
+
+    @classmethod
+    def setUpClass(cls):
+        cls.processes = test_utils_rfc8040.start_tpce()
+        cls.processes = test_utils_rfc8040.start_sims([('xpdra2', cls.NODE_VERSION)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils_rfc8040.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        # pylint: disable=consider-using-f-string
+        print("execution of {}".format(self.id().split(".")[-1]))
+        time.sleep(10)
+
+    def test_01_xpdr_device_connection(self):
+        response = test_utils_rfc8040.mount_device("XPDR-A2",
+                                                   ('xpdra2', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils_rfc8040.CODE_SHOULD_BE_201)
+
+    # Check if the node appears in the ietf-network topology
+    # this test has been removed, since it already exists in port-mapping
+    # 1a) create a OTUC2 device renderer
+    def test_02_service_path_create_otuc2(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC2',
+                'wave-number': '0',
+                'modulation-format': 'dp-qpsk',
+                'operation': 'create',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'otu-interface-id': ['XPDR2-NETWORK1-OTUC2'],
+             'och-interface-id': ['XPDR2-NETWORK1-OTSIGROUP-200G']}, response['output']['node-interface'])
+
+    def test_03_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC2"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_04_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'type': 'org-openroadm-interfaces:otsi',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {
+            "frequency": 196.0812,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R200G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qpsk"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic2.4", "iid": [1, 2]},
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
+
+    def test_05_check_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-200G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-755:768',
+                        'type': 'org-openroadm-interfaces:otsi-group',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R200G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group']),
+                             response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
+
+    def test_06_check_interface_otuc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC2',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-OTSIGROUP-200G',
+                        'type': 'org-openroadm-interfaces:otnOtu',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 2,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+    # 1b) create a ODUC2 device renderer
+    def test_07_otn_service_path_create_oduc2(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC2',
+                'operation': 'create',
+                'service-rate': '200',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Otn Service path was set up successfully for node :XPDR-A2', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'odu-interface-id': ['XPDR2-NETWORK1-ODUC2']}, response['output']['node-interface'])
+
+    def test_08_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC2"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_09_check_interface_oduc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC2',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-OTUC2',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'L1'}
+
+        input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
+                        'rate': 'org-openroadm-otn-common-types:ODUCn',
+                        'tx-sapi': 'LY9PxYJqUbw=',
+                        'tx-dapi': 'LY9PxYJqUbw=',
+                        'expected-sapi': 'LY9PxYJqUbw=',
+                        'expected-dapi': 'LY9PxYJqUbw=',
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 2
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '22', 'exp-payload-type': '22'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    # 1c) create Ethernet device renderer
+    def test_10_otn_service_path_create_100ge(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_Ethernet',
+                'operation': 'create',
+                'service-rate': '100',
+                'service-format': 'Ethernet',
+                'nodes': [{'node-id': 'XPDR-A2', 'client-tp': 'XPDR2-CLIENT1', 'network-tp': 'XPDR2-NETWORK1'}],
+                'ethernet-encoding': 'eth encode',
+                'opucn-trib-slots': ['1.1', '1.20']
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Otn Service path was set up successfully for node :XPDR-A2', response['output']['result'])
+        self.assertEqual('XPDR-A2', response['output']['node-interface'][0]['node-id'])
+        self.assertIn('XPDR2-CLIENT1-ODU4-service_Ethernet-x-XPDR2-NETWORK1-ODU4-service_Ethernet',
+                      response['output']['node-interface'][0]['connection-id'])
+        self.assertIn('XPDR2-CLIENT1-ETHERNET-100G', response['output']['node-interface'][0]['eth-interface-id'])
+        self.assertIn('XPDR2-NETWORK1-ODU4-service_Ethernet',
+                      response['output']['node-interface'][0]['odu-interface-id'])
+        self.assertIn('XPDR2-CLIENT1-ODU4-service_Ethernet',
+                      response['output']['node-interface'][0]['odu-interface-id'])
+
+    def test_11_check_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ETHERNET-100G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ETHERNET-100G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
+                        'type': 'org-openroadm-interfaces:ethernetCsmacd',
+                        'supporting-port': 'C1'
+                        }
+        input_dict_2 = {'speed': 100000}
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+                             response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_12_check_interface_odu4_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4-service_Ethernet',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
+                        'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'C1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'terminated'}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '07', 'exp-payload-type': '07'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_13_check_interface_odu4_network(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4-service_Ethernet',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-ODUC2',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'not-terminated'}
+        input_dict_3 = {'trib-port-number': 1}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_3,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                      'parent-odu-allocation']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn('1.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                      ['opucn-trib-slots'])
+        self.assertIn('1.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                      ['opucn-trib-slots'])
+
+    def test_14_check_odu_connection_xpdra2(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2",
+            "odu-connection", "XPDR2-CLIENT1-ODU4-service_Ethernet-x-XPDR2-NETWORK1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {
+            'connection-name':
+            'XPDR2-CLIENT1-ODU4-service_Ethernet-x-XPDR2-NETWORK1-ODU4-service_Ethernet',
+            'direction': 'bidirectional'
+        }
+
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4-service_Ethernet'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4-service_Ethernet'},
+                             response['odu-connection'][0]['source'])
+
+    # 1d) Delete Ethernet device interfaces
+    def test_15_otn_service_path_delete_100ge(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_Ethernet',
+                'operation': 'delete',
+                'service-rate': '100',
+                'service-format': 'Ethernet',
+                'nodes': [{'node-id': 'XPDR-A2', 'client-tp': 'XPDR2-CLIENT1', 'network-tp': 'XPDR2-NETWORK1'}],
+                'ethernet-encoding': 'eth encode',
+                'trib-slot': ['1'],
+                'trib-port-number': '1'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_16_check_no_odu_connection(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2",
+            "odu-connection", "XPDR2-CLIENT1-ODU4-service_Ethernet-x-XPDR2-NETWORK1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_17_check_no_interface_odu_network(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_18_check_no_interface_odu_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4-service_Ethernet")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_19_check_no_interface_100ge_client(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ETHERNET-100G")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 1e) Delete ODUC2 device interfaces
+    def test_20_otn_service_path_delete_oduc2(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC2',
+                'operation': 'delete',
+                'service-rate': '200',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_21_check_no_interface_oduc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 1f) Delete OTUC2 device interfaces
+    def test_22_service_path_delete_otuc2(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC2',
+                'wave-number': '0',
+                'modulation-format': 'dp-qpsk',
+                'operation': 'delete',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_23_check_no_interface_otuc2(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC2")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_24_check_no_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_25_check_no_interface_otsi(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 2a) create a OTUC3 device renderer
+    def test_26_service_path_create_otuc3(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC3',
+                'wave-number': '0',
+                'modulation-format': 'dp-qam8',
+                'operation': 'create',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'otu-interface-id': ['XPDR2-NETWORK1-OTUC3'],
+             'och-interface-id': ['XPDR2-NETWORK1-OTSIGROUP-300G']}, response['output']['node-interface'])
+
+    def test_27_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC3"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_28_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'type': 'org-openroadm-interfaces:otsi',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {
+            "frequency": 196.0812,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R300G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qam8"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic3.6", "iid": [1, 2, 3]},
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
+
+    def test_29_check_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-300G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-300G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-755:768',
+                        'type': 'org-openroadm-interfaces:otsi-group',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R300G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group']),
+                             response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
+
+    def test_30_check_interface_otuc3(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC3")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-OTSIGROUP-300G',
+                        'type': 'org-openroadm-interfaces:otnOtu',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 3,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+    # 2b) create a ODUC3 device renderer
+    def test_31_otn_service_path_create_oduc3(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC3',
+                'operation': 'create',
+                'service-rate': '300',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Otn Service path was set up successfully for node :XPDR-A2', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'odu-interface-id': ['XPDR2-NETWORK1-ODUC3']}, response['output']['node-interface'])
+
+    def test_32_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC3"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_33_check_interface_oduc3(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-OTUC3',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'L1'}
+
+        input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
+                        'rate': 'org-openroadm-otn-common-types:ODUCn',
+                        'tx-sapi': 'LY9PxYJqUbw=',
+                        'tx-dapi': 'LY9PxYJqUbw=',
+                        'expected-sapi': 'LY9PxYJqUbw=',
+                        'expected-dapi': 'LY9PxYJqUbw=',
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 3
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '22', 'exp-payload-type': '22'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    # 2c) create Ethernet device renderer
+    # No change in the ethernet device renderer so skipping those tests
+    # 2d) Delete Ethernet device interfaces
+    # No change in the ethernet device renderer so skipping those tests
+
+    # 2e) Delete ODUC3 device interfaces
+    def test_34_otn_service_path_delete_oduc3(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC3',
+                'operation': 'delete',
+                'service-rate': '300',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_35_check_no_interface_oduc3(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 2f) Delete OTUC3 device interfaces
+    def test_36_service_path_delete_otuc3(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC3',
+                'wave-number': '0',
+                'modulation-format': 'dp-qam8',
+                'operation': 'delete',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_37_check_no_interface_otuc3(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC3")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_38_check_no_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-300G")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_39_check_no_interface_otsi(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 3a) create a OTUC4 device renderer
+    def test_40_service_path_create_otuc3(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC4',
+                'wave-number': '0',
+                'modulation-format': 'dp-qam16',
+                'operation': 'create',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'otu-interface-id': ['XPDR2-NETWORK1-OTUC4'],
+             'och-interface-id': ['XPDR2-NETWORK1-OTSIGROUP-400G']}, response['output']['node-interface'])
+
+    def test_41_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC4"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_42_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'type': 'org-openroadm-interfaces:otsi',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {
+            "frequency": 196.0812,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R400G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qam16"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic4.8", "iid": [1, 2, 3, 4]},
+                             response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
+
+    def test_43_check_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-400G")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-400G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-755:768',
+                        'type': 'org-openroadm-interfaces:otsi-group',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R400G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group']),
+                             response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
+
+    def test_44_check_interface_otuc4(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC4',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        ['supporting-interface-list'][0]: 'XPDR2-NETWORK1-OTSIGROUP-400G',
+                        'type': 'org-openroadm-interfaces:otnOtu',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 4,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+    # 3b) create a ODUC4 device renderer
+    def test_45_otn_service_path_create_oduc3(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC4',
+                'operation': 'create',
+                'service-rate': '400',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Otn Service path was set up successfully for node :XPDR-A2', response['output']['result'])
+        self.assertIn(
+            {'node-id': 'XPDR-A2',
+             'odu-interface-id': ['XPDR2-NETWORK1-ODUC4']}, response['output']['node-interface'])
+
+    def test_46_get_portmapping_network1(self):
+        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC4"
+        self.assertIn(
+            self.NETWORK2_CHECK_DICT,
+            response['mapping'])
+
+    def test_47_check_interface_oduc4(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC4',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-OTUC4',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'L1'}
+
+        input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
+                        'rate': 'org-openroadm-otn-common-types:ODUCn',
+                        'tx-sapi': 'LY9PxYJqUbw=',
+                        'tx-dapi': 'LY9PxYJqUbw=',
+                        'expected-sapi': 'LY9PxYJqUbw=',
+                        'expected-dapi': 'LY9PxYJqUbw=',
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 4
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '22', 'exp-payload-type': '22'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    # 3c) create Ethernet device renderer
+    # No change in the ethernet device renderer so skipping those tests
+    # 3d) Delete Ethernet device interfaces
+    # No change in the ethernet device renderer so skipping those tests
+
+    # 3e) Delete ODUC4 device interfaces
+    def test_48_otn_service_path_delete_oduc4(self):
+        response = test_utils_rfc8040.device_renderer_otn_service_path_request(
+            {
+                'service-name': 'service_ODUC4',
+                'operation': 'delete',
+                'service-rate': '400',
+                'service-format': 'ODU',
+                'nodes': [{'node-id': 'XPDR-A2', 'network-tp': 'XPDR2-NETWORK1'}]
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_49_check_no_interface_oduc4(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # 3f) Delete OTUC4 device interfaces
+    def test_50_service_path_delete_otuc4(self):
+        response = test_utils_rfc8040.device_renderer_service_path_request(
+            {
+                'service-name': 'service_OTUC4',
+                'wave-number': '0',
+                'modulation-format': 'dp-qam16',
+                'operation': 'delete',
+                'nodes': [{'node-id': 'XPDR-A2', 'dest-tp': 'XPDR2-NETWORK1'}],
+                'center-freq': 196.1,
+                'nmc-width': 75,
+                'min-freq': 196.0375,
+                'max-freq': 196.125,
+                'lower-spectral-slot-number': 755,
+                'higher-spectral-slot-number': 768
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Request processed', response['output']['result'])
+
+    def test_51_check_no_interface_otuc4(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC4")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_52_check_no_interface_otsig(self):
+        response = test_utils_rfc8040.check_node_attribute_request(
+            "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-400G")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_53_check_no_interface_otsi(self):
+        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    # Disconnect the XPDR
+    def test_54_xpdr_device_disconnection(self):
+        response = test_utils_rfc8040.unmount_device("XPDR-A2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_55_xpdr_device_disconnected(self):
+        response = test_utils_rfc8040.check_device_connection("XPDR-A2")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
+        self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
+        self.assertEqual(response['connection-status']['error-message'],
+                         'Request could not be completed because the relevant data model content does not exist')
+
+    def test_56_xpdr_device_not_connected(self):
+        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2")
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
+        self.assertEqual(response['node-info']['error-tag'], 'data-missing')
+        self.assertEqual(response['node-info']['error-message'],
+                         'Request could not be completed because the relevant data model content does not exist')
+
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2)
index b6eb71cae984a48e667c214325739246cd8ee19e..d9ecfc2116349a8f2b79711eb5d7ff2a434c065b 100644 (file)
@@ -433,11 +433,11 @@ def service_delete_request(servicename: str,
 
 def service_path_request(operation: str, servicename: str, wavenumber: str, nodes, centerfreq: str,
                          slotwidth: int, minfreq: float, maxfreq: float, lowerslotnumber: int,
-                         higherslotnumber: int):
+                         higherslotnumber: int, modulation_format="dp-qpsk"):
     attr = {"renderer:input": {
         "renderer:service-name": servicename,
         "renderer:wave-number": wavenumber,
-        "renderer:modulation-format": "dp-qpsk",
+        "renderer:modulation-format": modulation_format,
         "renderer:operation": operation,
         "renderer:nodes": nodes,
         "renderer:center-freq": centerfreq,
index 590577cd4796d12c7ba510725de27677cea964f9..9fc899840f551dfd6637341e9fddeffefefbf914 100644 (file)
@@ -481,7 +481,7 @@ def del_ietf_network_node_request(network: str, node: str, content: str):
     return response
 
 #
-# TransportPCE network-utils and service-path operations
+# TransportPCE network-utils and service-path and service-implementation operations
 #
 
 
@@ -520,9 +520,9 @@ def connect_rdm_to_xpdr_request(payload: dict):
 def device_renderer_service_path_request(payload: dict):
     url = "{}/operations/transportpce-device-renderer:service-path"
     if RESTCONF_VERSION == 'draft-bierman02':
-        data = prepend_dict_keys(payload, 'transportpce-device-renderer:')
+        data = prepend_dict_keys({'input': payload}, 'transportpce-device-renderer:')
     else:
-        data = payload
+        data = {'input': payload}
     response = post_request(url, data)
     res = response.json()
     return_key = {'rfc8040': 'transportpce-device-renderer:output',
@@ -535,9 +535,9 @@ def device_renderer_service_path_request(payload: dict):
 def device_renderer_otn_service_path_request(payload: dict):
     url = "{}/operations/transportpce-device-renderer:otn-service-path"
     if RESTCONF_VERSION == 'draft-bierman02':
-        data = prepend_dict_keys(payload, 'transportpce-device-renderer:')
+        data = prepend_dict_keys({'input': payload}, 'transportpce-device-renderer:')
     else:
-        data = payload
+        data = {'input': payload}
     response = post_request(url, data)
     res = response.json()
     return_key = {'rfc8040': 'transportpce-device-renderer:output',
@@ -545,3 +545,18 @@ def device_renderer_otn_service_path_request(payload: dict):
     return_output = res[return_key[RESTCONF_VERSION]]
     return {'status_code': response.status_code,
             'output': return_output}
+
+
+def device_renderer_service_implementation_request(payload: dict):
+    url = "{}/operations/transportpce-renderer:service-implementation-request"
+    if RESTCONF_VERSION == 'draft-bierman02':
+        data = prepend_dict_keys({'input': payload}, 'transportpce-renderer:')
+    else:
+        data = {'input': payload}
+    response = post_request(url, data)
+    res = response.json()
+    return_key = {'rfc8040': 'transportpce-renderer:output',
+                  'draft-bierman02': 'output'}
+    return_output = res[return_key[RESTCONF_VERSION]]
+    return {'status_code': response.status_code,
+            'output': return_output}
diff --git a/tox.ini b/tox.ini
index 41bc8670a74b545e00cad6015523c1f534eda9c0..059b847c7d26cd91c9f39bdcf7e446850cb19a33 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -64,7 +64,7 @@ deps =
   -r{toxinidir}/tests/requirements.txt
   -r{toxinidir}/tests/test-requirements.txt
   setuptools>=7.0
-  gnpy4tpce
+  gnpy4tpce==1.2.1
 whitelist_externals = launch_tests.sh
 passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
 #setenv =
@@ -148,7 +148,7 @@ whitelist_externals = launch_tests.sh
 passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
 setenv =
 #    USE_LIGHTY=True
-#    USE_ODL_RESTCONF_VERSION=draft-bierman02
+    USE_ODL_RESTCONF_VERSION=draft-bierman02
     USE_ODL_ALT_KARAF_ENV=./karaf71.env
     USE_ODL_ALT_KARAF_INSTALL_DIR=karaf71
 commands =
@@ -298,5 +298,5 @@ commands =
 basepython = python3
 deps = gitlint
 commands =
-    gitlint
+    gitlint --config ../.gitlint