From e6bff36d0f17d336ae7fef5164b63a764fcc8b2e Mon Sep 17 00:00:00 2001 From: Balagangadhar Bathula Date: Wed, 19 Jan 2022 15:52:24 -0500 Subject: [PATCH] Device renderer support for 100G on 7.1 models - Support If-OCH-OTU4-ODU4 service on 7.1 models - Enable 7.1 device renderer to create OCH, OTU4, and ODU4, Ethernet-100G interfaces - Create and delete the interfaces accordingly. JIRA: TRNSPRTPCE-498 Change-Id: I5054f12972ef259db9ac2bc2cd29f25be3a7abf4 --- .../common/mapping/PortMappingVersion710.java | 4 +- .../OpenRoadmInterface710.java | 506 +++++++++++++----- .../OpenRoadmInterfaceFactory.java | 17 +- .../DeviceRendererServiceImpl.java | 5 +- 4 files changed, 379 insertions(+), 153 deletions(-) diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java index c6fc82c0e..e3809e81c 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java @@ -965,7 +965,7 @@ public class PortMappingVersion710 { String interfaceName = interfaces.getInterfaceName(); if (interfaceType.equals(OtnOtu.class) && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1) - .equals("OTU"))) { + .equals("OTU4"))) { mpBldr.setSupportingOtu4(interfaces.getInterfaceName()); } if ((interfaceType.equals(OtnOtu.class)) @@ -975,7 +975,7 @@ public class PortMappingVersion710 { } if (interfaceType.equals(OtnOdu.class) && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1) - .equals("ODU"))) { + .equals("ODU4"))) { mpBldr.setSupportingOdu4(interfaces.getInterfaceName()); } if ((interfaceType.equals(OtnOdu.class)) diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java index 546fcc4e6..8e9a39d64 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java @@ -34,11 +34,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.ty import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyTHz; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.ModulationFormat; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.ProvisionModeType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R100G; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R200GOtsi; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R300GOtsi; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R400GOtsi; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Ofec; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Rsfec; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Scfec; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates; @@ -46,18 +48,22 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev20 import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev200529.ethernet.container.EthernetBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.EthernetCsmacd; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.InterfaceType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OpticalChannel; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtnOdu; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtnOtu; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.Otsi; import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtsiGroup; import org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.loopback.rev191129.maint.loopback.MaintLoopbackBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529.och.container.OchBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.otsi.attributes.FlexoBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.otsi.container.OtsiBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCn; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTP; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTPCTP; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUflexCbr; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUflexCbr400G; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OTU4; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OTUCn; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.PayloadTypeDef; @@ -66,6 +72,9 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.opu.OpuBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.otu.container.OtuBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.otsi.group.interfaces.rev200529.otsi.group.container.OtsiGroupBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If100GE; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.common.Uint8; @@ -103,14 +112,19 @@ public class OpenRoadmInterface710 { throw new OpenRoadmInterfaceException( String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); } - // Ethernet interface specific data EthernetBuilder ethIfBuilder = new EthernetBuilder() .setFec(Rsfec.class) + // Default set to 400G .setSpeed(Uint32.valueOf(400000)); + // We have to differentiate if-100GE vs if-400GE + if (portMap.getSupportedInterfaceCapability().contains(If100GE.class)) { + ethIfBuilder.setSpeed(Uint32.valueOf(100000)); + } InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.class, logicalConnPoint + "-ETHERNET"); + // Create Interface1 type object required for adding as augmentation Interface1Builder ethIf1Builder = new Interface1Builder(); ethInterfaceBldr.addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build()).build()); @@ -124,6 +138,49 @@ public class OpenRoadmInterface710 { return ethInterfaceBldr.getName(); } + public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint, + SpectrumInformation spectrumInformation) + throws OpenRoadmInterfaceException { + + ModulationFormat modulationFormat = ModulationFormat.DpQpsk; + Optional optionalModulationFormat = ModulationFormat + .forName(spectrumInformation.getModulationFormat()); + if (optionalModulationFormat.isPresent()) { + modulationFormat = optionalModulationFormat.get(); + } + // OCH interface specific data + OchBuilder ocIfBuilder = new OchBuilder() + .setFrequency(new FrequencyTHz(spectrumInformation.getCenterFrequency())) + .setRate(R100G.class) + .setTransmitPower(new PowerDBm(new BigDecimal("-5"))) + .setModulationFormat(modulationFormat); + Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s", + nodeId, logicalConnPoint)); + } + // Create generic interface + InterfaceBuilder + ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class, + spectrumInformation.getIdentifierFromParams(logicalConnPoint)); + // 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.optical.channel.interfaces.rev200529.Interface1Builder + ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529 + .Interface1Builder(); + ochInterfaceBldr.addAugmentation(ochIf1Builder.setOch(ocIfBuilder.build()).build()); + + // Post interface on the device + openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr); + + // Post the equipment-state change on the device circuit-pack if xpdr node + if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) { + this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true); + } + + return ochInterfaceBldr.getName(); + } public String createOpenRoadmOtsiInterface(String nodeId, String logicalConnPoint, SpectrumInformation spectrumInformation) @@ -296,6 +353,76 @@ public class OpenRoadmInterface710 { return otsiGroupInterfaceBldr.getName(); } + public String createOpenRoadmOchOtsiOtsigroupInterface(String nodeId, String logicalConnPoint, + SpectrumInformation spectrumInformation) + throws OpenRoadmInterfaceException { + Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); + } + String interfaceOchOtsiOtsigroup = null; + if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) { + // create OCH interface + interfaceOchOtsiOtsigroup = createOpenRoadmOchInterface(nodeId, logicalConnPoint, spectrumInformation); + } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) { + // Create OTSi and OTSi-group + String interfaceOtsiName = createOpenRoadmOtsiInterface(nodeId, logicalConnPoint, spectrumInformation); + interfaceOchOtsiOtsigroup = createOpenRoadmOtsiGroupInterface(nodeId, logicalConnPoint, interfaceOtsiName, + spectrumInformation); + } + + return interfaceOchOtsiOtsigroup; + } + + public String createOpenRoadmOtu4Interface(String nodeId, String logicalConnPoint, String supportOchInterface, + AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException { + + Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint); + if (mapping == null) { + throw new OpenRoadmInterfaceException( + String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); + } + InterfaceBuilder + otuInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOtu.class, + logicalConnPoint + "-OTU4"); + // Supporting interface list + List listSupportingOChInterface = new ArrayList<>(); + listSupportingOChInterface.add(supportOchInterface); + otuInterfaceBldr.setSupportingInterfaceList(listSupportingOChInterface); + + // OTU interface specific data + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.otu.container.OtuBuilder + otuIfBuilder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu + .interfaces.rev200529.otu.container.OtuBuilder() + .setFec(Scfec.class) + .setRate(OTU4.class); + if (apiInfoA != null) { + otuIfBuilder.setTxSapi(apiInfoA.getSapi()) + .setTxDapi(apiInfoA.getDapi()) + .setExpectedSapi(apiInfoA.getExpectedSapi()) + .setExpectedDapi(apiInfoA.getExpectedDapi()); + } + if (apiInfoZ != null) { + otuIfBuilder.setTxSapi(apiInfoZ.getSapi()) + .setTxDapi(apiInfoZ.getDapi()) + .setExpectedSapi(apiInfoZ.getExpectedSapi()) + .setExpectedDapi(apiInfoZ.getExpectedDapi()); + } + + // 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.otu.interfaces.rev200529.Interface1Builder otuIf1Builder = + new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder(); + otuInterfaceBldr.addAugmentation(otuIf1Builder.setOtu(otuIfBuilder.build()).build()); + + // Post interface on the device + openRoadmInterfaces.postInterface(nodeId, otuInterfaceBldr); + this.portMapping.updateMapping(nodeId, mapping); + return otuInterfaceBldr.getName(); + } + + public String createOpenRoadmOtucnInterface(String nodeId, String logicalConnPoint, String supportingOtsiGroupInterface, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException { @@ -378,6 +505,85 @@ public class OpenRoadmInterface710 { return otuInterfaceBuilder.getName(); } + public String createOpenRoadmOtu4OtucnInterface(String nodeId, String logicalConnPoint, + String supportingInterface, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) + throws OpenRoadmInterfaceException { + Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); + } + // Depending on OCH-OTU4-ODU4 interface or OTSi-OTSi-group, supporting interface should + // reflect that + String interfaceOtu4Otucn = null; + if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) { + // create OTU4 interface + interfaceOtu4Otucn = createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportingInterface, + apiInfoA, apiInfoZ); + } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) { + // Create OTUCn + interfaceOtu4Otucn = createOpenRoadmOtucnInterface(nodeId, logicalConnPoint, supportingInterface, + apiInfoA, apiInfoZ); + } + + return interfaceOtu4Otucn; + } + + public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint, + AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException { + + Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint); + if (mapping == null) { + throw new OpenRoadmInterfaceException( + String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); + } + InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class, + logicalConnPoint + "-ODU4"); + List listSupportingOtu4Interface = new ArrayList<>(); + if (mapping.getSupportingOtu4() != null) { + listSupportingOtu4Interface.add(mapping.getSupportingOtu4()); + oduInterfaceBldr.setSupportingInterfaceList(listSupportingOtu4Interface); + } + + // OPU payload + OpuBuilder opuBuilder = new OpuBuilder() + .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07")) + .setPayloadType(PayloadTypeDef.getDefaultInstance("07")); + + // Create an ODU4 object + OduBuilder oduBuilder = new OduBuilder() + .setRate(ODU4.class) + .setOduFunction(ODUTTP.class) + .setMonitoringMode(MonitoringMode.Terminated) + .setOpu(opuBuilder.build()); + + if (apiInfoA != null) { + oduBuilder.setTxSapi(apiInfoA.getSapi()) + .setTxDapi(apiInfoA.getDapi()) + .setExpectedSapi(apiInfoA.getExpectedSapi()) + .setExpectedDapi(apiInfoA.getExpectedDapi()); + } + if (apiInfoZ != null) { + oduBuilder.setTxSapi(apiInfoZ.getSapi()) + .setTxDapi(apiInfoZ.getDapi()) + .setExpectedSapi(apiInfoZ.getExpectedSapi()) + .setExpectedDapi(apiInfoZ.getExpectedDapi()); + } + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder = + new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder(); + + oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build()); + + // Post interface on the device + openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr); + // Since this is not a CTP, we can update the port-mapping + LOG.info("{}-{} updating mapping with interface {}", nodeId, logicalConnPoint, oduInterfaceBldr.getName()); + this.portMapping.updateMapping(nodeId, mapping); + + return oduInterfaceBldr.getName(); + } + + public String createOpenRoadmOducnInterface(String nodeId, String logicalConnPoint) throws OpenRoadmInterfaceException { Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint); @@ -446,10 +652,11 @@ public class OpenRoadmInterface710 { return oduInterfaceBuilder.getName(); } + // Overloaded methods should be together // With SAPI and DAPI information public String createOpenRoadmOducnInterface(String anodeId, String alogicalConnPoint, - String supportingOtucn, String znodeId, String zlogicalConnPoint) - throws OpenRoadmInterfaceException { + String supportingOtucn, String znodeId, String zlogicalConnPoint) + throws OpenRoadmInterfaceException { Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint); Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint); if (portMapA == null) { @@ -521,8 +728,10 @@ public class OpenRoadmInterface710 { return oduInterfaceBuilder.getName(); } - public String createOpenRoadmOtnOducnInterface(String nodeId, String logicalConnPoint, - String supportingOtucn) + + // This is only for transponder + public String createOpenRoadmOduflexInterface(String nodeId, String logicalConnPoint, + String supportingOducn) throws OpenRoadmInterfaceException { Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); if (portMap == null) { @@ -530,63 +739,64 @@ public class OpenRoadmInterface710 { String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); } - // Create ODUcn object - // Start with OPU object // OPU payload OpuBuilder opuBuilder = new OpuBuilder() - .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22")) - .setPayloadType(PayloadTypeDef.getDefaultInstance("22")); + .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32")) + .setPayloadType(PayloadTypeDef.getDefaultInstance("32")); - // Create an ODUC4 object + // Parent Odu-allocation + // Set the trib-slot array + List tribslots = new ArrayList<>(); + IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add( + OpucnTribSlotDef.getDefaultInstance(a + "." + b)))); + + ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() + .setTribPortNumber(Uint16.valueOf(1)) + .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build()); + + // Create an ODUFlex object OduBuilder oduBuilder = new OduBuilder() - .setRate(ODUCn.class) - .setOduFunction(ODUTTP.class) + .setRate(ODUflexCbr.class) + .setOduflexCbrService(ODUflexCbr400G.class) + .setOduFunction(ODUTTPCTP.class) .setMonitoringMode(MonitoringMode.Terminated) .setTimActEnabled(false) .setTimDetectMode(TimDetectMode.Disabled) .setDegmIntervals(Uint8.valueOf(2)) .setDegthrPercentage(Uint16.valueOf(100)) - .setOpu(opuBuilder.build()); - - // Set the ODUCn rate from OTUCn interface naming convention - String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1); + .setOpu(opuBuilder.build()) + .setParentOduAllocation(parentOduAllocationBuilder.build()); - // check if the oducnrate is a valid value and if it is invalid, then throw error - if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) { - throw new OpenRoadmInterfaceException( - String.format(RATE_EXCEPTION_MESSAGE)); - } + InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class, + logicalConnPoint + "-ODUFLEX"); - oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate)); + List listSupportingOtucnInterface = new ArrayList<>(); + listSupportingOtucnInterface.add(supportingOducn); - InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class, - logicalConnPoint + ODUC + oducnrate); + oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); - // Create a list - List listSupportingOtucnInterface = new ArrayList<>(); - listSupportingOtucnInterface.add(supportingOtucn); - oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder = + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder + oduflexIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder(); - oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build()); + oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build()); // Post interface on the device - openRoadmInterfaces.postInterface(nodeId, oduInterfaceBuilder); + openRoadmInterfaces.postInterface(nodeId, oduflexInterfaceBuilder); + // Post the equipment-state change on the device circuit-pack if xpdr node if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) { this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true); } - // Update the port-mapping with the interface information - this.portMapping.updateMapping(nodeId, portMap); - return oduInterfaceBuilder.getName(); - } + return oduflexInterfaceBuilder.getName(); + } - // With SAPI and DAPI information - public String createOpenRoadmOtnOducnInterface(String anodeId, String alogicalConnPoint, - String supportingOtucn, String znodeId, String zlogicalConnPoint) + // Overloaded methods should be together + // This is only for transponder; with SAPI/DAPI information + public String createOpenRoadmOduflexInterface(String anodeId, String alogicalConnPoint, + String supportingOducn, String znodeId, String zlogicalConnPoint) throws OpenRoadmInterfaceException { Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint); Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint); @@ -602,131 +812,154 @@ public class OpenRoadmInterface710 { znodeId, zlogicalConnPoint)); } - // Create ODUcn object - // Start with OPU object // OPU payload OpuBuilder opuBuilder = new OpuBuilder() - .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22")) - .setPayloadType(PayloadTypeDef.getDefaultInstance("22")); + .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32")) + .setPayloadType(PayloadTypeDef.getDefaultInstance("32")); - // Create an ODUCn object + // Parent Odu-allocation + // Set the trib-slot array + List tribslots = new ArrayList<>(); + IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add( + OpucnTribSlotDef.getDefaultInstance(a + "." + b)))); + + ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() + .setTribPortNumber(Uint16.valueOf(1)) + .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build()); + + // Create an ODUFlex object OduBuilder oduBuilder = new OduBuilder() - .setRate(ODUCn.class) - .setOduFunction(ODUTTP.class) + .setRate(ODUflexCbr.class) + .setOduflexCbrService(ODUflexCbr400G.class) + .setOduFunction(ODUTTPCTP.class) .setMonitoringMode(MonitoringMode.Terminated) .setTimActEnabled(false) .setTimDetectMode(TimDetectMode.Disabled) .setDegmIntervals(Uint8.valueOf(2)) .setDegthrPercentage(Uint16.valueOf(100)) - .setOpu(opuBuilder.build()) .setTxSapi(portMapA.getLcpHashVal()) .setTxDapi(portMapZ.getLcpHashVal()) .setExpectedSapi(portMapZ.getLcpHashVal()) - .setExpectedDapi(portMapZ.getLcpHashVal()); - - // Set the ODUCn rate from OTUCn interface naming convention - String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1); + .setExpectedDapi(portMapA.getLcpHashVal()) + .setOpu(opuBuilder.build()) + .setParentOduAllocation(parentOduAllocationBuilder.build()); - // check if the oducnrate is a valid value and if it is invalid, then throw error - if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) { - throw new OpenRoadmInterfaceException( - String.format(RATE_EXCEPTION_MESSAGE)); - } + InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class, + alogicalConnPoint + "-ODUFLEX"); - oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate)); + List listSupportingOtucnInterface = new ArrayList<>(); + listSupportingOtucnInterface.add(supportingOducn); - InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class, - alogicalConnPoint + ODUC + oducnrate); + oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); - // Create a list - List listSupportingOtucnInterface = new ArrayList<>(); - listSupportingOtucnInterface.add(supportingOtucn); - oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder = + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder + oduflexIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder(); - oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build()); + oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build()); // Post interface on the device - openRoadmInterfaces.postInterface(anodeId, oduInterfaceBuilder); + openRoadmInterfaces.postInterface(anodeId, oduflexInterfaceBuilder); + // Post the equipment-state change on the device circuit-pack if xpdr node if (portMapA.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) { this.openRoadmInterfaces.postEquipmentState(anodeId, portMapA.getSupportingCircuitPackName(), true); } - // Update the port-mapping with the interface information - this.portMapping.updateMapping(anodeId, portMapA); - return oduInterfaceBuilder.getName(); + + return oduflexInterfaceBuilder.getName(); } - // This is only for transponder - public String createOpenRoadmOduflexInterface(String nodeId, String logicalConnPoint, - String supportingOducn) - throws OpenRoadmInterfaceException { + public String createOpenRoadmOdu4OducnOduflex(String nodeId, String logicalConnPoint, + AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException { + + Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); + if (portMap == null) { + throw new OpenRoadmInterfaceException( + String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); + } + // Depending on OTU4 or OTUCn, supporting interface should + // reflect that + String interfaceOdu4Oducn = null; + if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) { + // create OTU4 interface + interfaceOdu4Oducn = createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, apiInfoA, apiInfoZ); + } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) { + // Create ODUCn and ODUFlex interface. + String interfaceOducn = createOpenRoadmOducnInterface(nodeId, logicalConnPoint); + interfaceOdu4Oducn = createOpenRoadmOduflexInterface(nodeId, logicalConnPoint, interfaceOducn); + } + + return interfaceOdu4Oducn; + } + + public String createOpenRoadmOtnOducnInterface(String nodeId, String logicalConnPoint, + String supportingOtucn) + throws OpenRoadmInterfaceException { Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint); if (portMap == null) { throw new OpenRoadmInterfaceException( String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint)); } + // Create ODUcn object + // Start with OPU object // OPU payload OpuBuilder opuBuilder = new OpuBuilder() - .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32")) - .setPayloadType(PayloadTypeDef.getDefaultInstance("32")); - - // Parent Odu-allocation - // Set the trib-slot array - List tribslots = new ArrayList<>(); - IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add( - OpucnTribSlotDef.getDefaultInstance(a + "." + b)))); - - ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() - .setTribPortNumber(Uint16.valueOf(1)) - .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build()); + .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22")) + .setPayloadType(PayloadTypeDef.getDefaultInstance("22")); - // Create an ODUFlex object + // Create an ODUC4 object OduBuilder oduBuilder = new OduBuilder() - .setRate(ODUflexCbr.class) - .setOduflexCbrService(ODUflexCbr400G.class) - .setOduFunction(ODUTTPCTP.class) + .setRate(ODUCn.class) + .setOduFunction(ODUTTP.class) .setMonitoringMode(MonitoringMode.Terminated) .setTimActEnabled(false) .setTimDetectMode(TimDetectMode.Disabled) .setDegmIntervals(Uint8.valueOf(2)) .setDegthrPercentage(Uint16.valueOf(100)) - .setOpu(opuBuilder.build()) - .setParentOduAllocation(parentOduAllocationBuilder.build()); + .setOpu(opuBuilder.build()); - InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class, - logicalConnPoint + "-ODUFLEX"); + // Set the ODUCn rate from OTUCn interface naming convention + String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1); - List listSupportingOtucnInterface = new ArrayList<>(); - listSupportingOtucnInterface.add(supportingOducn); + // check if the oducnrate is a valid value and if it is invalid, then throw error + if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) { + throw new OpenRoadmInterfaceException( + String.format(RATE_EXCEPTION_MESSAGE)); + } - oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); + oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate)); + InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class, + logicalConnPoint + ODUC + oducnrate); - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder - oduflexIf1Builder = + // Create a list + List listSupportingOtucnInterface = new ArrayList<>(); + listSupportingOtucnInterface.add(supportingOtucn); + + oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder(); - oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build()); + oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build()); // Post interface on the device - openRoadmInterfaces.postInterface(nodeId, oduflexInterfaceBuilder); - + openRoadmInterfaces.postInterface(nodeId, oduInterfaceBuilder); // Post the equipment-state change on the device circuit-pack if xpdr node if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) { this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true); } - - return oduflexInterfaceBuilder.getName(); + // Update the port-mapping with the interface information + this.portMapping.updateMapping(nodeId, portMap); + return oduInterfaceBuilder.getName(); } - // This is only for transponder; with SAPI/DAPI information - public String createOpenRoadmOduflexInterface(String anodeId, String alogicalConnPoint, - String supportingOducn, String znodeId, String zlogicalConnPoint) - throws OpenRoadmInterfaceException { + + // With SAPI and DAPI information + public String createOpenRoadmOtnOducnInterface(String anodeId, String alogicalConnPoint, + String supportingOtucn, String znodeId, String zlogicalConnPoint) + throws OpenRoadmInterfaceException { Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint); Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint); if (portMapA == null) { @@ -741,62 +974,61 @@ public class OpenRoadmInterface710 { znodeId, zlogicalConnPoint)); } + // Create ODUcn object + // Start with OPU object // OPU payload OpuBuilder opuBuilder = new OpuBuilder() - .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32")) - .setPayloadType(PayloadTypeDef.getDefaultInstance("32")); - - // Parent Odu-allocation - // Set the trib-slot array - List tribslots = new ArrayList<>(); - IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add( - OpucnTribSlotDef.getDefaultInstance(a + "." + b)))); - - ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder() - .setTribPortNumber(Uint16.valueOf(1)) - .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build()); + .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22")) + .setPayloadType(PayloadTypeDef.getDefaultInstance("22")); - // Create an ODUFlex object + // Create an ODUCn object OduBuilder oduBuilder = new OduBuilder() - .setRate(ODUflexCbr.class) - .setOduflexCbrService(ODUflexCbr400G.class) - .setOduFunction(ODUTTPCTP.class) + .setRate(ODUCn.class) + .setOduFunction(ODUTTP.class) .setMonitoringMode(MonitoringMode.Terminated) .setTimActEnabled(false) .setTimDetectMode(TimDetectMode.Disabled) .setDegmIntervals(Uint8.valueOf(2)) .setDegthrPercentage(Uint16.valueOf(100)) + .setOpu(opuBuilder.build()) .setTxSapi(portMapA.getLcpHashVal()) .setTxDapi(portMapZ.getLcpHashVal()) .setExpectedSapi(portMapZ.getLcpHashVal()) - .setExpectedDapi(portMapA.getLcpHashVal()) - .setOpu(opuBuilder.build()) - .setParentOduAllocation(parentOduAllocationBuilder.build()); + .setExpectedDapi(portMapZ.getLcpHashVal()); - InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class, - alogicalConnPoint + "-ODUFLEX"); + // Set the ODUCn rate from OTUCn interface naming convention + String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1); - List listSupportingOtucnInterface = new ArrayList<>(); - listSupportingOtucnInterface.add(supportingOducn); + // check if the oducnrate is a valid value and if it is invalid, then throw error + if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) { + throw new OpenRoadmInterfaceException( + String.format(RATE_EXCEPTION_MESSAGE)); + } - oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); + oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate)); + + InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class, + alogicalConnPoint + ODUC + oducnrate); + // Create a list + List listSupportingOtucnInterface = new ArrayList<>(); + listSupportingOtucnInterface.add(supportingOtucn); - org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder - oduflexIf1Builder = + oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface); + org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder(); - oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build()); + oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build()); // Post interface on the device - openRoadmInterfaces.postInterface(anodeId, oduflexInterfaceBuilder); - + openRoadmInterfaces.postInterface(anodeId, oduInterfaceBuilder); // Post the equipment-state change on the device circuit-pack if xpdr node if (portMapA.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) { this.openRoadmInterfaces.postEquipmentState(anodeId, portMapA.getSupportingCircuitPackName(), true); } - - return oduflexInterfaceBuilder.getName(); + // Update the port-mapping with the interface information + this.portMapping.updateMapping(anodeId, portMapA); + return oduInterfaceBuilder.getName(); } // This creates the name of the interface with slot numbers at the end 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 61d3be91e..69f732d85 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 @@ -56,6 +56,7 @@ public class OpenRoadmInterfaceFactory { case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1: return openRoadmInterface221.createOpenRoadmEthInterface(nodeId, logicalConnPoint); case StringConstants.OPENROADM_DEVICE_VERSION_7_1: + // Below method differenciates 100G vs 400G based on supported-if-cap type return openRoadmInterface710.createOpenRoadmEthInterface(nodeId, logicalConnPoint); default: return null; @@ -96,13 +97,8 @@ public class OpenRoadmInterfaceFactory { return openRoadmInterface221.createOpenRoadmOchInterface(nodeId, logicalConnPoint, spectrumInformation); case StringConstants.OPENROADM_DEVICE_VERSION_7_1: - // In the case of 710 device, we logically combine the OTSi and OTSiGroup interface and represent - // as OCh - //TODO: 7.1 device can also have 100G transponder - String interfaceOtsiName = openRoadmInterface710.createOpenRoadmOtsiInterface(nodeId, logicalConnPoint, + return openRoadmInterface710.createOpenRoadmOchOtsiOtsigroupInterface(nodeId, logicalConnPoint, spectrumInformation); - return openRoadmInterface710.createOpenRoadmOtsiGroupInterface(nodeId, logicalConnPoint, - interfaceOtsiName, spectrumInformation); default: return null; } @@ -132,11 +128,8 @@ public class OpenRoadmInterfaceFactory { return openRoadmInterface221.createOpenRoadmOdu4HOInterface(nodeId, logicalConnPoint, isCTP, apiInfoA, apiInfoZ, payloadType); case StringConstants.OPENROADM_DEVICE_VERSION_7_1: - // Here ODUCn and ODUflex are combined - String interfaceNameOduc4 = openRoadmInterface710.createOpenRoadmOducnInterface(nodeId, - logicalConnPoint); - return openRoadmInterface710.createOpenRoadmOduflexInterface(nodeId, logicalConnPoint, - interfaceNameOduc4); + return openRoadmInterface710.createOpenRoadmOdu4OducnOduflex(nodeId, logicalConnPoint, + apiInfoA, apiInfoZ); default: return null; } @@ -166,7 +159,7 @@ public class OpenRoadmInterfaceFactory { return openRoadmInterface221.createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportOchInterface, apiInfoA, apiInfoZ); case StringConstants.OPENROADM_DEVICE_VERSION_7_1: - return openRoadmInterface710.createOpenRoadmOtucnInterface(nodeId, logicalConnPoint, + return openRoadmInterface710.createOpenRoadmOtu4OtucnInterface(nodeId, logicalConnPoint, supportOchInterface, apiInfoA, apiInfoZ); default: return null; diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java index cb39a30a4..e99750cb0 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java @@ -394,9 +394,10 @@ public class DeviceRendererServiceImpl implements DeviceRendererService { nodeOpenRoadmVersion.equals(OpenroadmNodeVersion._71) ? Map.of( // We don't need ODUC2, ODUC3 here, since they are handled in OTN service-path - "ODU", List.of("ODUC4", "ODUFLEX"), + "ODU", List.of("ODU4", "ODUC4", "ODUFLEX"), // Add intermediate OTUCn rates (OTUC2, OTUC3) - "other", List.of("OTUC2", "OTUC3", "OTUC4", + // OTU4 is used in 100G service on 7.1 model + "other", List.of("OTU4", "OTUC2", "OTUC3", "OTUC4", "OTSIGROUP-400G", "OTSIGROUP-300G", "OTSIGROUP-200G", spectralSlotName)) : Map.of( -- 2.36.6