Adding SAPI/DAPI to Renderer 86/87086/24
authorBalagangadhar Bathula <bb4341@att.com>
Wed, 22 Jan 2020 19:25:42 +0000 (14:25 -0500)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Mon, 4 May 2020 07:48:51 +0000 (07:48 +0000)
- Refactor code for codestyle warnings
- Removed deprecated warnings
- Removed hardcorded lines
- updated code to have hash value for SAPI and DAPI
- introduce a FNV1 128 bit private hash function
  to abide by the 16 Bytes limitation on these parameters length.
- clean some parts of the code
- modified test cases, both 1.2.1 and 2.2.1
- Added expected sapi/dapi
- Removed some deprecated methods in test suite

JIRA: TRNSPRTPCE-183
Co-authored-by: Shweta Vachhani <sv111y@att.com>
Co-authored-by: Guillaume Lambert <guillaume.lambert@orange.com>
Change-Id: Iefb56ec9e2bcf99c120143e2816a0653c48be248
Signed-off-by: guillaume.lambert <guillaume.lambert@orange.com>
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java
tests/transportpce_tests/1.2.1/test_portmapping.py
tests/transportpce_tests/1.2.1/test_renderer_service_path_nominal.py
tests/transportpce_tests/2.2.1/test_otn_renderer.py
tests/transportpce_tests/2.2.1/test_portmapping.py
tests/transportpce_tests/2.2.1/test_renderer_service_path_nominal.py

