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;
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;
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);
} 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());
}
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);
+ }
}
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;
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) {
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());
}
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);
+ }
}
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;
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;
private FixedFlexInterface fixedFlex;
private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface221.class);
+
public OpenRoadmInterface221(PortMapping portMapping, OpenRoadmInterfaces openRoadmInterfaces,
FixedFlexInterface fixedFlex) {
this.portMapping = portMapping;
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");
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
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;
}
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"))
}
}
+ /**
+ * 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.
*
}
}
+ /**
+ * 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;
}
}
// 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");
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());
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());
.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());
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):
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):
{'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):
{'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):
'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):
{'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):
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)
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
'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):
"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):
"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):
"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},
"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'},
"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):
"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',
{'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'])
"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'])
"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',
'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'])
"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',
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/"
"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'},
{'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):
{'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):
'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):
'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):
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):
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):
{'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):