From: Balagangadhar Bathula Date: Wed, 22 Jan 2020 19:25:42 +0000 (-0500) Subject: Adding SAPI/DAPI to Renderer X-Git-Tag: 2.0.0~142 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=transportpce.git;a=commitdiff_plain;h=2fb3efccb6a5f65056111c952eddf15ca30af35a Adding SAPI/DAPI to Renderer - 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 Co-authored-by: Guillaume Lambert Change-Id: Iefb56ec9e2bcf99c120143e2816a0653c48be248 Signed-off-by: guillaume.lambert --- diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java index 5f08e5716..d006ea737 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java @@ -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); + } } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java index e84eefbe4..f2267ce7b 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java @@ -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); + } } diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java index f2e8bcb8a..11a781185 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java @@ -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")) diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java index 0b7b5b9cd..9f85cc8d6 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java @@ -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; } diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java index 149d65144..e6ad5ada3 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java @@ -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()); diff --git a/tests/transportpce_tests/1.2.1/test_portmapping.py b/tests/transportpce_tests/1.2.1/test_portmapping.py index 91f82770c..04acca17d 100644 --- a/tests/transportpce_tests/1.2.1/test_portmapping.py +++ b/tests/transportpce_tests/1.2.1/test_portmapping.py @@ -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): diff --git a/tests/transportpce_tests/1.2.1/test_renderer_service_path_nominal.py b/tests/transportpce_tests/1.2.1/test_renderer_service_path_nominal.py index 9533a64f3..46b957419 100644 --- a/tests/transportpce_tests/1.2.1/test_renderer_service_path_nominal.py +++ b/tests/transportpce_tests/1.2.1/test_renderer_service_path_nominal.py @@ -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) diff --git a/tests/transportpce_tests/2.2.1/test_otn_renderer.py b/tests/transportpce_tests/2.2.1/test_otn_renderer.py index cfd903830..0ca2613b3 100644 --- a/tests/transportpce_tests/2.2.1/test_otn_renderer.py +++ b/tests/transportpce_tests/2.2.1/test_otn_renderer.py @@ -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'}, diff --git a/tests/transportpce_tests/2.2.1/test_portmapping.py b/tests/transportpce_tests/2.2.1/test_portmapping.py index 034da4678..99ed92574 100644 --- a/tests/transportpce_tests/2.2.1/test_portmapping.py +++ b/tests/transportpce_tests/2.2.1/test_portmapping.py @@ -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): diff --git a/tests/transportpce_tests/2.2.1/test_renderer_service_path_nominal.py b/tests/transportpce_tests/2.2.1/test_renderer_service_path_nominal.py index 30b9dff45..cfd6de4d6 100644 --- a/tests/transportpce_tests/2.2.1/test_renderer_service_path_nominal.py +++ b/tests/transportpce_tests/2.2.1/test_renderer_service_path_nominal.py @@ -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):