index 5f08e571698be4a5285dcd64cf1ef5bd53f4b8b1..d006ea737b1cd312ba12c6719d92e4e908e5e4cc 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.transportpce.common.mapping;
 
 import com.google.common.util.concurrent.FluentFuture;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -83,6 +85,11 @@ public class PortMappingVersion121 {
     private final DeviceTransactionManager deviceTransactionManager;
     private final OpenRoadmInterfaces openRoadmInterfaces;
 
+    //FNV1 128 bit hash constants
+    private static final BigInteger FNV_PRIME = new BigInteger("309485009821345068724781371");
+    private static final BigInteger FNV_INIT = new BigInteger("6c62272e07bb014262b821756295c58d", 16);
+    private static final BigInteger FNV_MOD = new BigInteger("2").pow(128);
+
     public PortMappingVersion121(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager,
         OpenRoadmInterfaces openRoadmInterfaces) {
         this.dataBroker = dataBroker;
@@ -657,6 +664,7 @@ public class PortMappingVersion121 {
     private Mapping createXpdrMappingObject(String nodeId, Ports port, String circuitPackName,
         String logicalConnectionPoint, String partnerLcp, Mapping mapping, String assoLcp) {
         MappingBuilder mpBldr;
+
         if (mapping != null && assoLcp != null) {
             // update existing mapping
             mpBldr = new MappingBuilder(mapping);
@@ -664,11 +672,13 @@ public class PortMappingVersion121 {
         } else {
             // create a new mapping
             mpBldr = new MappingBuilder();
+            String nodeIdLcp = nodeId + logicalConnectionPoint;
             mpBldr.withKey(new MappingKey(logicalConnectionPoint))
                 .setLogicalConnectionPoint(logicalConnectionPoint)
                 .setSupportingCircuitPackName(circuitPackName)
                 .setSupportingPort(port.getPortName())
-                .setPortDirection(port.getPortDirection().getName());
+                .setPortDirection(port.getPortDirection().getName())
+                .setLcpHashVal(fnv(nodeIdLcp));
             if (port.getPortQual() != null) {
                 mpBldr.setPortQual(port.getPortQual().getName());
             }
@@ -847,4 +857,22 @@ public class PortMappingVersion121 {
         return nodeInfoBldr.build();
     }
 
+    /**
+     * Implements the FNV-1 128bit algorithm.
+     * https://www.wikiwand.com/en/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#/FNV-1_hash
+     * https://github.com/pmdamora/fnv-cracker-app/blob/master/src/main/java/passwordcrack/cracking/HashChecker.java
+     * @param stringdata the String to be hashed
+     * @return the hash string
+     */
+    private String fnv(String stringdata) {
+        BigInteger hash = FNV_INIT;
+        byte[] data = stringdata.getBytes(StandardCharsets.UTF_8);
+
+        for (byte b : data) {
+            hash = hash.multiply(FNV_PRIME).mod(FNV_MOD);
+            hash = hash.xor(BigInteger.valueOf((int) b & 0xff));
+        }
+
+        return hash.toString(16);
+    }
 }
index e84eefbe4d232640d02d3f7a161b7f55105998f6..f2267ce7b9839614341d077f1f1e1f8d3068c72b 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.transportpce.common.mapping;
 
 import com.google.common.util.concurrent.FluentFuture;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -89,6 +91,10 @@ public class PortMappingVersion221 {
     private final DataBroker dataBroker;
     private final DeviceTransactionManager deviceTransactionManager;
     private final OpenRoadmInterfaces openRoadmInterfaces;
+    //FNV1 128 bit hash constants
+    private static final BigInteger FNV_PRIME = new BigInteger("309485009821345068724781371");
+    private static final BigInteger FNV_INIT = new BigInteger("6c62272e07bb014262b821756295c58d", 16);
+    private static final BigInteger FNV_MOD = new BigInteger("2").pow(128);
 
     public PortMappingVersion221(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager,
         OpenRoadmInterfaces openRoadmInterfaces) {
@@ -804,12 +810,16 @@ public class PortMappingVersion221 {
             mpBldr = new MappingBuilder(mapping).setConnectionMapLcp(connectionMapLcp);
         } else {
             // create a new mapping
+            String nodeIdLcp = nodeId + logicalConnectionPoint;
             mpBldr = new MappingBuilder()
                 .withKey(new MappingKey(logicalConnectionPoint))
                 .setLogicalConnectionPoint(logicalConnectionPoint)
                 .setSupportingCircuitPackName(circuitPackName)
                 .setSupportingPort(port.getPortName())
-                .setPortDirection(port.getPortDirection().getName());
+                .setPortDirection(port.getPortDirection().getName())
+                // fnv hash is generated for the combination nodeID and logical connection point; used for SAPI/DAPI
+                .setLcpHashVal(fnv(nodeIdLcp));
+
             if (port.getPortQual() != null) {
                 mpBldr.setPortQual(port.getPortQual().getName());
             }
@@ -984,4 +994,22 @@ public class PortMappingVersion221 {
         return nodeInfoBldr.build();
     }
 
+    /**
+     * Implements the FNV-1 128bit algorithm.
+     * https://www.wikiwand.com/en/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#/FNV-1_hash
+     * https://github.com/pmdamora/fnv-cracker-app/blob/master/src/main/java/passwordcrack/cracking/HashChecker.java
+     * @param stringdata the String to be hashed
+     * @return the hash string
+     */
+    private String fnv(String stringdata) {
+        BigInteger hash = FNV_INIT;
+        byte[] data = stringdata.getBytes(StandardCharsets.UTF_8);
+
+        for (byte b : data) {
+            hash = hash.multiply(FNV_PRIME).mod(FNV_MOD);
+            hash = hash.xor(BigInteger.valueOf((int) b & 0xff));
+        }
+
+        return hash.toString(16);
+    }
 }
index f2e8bcb8ad5d7f48513d461b3762b3356295c16f..11a7811858167f018555edd54886eb88c02b6352 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.transportpce.renderer.openroadminterface;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 import java.util.Optional;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
@@ -62,6 +61,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.OtuAttributes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.otu.container.OtuBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,6 +71,7 @@ public class OpenRoadmInterface221 {
     private FixedFlexInterface fixedFlex;
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface221.class);
 
+
     public OpenRoadmInterface221(PortMapping portMapping, OpenRoadmInterfaces openRoadmInterfaces,
         FixedFlexInterface fixedFlex) {
         this.portMapping = portMapping;
@@ -82,14 +83,15 @@ public class OpenRoadmInterface221 {
         throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format("Unable to get mapping from PortMapping for node % and"
-                + " logical connection port %s", nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    nodeId, logicalConnPoint));
         }
 
         // Ethernet interface specific data
         EthernetBuilder ethIfBuilder = new EthernetBuilder()
             .setFec(EthAttributes.Fec.Off)
-            .setSpeed(100000L);
+            .setSpeed(Uint32.valueOf(100000));
 
         InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.class,
             logicalConnPoint + "-ETHERNET");
@@ -293,12 +295,59 @@ public class OpenRoadmInterface221 {
         return oduInterfaceBldr.getName();
     }
 
+    public String createOpenRoadmOdu4Interface(String anodeId, String alogicalConnPoint, String supportingOtuInterface,
+        String znodeId, String zlogicalConnPoint)
+        throws OpenRoadmInterfaceException {
+        Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
+        if (portMapA == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    anodeId, alogicalConnPoint));
+        }
+        if (portMapZ == null) {
+            throw new OpenRoadmInterfaceException(
+                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                    znodeId, zlogicalConnPoint));
+        }
+        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
+            alogicalConnPoint + "-ODU");
+        oduInterfaceBldr.setSupportingInterface(supportingOtuInterface);
+
+        // ODU interface specific data
+        // Set Opu attributes
+        OpuBuilder opuBldr = new OpuBuilder()
+            .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"));
+        OduBuilder oduIfBuilder = new OduBuilder()
+            .setRate(ODU4.class)
+            .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+            .setOpu(opuBldr.build())
+            .setTxSapi(portMapA.getLcpHashVal())
+            .setTxDapi(portMapZ.getLcpHashVal())
+            .setExpectedDapi(portMapA.getLcpHashVal()) // Setting the expected Dapi and Sapi values
+            .setExpectedDapi(portMapZ.getLcpHashVal());
+
+
+        // Create Interface1 type object required for adding as augmentation
+        // TODO look at imports of different versions of class
+        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder oduIf1Builder =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder();
+        oduInterfaceBldr.addAugmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1.class,
+            oduIf1Builder.setOdu(oduIfBuilder.build()).build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(anodeId, oduInterfaceBldr);
+        return oduInterfaceBldr.getName();
+    }
+
     public String createOpenRoadmOtu4Interface(String nodeId, String logicalConnPoint, String supportOchInterface)
         throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format("Unable to get mapping from PortMapping for node % and logical connection port %s",
+                String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s",
                     nodeId, logicalConnPoint));
         }
         // Create generic interface
@@ -324,6 +373,54 @@ public class OpenRoadmInterface221 {
         return otuInterfaceBldr.getName();
     }
 
+    public String createOpenRoadmOtu4Interface(String anodeId, String alogicalConnPoint, String asupportOchInterface,
+                                               String znodeId, String zlogicalConnPoint)
+        throws OpenRoadmInterfaceException {
+        Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
+        if (portMapA == null) {
+            throw new OpenRoadmInterfaceException(
+                    String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s ",
+                            anodeId, alogicalConnPoint));
+        }
+        // On the Zside
+        if (portMapZ == null) {
+            throw new OpenRoadmInterfaceException(
+                    String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s ",
+                            znodeId, zlogicalConnPoint));
+
+        }
+        // Create generic interface builder
+        InterfaceBuilder otuInterfaceBldr = createGenericInterfaceBuilder(portMapA, OtnOtu.class,
+                alogicalConnPoint + "-OTU");
+
+        // Set the supporting interface data
+        otuInterfaceBldr.setSupportingInterface(asupportOchInterface);
+
+
+        // OTU interface specific data
+        OtuBuilder otuIfBuilder = new OtuBuilder()
+                .setFec(OtuAttributes.Fec.Scfec)
+                .setRate(OTU4.class)
+                .setTxSapi(portMapA.getLcpHashVal())
+                .setTxDapi(portMapZ.getLcpHashVal())
+                .setExpectedDapi(portMapA.getLcpHashVal()) // setting expected SAPI and DAPI values
+                .setExpectedSapi(portMapZ.getLcpHashVal());
+
+
+        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.Interface1Builder otuIf1Builder =
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.Interface1Builder();
+
+        otuInterfaceBldr.addAugmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1.class,
+                otuIf1Builder.setOtu(otuIfBuilder.build()).build());
+
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(anodeId, otuInterfaceBldr);
+        return otuInterfaceBldr.getName();
+
+    }
+
     public String createOpenRoadmOchInterfaceName(String logicalConnectionPoint, Long waveNumber) {
         return logicalConnectionPoint + "-" + waveNumber;
     }
@@ -449,10 +546,7 @@ public class OpenRoadmInterface221 {
         OduBuilder oduIfBuilder = new OduBuilder()
                 .setRate(ODU4.class)
                 .setMonitoringMode(OduAttributes.MonitoringMode.Terminated);
-        if (!nodeId.toLowerCase(Locale.getDefault()).contains("eci")) {
-            oduIfBuilder.setTxDapi("");
-            oduIfBuilder.setTxSapi("");
-        }
+
         // Set Opu attributes
         OpuBuilder opuBldr = new OpuBuilder()
                 .setPayloadType(PayloadTypeDef.getDefaultInstance("21"))
index 0b7b5b9cdc3f6f6f1c57026b68e47694876596d7..9f85cc8d64c278093671175d22152b990ba84d32 100644 (file)
@@ -112,6 +112,33 @@ public class OpenRoadmInterfaceFactory {
         }
     }
 
+    /**
+     * This methods creates an ODU interface on the given termination point.
+     *
+     * @param anodeId                 node ID for A side
+     * @param alogicalConnPoint       logical connection point for A side
+     * @param asupportingOtuInterface supporting OTU interface
+     * @param znodeId                 node ID for Z side
+     * @param zlogicalConnPoint       logical connection point for Z side
+     * @return Name of the interface if successful, otherwise return null.
+     * @throws OpenRoadmInterfaceException OpenRoadm interface exception
+     */
+
+    public String createOpenRoadmOdu4Interface(String anodeId, String alogicalConnPoint, String asupportingOtuInterface,
+        String znodeId, String zlogicalConnPoint)
+        throws OpenRoadmInterfaceException {
+        switch (mappingUtils.getOpenRoadmVersion(anodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
+                return openRoadmInterface121.createOpenRoadmOdu4Interface(anodeId, alogicalConnPoint,
+                    asupportingOtuInterface);
+            case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
+                return openRoadmInterface221.createOpenRoadmOdu4Interface(anodeId, alogicalConnPoint,
+                    asupportingOtuInterface, znodeId, zlogicalConnPoint);
+            default:
+                return null;
+        }
+    }
+
     /**
      * This methods creates an OTU interface on the given termination point.
      *
@@ -136,6 +163,34 @@ public class OpenRoadmInterfaceFactory {
         }
     }
 
+    /**
+     * This methods creates an OTU interface on the given termination point.
+     *
+     * @param anodeId node ID for A side
+     * @param alogicalConnPoint logical connection point for A side
+     * @param asupportOchInterface supporting OCH interface
+     * @param znodeId node ID for the Z side
+     * @param zlogicalConnPoint logical connection point for Z side
+     * @return Name of the interface if successful, otherwise return null.
+     *
+     * @throws OpenRoadmInterfaceException OpenRoadm interface exception
+     */
+
+    public String createOpenRoadmOtu4Interface(String anodeId, String alogicalConnPoint, String asupportOchInterface,
+            String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
+        switch (mappingUtils.getOpenRoadmVersion(anodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
+                return openRoadmInterface121.createOpenRoadmOtu4Interface(anodeId,
+                        alogicalConnPoint, asupportOchInterface);
+            case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
+                return openRoadmInterface221.createOpenRoadmOtu4Interface(anodeId, alogicalConnPoint,
+                        asupportOchInterface, znodeId, zlogicalConnPoint);
+            default:
+                return null;
+        }
+    }
+
     public String createOpenRoadmOchInterfaceName(String logicalConnectionPoint, Long waveNumber) {
         return logicalConnectionPoint + "-" + waveNumber;
     }
index 149d651449ffceab26ecf5dfe1da8442d80a9464..e6ad5ada3bd4f2f37ece37ac0bb49db2ad2d67e4 100644 (file)
@@ -59,8 +59,8 @@ public class OpenRoadmOtnInterface221 {
         }
 
         // Ethernet interface specific data
-        EthernetBuilder ethIfBuilder = new EthernetBuilder();
-        ethIfBuilder.setSpeed(1000L);
+        EthernetBuilder ethIfBuilder = new EthernetBuilder()
+                .setSpeed(1000L);
         InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(
                 portMap, EthernetCsmacd.class,
                 logicalConnPoint + "-ETHERNET1G");
@@ -167,7 +167,8 @@ public class OpenRoadmOtnInterface221 {
             IntStream.range(tribSlotIndex, tribSlotIndex + 8)
                     .forEach(nbr -> tribSlots.add(Uint16.valueOf(nbr)));
             ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
-                    .setTribPortNumber(tribPortNumber).setTribSlots(tribSlots);
+                    .setTribPortNumber(tribPortNumber)
+                    .setTribSlots(tribSlots);
             oduIfBuilder.setOduFunction(ODUCTP.class)
                     .setMonitoringMode(OduAttributes.MonitoringMode.Monitored)
                     .setParentOduAllocation(parentOduAllocationBuilder.build());
@@ -224,7 +225,8 @@ public class OpenRoadmOtnInterface221 {
             tribSlots.add(Uint16.valueOf(tribSlot));
             ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
                     // set trib port numbers
-                    .setTribPortNumber(tribPortNumber).setTribSlots(tribSlots);
+                    .setTribPortNumber(tribPortNumber)
+                    .setTribSlots(tribSlots);
             oduIfBuilder.setOduFunction(ODUCTP.class)
                     .setMonitoringMode(OduAttributes.MonitoringMode.Monitored)
                     .setParentOduAllocation(parentOduAllocationBuilder.build());
@@ -284,7 +286,8 @@ public class OpenRoadmOtnInterface221 {
                     .forEach(nbr -> tribSlots.add(Uint16.valueOf(nbr)));
             ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
                     // set trib port numbers
-                    .setTribPortNumber(tribPortNumber).setTribSlots(tribSlots);
+                    .setTribPortNumber(tribPortNumber)
+                    .setTribSlots(tribSlots);
             oduIfBuilder.setOduFunction(ODUCTP.class)
                     .setMonitoringMode(OduAttributes.MonitoringMode.Monitored)
                     .setParentOduAllocation(parentOduAllocationBuilder.build());
index 91f82770c836786ae7144633706c1e20e615d9b9..04acca17dfd425f5fdf8b1c73e6772a17e400395 100644 (file)
@@ -244,7 +244,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
         self.assertIn(
             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network'},
+             'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network',
+             'lcp-hash-val': '3b3ab304d2a6eb3c3623e52746dbb7aa'},
             res['mapping'])
 
     def test_11_xpdr_portmapping_NETWORK2(self):
@@ -259,7 +260,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
         self.assertIn(
             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/2-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-CLIENT3', 'port-qual': 'xpdr-network'},
+             'connection-map-lcp': 'XPDR1-CLIENT3', 'port-qual': 'xpdr-network',
+             'lcp-hash-val': '3b3ab304d2a6eb3c3623e52746dbb7a9'},
             res['mapping'])
 
     def test_12_xpdr_portmapping_CLIENT1(self):
@@ -275,7 +277,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             {'supporting-port': 'C1',
              'supporting-circuit-pack-name': '1/0/C1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client'},
+             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
+             'lcp-hash-val': '64b8effe7ba72211420bf267d0ca1ae5'},
             res['mapping'])
 
     def test_13_xpdr_portmapping_CLIENT2(self):
@@ -291,7 +294,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             {'supporting-port': 'C2',
              'supporting-circuit-pack-name': '1/0/C2-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT2', 'port-direction': 'bidirectional',
-             'port-qual': 'xpdr-client'},
+             'port-qual': 'xpdr-client',
+             'lcp-hash-val': '64b8effe7ba72211420bf267d0ca1ae6'},
             res['mapping'])
 
     def test_14_xpdr_portmapping_CLIENT3(self):
@@ -308,7 +312,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              'supporting-circuit-pack-name': '1/0/C3-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT3',
              'connection-map-lcp': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
-             'port-qual': 'xpdr-client'},
+             'port-qual': 'xpdr-client' , 'lcp-hash-val': '64b8effe7ba72211420bf267d0ca1ae7'},
             res['mapping'])
 
     def test_15_xpdr_portmapping_CLIENT4(self):
@@ -324,7 +328,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             {'supporting-port': 'C4',
              'supporting-circuit-pack-name': '1/0/C4-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT4', 'port-direction': 'bidirectional',
-             'port-qual': 'xpdr-client'},
+             'port-qual': 'xpdr-client' , 'lcp-hash-val': '64b8effe7ba72211420bf267d0ca1ae0'},
             res['mapping'])
 
     def test_16_xpdr_device_disconnected(self):
index 9533a64f350737a90625d7524285b9b55b145bd1..46b957419591c339e1cad6f5b0a1b14a58603357 100644 (file)
@@ -136,16 +136,18 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
         self.assertIn(
-            {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
-             'logical-connection-point': 'XPDR1-NETWORK1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network'},
-            res['nodes'][0]['mapping'])
+             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
+              'logical-connection-point': 'XPDR1-NETWORK1', 'port-direction': 'bidirectional',
+              'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network',
+              'lcp-hash-val': '3b3ab304d2a6eb3c3623e52746dbb7aa'},
+             res['nodes'][0]['mapping'])
         self.assertIn(
-            {'supporting-port': 'C1',
-             'supporting-circuit-pack-name': '1/0/C1-PLUG-CLIENT',
-             'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client'},
-            res['nodes'][0]['mapping'])
+             {'supporting-port': 'C1',
+              'supporting-circuit-pack-name': '1/0/C1-PLUG-CLIENT',
+              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
+              'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
+              'lcp-hash-val': '64b8effe7ba72211420bf267d0ca1ae5'},
+             res['nodes'][0]['mapping'])
 
     def test_05_service_path_create(self):
         url = "{}/operations/transportpce-device-renderer:service-path".format(self.restconf_baseurl)
index cfd90383010295a8e6a6e0eef401baa1e4be68d3..0ca2613b3e2c565b868a7c07ba7a5694a04b8584 100644 (file)
@@ -22,6 +22,10 @@ import logging
 import test_utils
 
 
+def extract_a_from_b(a, b):
+    return dict([(i, b[i]) for i in b.keys() if i in a.keys()])
+
+
 class TransportPCEtesting(unittest.TestCase):
 
     honeynode_process1 = None
@@ -100,8 +104,10 @@ class TransportPCEtesting(unittest.TestCase):
                 'org-openroadm-port-types:if-10GE'],
              'supporting-port': 'CP1-SFP4-P1',
              'supporting-circuit-pack-name': 'CP1-SFP4',
-             'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
-             'port-qual': 'xpdr-client'},
+             'logical-connection-point': 'XPDR1-CLIENT1',
+              'port-direction': 'bidirectional',
+             'port-qual': 'xpdr-client',
+              'lcp-hash-val': '8b3efff522736722500b5e68fb6e696e'},
             res['mapping'])
 
     def test_03_get_portmapping_NETWORK1(self):
@@ -122,7 +128,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "port-direction": "bidirectional",
                 "port-qual": "xpdr-network",
                 "supporting-circuit-pack-name": "CP1-CFP0",
-                "xponder-type": "mpdr"},
+                "xponder-type": "mpdr",
+             'lcp-hash-val': '1021db8d2affe7386705c438c67ea21f'},
             res['mapping'])
 
     def test_04_service_path_create_OCH_OTU4(self):
@@ -167,7 +174,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "port-direction": "bidirectional",
                 "port-qual": "xpdr-network",
                 "supporting-circuit-pack-name": "CP1-CFP0",
-                "xponder-type": "mpdr"},
+                "xponder-type": "mpdr",
+                "lcp-hash-val": "1021db8d2affe7386705c438c67ea21f"},
             res['mapping'])
 
     def test_06_check_interface_och(self):
@@ -180,10 +188,24 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+
+        input_dict = {'name': 'XPDR1-NETWORK1-1',
+                      'administrative-state': 'inService',
+                      'supporting-circuit-pack-name': 'CP1-CFP0',
+                      'type': 'org-openroadm-interfaces:opticalChannel',
+                      'supporting-port': 'CP1-CFP0-P1'
+                      }
+        # assertDictContainsSubset is deprecated
+        '''
         self.assertDictContainsSubset({'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])
+        '''
+        self.assertDictEqual(input_dict,
+                             extract_a_from_b(input_dict,
+                                  res['interface'][0])
+                             )
         self.assertDictEqual(
             {u'frequency': 196.1, u'rate': u'org-openroadm-common-types:R100G',
              u'transmit-power': -5},
@@ -199,10 +221,24 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+        input_dict = {'name': 'XPDR1-NETWORK1-OTU',
+                      'administrative-state': 'inService',
+                      'supporting-circuit-pack-name': 'CP1-CFP0',
+                      'supporting-interface': 'XPDR1-NETWORK1-1',
+                      'type': 'org-openroadm-interfaces:otnOtu',
+                      'supporting-port': 'CP1-CFP0-P1'}
+
+        # assertDictContainsSubset is deprecated
+        '''
         self.assertDictContainsSubset({'name': 'XPDR1-NETWORK1-OTU', 'administrative-state': 'inService',
                                        'supporting-circuit-pack-name': 'CP1-CFP0', 'supporting-interface': 'XPDR1-NETWORK1-1',
                                        'type': 'org-openroadm-interfaces:otnOtu',
                                        'supporting-port': 'CP1-CFP0-P1'}, res['interface'][0])
+        '''
+        self.assertDictEqual(input_dict, extract_a_from_b(input_dict,
+                                                          res['interface'][0])
+                             )
+
         self.assertDictEqual(
             {u'rate': u'org-openroadm-otn-common-types:OTU4',
              u'fec': u'scfec'},
@@ -250,7 +286,9 @@ class TransportPCEtesting(unittest.TestCase):
             "port-qual": "xpdr-network",
             "supporting-circuit-pack-name": "CP1-CFP0",
             "xponder-type": "mpdr",
-            "supporting-odu4": "XPDR1-NETWORK1-ODU4"},
+            "supporting-odu4": "XPDR1-NETWORK1-ODU4",
+             "lcp-hash-val": "1021db8d2affe7386705c438c67ea21f"
+             },
             res['mapping'])
 
     def test_10_check_interface_ODU4(self):
@@ -263,6 +301,23 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4', 'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': 'CP1-CFP0', 'supporting-interface': 'XPDR1-NETWORK1-OTU',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'CP1-CFP0-P1'}
+        input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
+                        'rate': 'org-openroadm-otn-common-types:ODU4'}
+
+        self.assertDictEqual(input_dict_1, extract_a_from_b(input_dict_1,
+                                                            res['interface'][0])
+                             )
+        self.assertDictEqual(input_dict_2,
+                             extract_a_from_b(input_dict_2,
+                                              res['interface'][0][
+                                                'org-openroadm-otn-odu-interfaces:odu'])
+
+                             )
+        '''
         self.assertDictContainsSubset({'name': 'XPDR1-NETWORK1-ODU4', 'administrative-state': 'inService',
                                        'supporting-circuit-pack-name': 'CP1-CFP0', 'supporting-interface': 'XPDR1-NETWORK1-OTU',
                                        'type': 'org-openroadm-interfaces:otnOdu',
@@ -271,6 +326,7 @@ class TransportPCEtesting(unittest.TestCase):
             {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
              'rate': 'org-openroadm-otn-common-types:ODU4'},
             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        '''
         self.assertDictEqual(
             {u'payload-type': u'21', u'exp-payload-type': u'21'},
             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
@@ -314,10 +370,22 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+        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.assertDictContainsSubset({'name': 'XPDR1-CLIENT1-ETHERNET10G', 'administrative-state': 'inService',
                                        'supporting-circuit-pack-name': 'CP1-SFP4',
                                        'type': 'org-openroadm-interfaces:ethernetCsmacd',
                                        'supporting-port': 'CP1-SFP4-P1'}, res['interface'][0])
+        '''
+        self.assertDictEqual(input_dict, extract_a_from_b(input_dict,
+                                                          res['interface'][0])
+                             )
         self.assertDictEqual(
             {u'speed': 10000},
             res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
@@ -332,6 +400,27 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e-service1',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': 'CP1-SFP4',
+                        'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'CP1-SFP4-P1'}
+        input_dict_2 = {
+          'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
+          'rate': 'org-openroadm-otn-common-types:ODU2e',
+          'monitoring-mode': 'terminated'}
+
+        self.assertDictEqual(input_dict_1, extract_a_from_b(input_dict_1,
+                                                          res['interface'][0])
+                             )
+        self.assertDictEqual(input_dict_2,
+                             extract_a_from_b(input_dict_2, res['interface'][0][
+                               'org-openroadm-otn-odu-interfaces:odu'])
+                             )
+
+        '''
         self.assertDictContainsSubset({'name': 'XPDR1-CLIENT1-ODU2e-service1', 'administrative-state': 'inService',
                                        'supporting-circuit-pack-name': 'CP1-SFP4',
                                        'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -341,6 +430,7 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'terminated'}, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        '''
         self.assertDictEqual(
             {u'payload-type': u'03', u'exp-payload-type': u'03'},
             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
@@ -355,6 +445,35 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-service1', 'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': 'CP1-CFP0',
+                        'supporting-interface': 'XPDR1-NETWORK1-ODU4',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'CP1-CFP0-P1'}
+        input_dict_2 = {
+          '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(input_dict_1, extract_a_from_b(input_dict_1,
+                                                            res['interface'][0])
+                             )
+
+        self.assertDictEqual(input_dict_2,
+                             extract_a_from_b(input_dict_2,
+                                              res['interface'][0][
+                                                'org-openroadm-otn-odu-interfaces:odu']
+                                              ))
+
+        self.assertDictEqual(input_dict_3,
+                             extract_a_from_b(input_dict_3,
+                                              res['interface'][0][
+                                                'org-openroadm-otn-odu-interfaces:odu'][
+                                                'parent-odu-allocation']))
+
+        '''
         self.assertDictContainsSubset({'name': 'XPDR1-NETWORK1-ODU2e-service1', 'administrative-state': 'inService',
                                        'supporting-circuit-pack-name': 'CP1-CFP0',
                                        'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -367,8 +486,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertDictContainsSubset(
             {'trib-port-number': 1},
             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        '''
         self.assertIn(1,
-                      res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']['trib-slots'])
+                      res['interface'][0][
+                        'org-openroadm-otn-odu-interfaces:odu'][
+                        'parent-odu-allocation']['trib-slots'])
 
     def test_15_check_ODU2E_connection(self):
         url = ("{}/config/network-topology:network-topology/topology/topology-netconf/"
@@ -380,10 +502,21 @@ class TransportPCEtesting(unittest.TestCase):
             "GET", url, headers=headers, auth=('admin', 'admin'))
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
+        input_dict_1 = {
+          'connection-name':
+            'XPDR1-CLIENT1-ODU2e-service1-x-XPDR1-NETWORK1-ODU2e-service1',
+          'direction': 'bidirectional'
+        }
+
+        self.assertDictEqual(input_dict_1,
+                             extract_a_from_b(input_dict_1,
+                                              res['odu-connection'][0]))
+        '''
         self.assertDictContainsSubset({
             'connection-name': 'XPDR1-CLIENT1-ODU2e-service1-x-XPDR1-NETWORK1-ODU2e-service1',
             'direction': 'bidirectional'},
             res['odu-connection'][0])
+        '''
         self.assertDictEqual({u'dst-if': u'XPDR1-NETWORK1-ODU2e-service1'},
                              res['odu-connection'][0]['destination'])
         self.assertDictEqual({u'src-if': u'XPDR1-CLIENT1-ODU2e-service1'},
index 034da46781ad91701a62164efb2b480c265538cd..99ed92574ecc6a1dc06df1b772904f70d18df0f4 100644 (file)
@@ -239,7 +239,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-network',
-             'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1'},
+             'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1',
+             'lcp-hash-val': '8e128ba57560403cfd4ffafae38cd941'},
             res['mapping'])
 
     def test_12_xpdr_portmapping_NETWORK2(self):
@@ -255,7 +256,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/2-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-CLIENT2', 'port-qual': 'xpdr-network'},
+             'connection-map-lcp': 'XPDR1-CLIENT2', 'port-qual': 'xpdr-network',
+             'lcp-hash-val': '8e128ba57560403cfd4ffafae38cd942'},
             res['mapping'])
 
     def test_13_xpdr_portmapping_CLIENT1(self):
@@ -272,7 +274,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              'supporting-port': 'C1',
              'supporting-circuit-pack-name': '1/0/1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client'},
+             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
+             'lcp-hash-val': '3ed8ed1336784ac7c2f66c22f2f03d8'},
             res['mapping'])
 
     def test_14_xpdr_portmapping_CLIENT2(self):
@@ -289,7 +292,8 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              'supporting-port': 'C1',
              'supporting-circuit-pack-name': '1/0/2-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT2', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-NETWORK2', 'port-qual': 'xpdr-client'},
+             'connection-map-lcp': 'XPDR1-NETWORK2', 'port-qual': 'xpdr-client',
+             'lcp-hash-val': '3ed8ed1336784ac7c2f66c22f2f03db'},
             res['mapping'])
 
     def test_15_xpdr_device_disconnected(self):
index 30b9dff45f42ab66f58a0af5022580d6603114ce..cfd6de4d60b73270b30300ff01206f97b6b85a9d 100644 (file)
@@ -87,7 +87,9 @@ class TransportPCERendererTesting(unittest.TestCase):
         response = requests.request(
             "PUT", url, data=json.dumps(data), headers=headers,
             auth=('admin', 'admin'))
-        self.assertEqual(response.status_code, requests.codes.created)
+        self.assertIn(response.status_code, [requests.codes.created,
+                                             requests.codes.ok])
+        # self.assertEqual(response.status_code, requests.codes.created)
         time.sleep(20)
 
     def test_02_xpdr_device_connected(self):
@@ -106,7 +108,9 @@ class TransportPCERendererTesting(unittest.TestCase):
         response = requests.request(
             "PUT", url, data=json.dumps(data), headers=headers,
             auth=('admin', 'admin'))
-        self.assertEqual(response.status_code, requests.codes.created)
+        # self.assertEqual(response.status_code, requests.codes.created)
+        self.assertIn(response.status_code, [requests.codes.created,
+                                             requests.codes.ok])
         time.sleep(20)
 
     def test_03_rdm_portmapping(self):
@@ -140,14 +144,16 @@ class TransportPCERendererTesting(unittest.TestCase):
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-network',
-             'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1'},
+             'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1',
+             'lcp-hash-val': '8e128ba57560403cfd4ffafae38cd941'},
             res['nodes'][0]['mapping'])
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-100GE'],
              'supporting-port': 'C1',
              'supporting-circuit-pack-name': '1/0/1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
-             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client'},
+             'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
+             'lcp-hash-val': '3ed8ed1336784ac7c2f66c22f2f03d8'},
             res['nodes'][0]['mapping'])
 
     def test_05_service_path_create(self):