X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fnetworkanalyzer%2FPceOtnNode.java;h=4d632f8222f973ef48d87989accd4cb6c00f8428;hb=b0715d1ebf9280df4e39de69d4bc3bc3164267b6;hp=4cd7c943775c746e4108bee082eaf58a02ad6c2b;hpb=7f3a52c2753fa58723e4f061b97ac1bb1df91992;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java index 4cd7c9437..4d632f822 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java @@ -8,6 +8,7 @@ package org.opendaylight.transportpce.pce.networkanalyzer; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.math.BigDecimal; import java.util.ArrayList; import java.util.BitSet; @@ -20,22 +21,24 @@ import java.util.stream.Collectors; import org.opendaylight.transportpce.common.StringConstants; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPools; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If100GEODU4; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2e; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If1GEODU0; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTUCnTs; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If1GEODU0; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability; +import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPool; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId; @@ -45,34 +48,36 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PceOtnNode implements PceNode { - /* Logging. */ - private static final Logger LOG = LoggerFactory.getLogger(PceOtnNode.class); ////////////////////////// OTN NODES /////////////////////////// /* * For This Class the node passed shall be at the otn-openroadm Layer */ - private static List serviceTypeOduList = List.of( + private static final Logger LOG = LoggerFactory.getLogger(PceOtnNode.class); + private static final List SERVICE_TYPE_ODU_LIST = List.of( StringConstants.SERVICE_TYPE_ODU4, StringConstants.SERVICE_TYPE_ODUC4, StringConstants.SERVICE_TYPE_ODUC3, StringConstants.SERVICE_TYPE_ODUC2); - private static Map> - serviceTypeEthClassMap = Map.of( - StringConstants.SERVICE_TYPE_1GE, If1GEODU0.class, - StringConstants.SERVICE_TYPE_10GE, If10GEODU2e.class, - StringConstants.SERVICE_TYPE_100GE_T, If100GEODU4.class, - StringConstants.SERVICE_TYPE_100GE_M, If100GEODU4.class, - StringConstants.SERVICE_TYPE_100GE_S, If100GEODU4.class); - private static Map serviceTypeEthTsNbMap = Map.of( + private static final List VALID_NODETYPES_LIST = List.of( + OpenroadmNodeType.MUXPDR, + OpenroadmNodeType.SWITCH, + OpenroadmNodeType.TPDR); + private static final Map SERVICE_TYPE_ETH_CLASS_MAP = Map.of( + StringConstants.SERVICE_TYPE_1GE, If1GEODU0.VALUE, + StringConstants.SERVICE_TYPE_10GE, If10GEODU2e.VALUE, + StringConstants.SERVICE_TYPE_100GE_M, If100GEODU4.VALUE, + StringConstants.SERVICE_TYPE_100GE_S, If100GEODU4.VALUE); + private static final Map SERVICE_TYPE_ETH_TS_NB_MAP = Map.of( StringConstants.SERVICE_TYPE_1GE, 1, StringConstants.SERVICE_TYPE_10GE, 10, StringConstants.SERVICE_TYPE_100GE_M, 20); - private static Map serviceTypeEthOduStringMap = Map.of( + private static final Map SERVICE_TYPE_ETH_ODU_STRING_MAP = Map.of( StringConstants.SERVICE_TYPE_1GE, "ODU0", StringConstants.SERVICE_TYPE_10GE, "ODU2e", StringConstants.SERVICE_TYPE_100GE_M, "ODU4"); + private static final String INTERMEDIATE_MODETYPE = "intermediate"; + private static final String AZ_MODETYPE = "AZ"; private boolean valid = true; @@ -100,8 +105,10 @@ public class PceOtnNode implements PceNode { private Map clientPerNwTp = new HashMap<>(); private String clientPort; + @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", + justification = "need to initialise available tribport and tribslt") public PceOtnNode(Node node, OpenroadmNodeType nodeType, NodeId nodeId, String pceNodeType, String serviceType, - String clientPort) { + String clientPort) { this.node = node; this.nodeId = nodeId; this.nodeType = nodeType; @@ -115,25 +122,32 @@ public class PceOtnNode implements PceNode { this.availableXpdrClientTps = new ArrayList<>(); this.usableXpdrClientTps = new ArrayList<>(); this.adminStates = node - .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class) .getAdministrativeState(); this.state = node - .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class) .getOperationalState(); this.tpAvailableTribPort.clear(); checkAvailableTribPort(); this.tpAvailableTribSlot.clear(); checkAvailableTribSlot(); this.clientPort = clientPort; - if (node == null || nodeId == null || nodeType != OpenroadmNodeType.MUXPDR - && nodeType != OpenroadmNodeType.SWITCH && nodeType != OpenroadmNodeType.TPDR) { + if (node == null + || nodeId == null + || nodeType == null + || !VALID_NODETYPES_LIST.contains(nodeType)) { LOG.error("PceOtnNode: one of parameters is not populated : nodeId, node type"); this.valid = false; } + if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(serviceType) + && !SERVICE_TYPE_ODU_LIST.contains(serviceType)) { + LOG.error("PceOtnNode: unsupported OTN Service Type {}", serviceType); + this.valid = false; + } } public void initXndrTps(String mode) { - LOG.info("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue()); + LOG.debug("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue()); this.availableXponderTp.clear(); this.modeType = mode; List allTps = @@ -149,60 +163,48 @@ public class PceOtnNode implements PceNode { return; } for (TerminationPoint tp : allTps) { - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp1 - = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526 + .TerminationPoint1 ocnTp1 + = tp.augmentation( + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526 .TerminationPoint1.class); if (ocnTp1 == null) { LOG.warn("null ocn TP {}", tp); continue; } + TerminationPoint1 ontTp1 = tp.augmentation(TerminationPoint1.class); + if (ontTp1 == null) { + continue; + } //TODO many nested structures below, this needs to be reworked switch (ocnTp1.getTpType()) { case XPONDERNETWORK: - if (tp.augmentation(TerminationPoint1.class) == null) { - continue; - } - TerminationPoint1 ontTp1 = tp.augmentation(TerminationPoint1.class); - if (serviceTypeOduList.contains(this.otnServiceType) - || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)) { - // TODO verify the capability of network port to support ODU4 CTP interface creation - if (!checkTpForOdtuTermination(ontTp1)) { - LOG.error("TP {} of {} does not allow ODU4 termination creation", - tp.getTpId().getValue(), node.getNodeId().getValue()); - continue; - } - } else if (serviceTypeEthTsNbMap.containsKey(this.otnServiceType)) { - if (!checkOdtuTTPforLoOduCreation(ontTp1, serviceTypeEthTsNbMap.get(this.otnServiceType))) { - LOG.error("TP {} of {} does not allow {} termination creation", - tp.getTpId().getValue(), - serviceTypeEthOduStringMap.get(this.otnServiceType), - node.getNodeId().getValue()); - continue; - } - // TODO what about SERVICE_TYPE_100GE_T ? + String notCreatedServiceType = xpdrNetTpCreation(ontTp1); + if (notCreatedServiceType == null) { + LOG.debug("TP {} of XPONDER {} is validated", + tp.getTpId().getValue(), + node.getNodeId().getValue()); + this.availableXpdrNWTps.add(tp.getTpId()); } else { - LOG.error("TP {} of {} does not allow any termination creation", - tp.getTpId().getValue(), node.getNodeId().getValue()); - continue; + LOG.error("TP {} of {} does not allow {} termination creation", + tp.getTpId().getValue(), + node.getNodeId().getValue(), + notCreatedServiceType); } - LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue()); - this.availableXpdrNWTps.add(tp.getTpId()); break; - case XPONDERCLIENT: - if (serviceTypeEthClassMap.containsKey(otnServiceType) - && !StringConstants.SERVICE_TYPE_100GE_T.equals(this.otnServiceType)) { - // TODO should we really exclude SERVICE_TYPE_100GE_T ? - if (tp.augmentation(TerminationPoint1.class) == null) { - continue; - } - if (checkClientTp(tp.augmentation(TerminationPoint1.class))) { - LOG.info("TP {} of XPONDER {} is validated", tp.getTpId(), node.getNodeId().getValue()); - this.availableXpdrClientTps.add(tp.getTpId()); - } else { - LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation", - tp.getTpId().getValue(), node.getNodeId().getValue()); - } + if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) { + continue; + } + if (checkClientTp(ontTp1)) { + LOG.debug("TP {} of XPONDER {} is validated", + tp.getTpId(), + node.getNodeId().getValue()); + this.availableXpdrClientTps.add(tp.getTpId()); + } else { + LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation", + tp.getTpId().getValue(), + node.getNodeId().getValue()); } break; @@ -210,52 +212,100 @@ public class PceOtnNode implements PceNode { LOG.debug("unsupported ocn TP type {}", ocnTp1.getTpType()); } } - this.valid = serviceTypeOduList.contains(this.otnServiceType) - || (serviceTypeEthTsNbMap.containsKey(this.otnServiceType) - && ((mode.equals("AZ") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 1, 1)) - || (mode.equals("intermediate") && checkSwPool(null, availableXpdrNWTps, 0, 2))) - ) - || (StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType) - && ((mode.equals("AZ") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 1, 1))) - || (mode.equals("intermediate") && checkSwPool(availableXpdrClientTps, availableXpdrNWTps, 0, 2)) - ); - //TODO checks very similar to isIntermediate and isAz methods - they should be mutualized - // perhaps even with isOtnServiceTypeValid method - } - - private boolean checkSwPool(List clientTps, List netwTps, int nbClient, int nbNetw) { - if (clientTps != null && netwTps != null && nbClient == 1 && nbNetw == 1) { - clientTps.sort(Comparator.comparing(TpId::getValue)); - netwTps.sort(Comparator.comparing(TpId::getValue)); + this.valid = checkSwPool(availableXpdrNWTps, availableXpdrClientTps); + } + + private String xpdrNetTpCreation(TerminationPoint1 ontTp1) { + if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType) + || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)) { + // TODO verify the capability of network port to support ODU4 CTP interface creation + if (checkTpForOdtuTermination(ontTp1)) { + //success + return null; + } + return "ODU4"; + } + if (SERVICE_TYPE_ETH_TS_NB_MAP.containsKey(this.otnServiceType)) { + if (checkOdtuTTPforLoOduCreation( + ontTp1, + SERVICE_TYPE_ETH_TS_NB_MAP.get(this.otnServiceType))) { + //success + return null; + } + return SERVICE_TYPE_ETH_ODU_STRING_MAP.get(this.otnServiceType); + } + //failure + return "any"; + } + + private boolean checkSwPool(List netwTps, List clientTps) { + + if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)) { + return true; + } + if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) { + return false; + } + if (netwTps == null) { + return false; + } + Node1 node1 = node.augmentation(Node1.class); + if (node1 == null) { + return false; + } + List nblList = new ArrayList<>( + node1.getSwitchingPools().nonnullOduSwitchingPools() + .values().stream().findFirst().orElseThrow() + .getNonBlockingList().values()); + netwTps.sort(Comparator.comparing(TpId::getValue)); + + switch (modeType) { + + case INTERMEDIATE_MODETYPE: + return checkIntermediateSwPool(nblList, netwTps); + + case AZ_MODETYPE: + if (clientTps == null) { + return false; + } + clientTps.sort(Comparator.comparing(TpId::getValue)); + return checkAzSwPool(nblList, netwTps, clientTps); + + default: + LOG.error("Unsupported mode type {}", modeType); + return false; + } + } + + + private boolean checkIntermediateSwPool(List nblList, List netwTps) { + for (NonBlockingList nbl: nblList) { for (TpId nwTp : netwTps) { - for (TpId clTp : clientTps) { - for (NonBlockingList nbl : new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools() - .nonnullOduSwitchingPools().values().stream().findFirst().get() - .getNonBlockingList().values())) { - if (nbl.getTpList().contains(clTp) && nbl.getTpList().contains(nwTp)) { - usableXpdrClientTps.add(clTp); - usableXpdrNWTps.add(nwTp); - } - if (usableXpdrClientTps.size() >= nbClient && usableXpdrNWTps.size() >= nbNetw) { - if (this.clientPort == null || this.clientPort.equals(clTp.getValue())) { - clientPerNwTp.put(nwTp.getValue(), clTp.getValue()); - return true; - } - } - } + if (nbl.getTpList().contains(nwTp)) { + usableXpdrNWTps.add(nwTp); + } + if (usableXpdrNWTps.size() >= 2) { + return true; } } } - if (netwTps != null && nbClient == 0 && nbNetw == 2) { - netwTps.sort(Comparator.comparing(TpId::getValue)); - for (NonBlockingList nbl : new ArrayList<>(node.augmentation(Node1.class).getSwitchingPools() - .nonnullOduSwitchingPools().values().stream().findFirst().get() - .getNonBlockingList().values())) { - for (TpId nwTp : netwTps) { - if (nbl.getTpList().contains(nwTp)) { + return false; + } + + + private boolean checkAzSwPool(List nblList, List netwTps, List clientTps) { + for (NonBlockingList nbl: nblList) { + for (TpId nwTp : netwTps) { + for (TpId clTp : clientTps) { + if (nbl.getTpList().contains(clTp) + && nbl.getTpList().contains(nwTp)) { + usableXpdrClientTps.add(clTp); usableXpdrNWTps.add(nwTp); } - if (usableXpdrNWTps.size() >= nbNetw) { + if (usableXpdrClientTps.size() >= 1 + && usableXpdrNWTps.size() >= 1 + && (this.clientPort == null || this.clientPort.equals(clTp.getValue()))) { + clientPerNwTp.put(nwTp.getValue(), clTp.getValue()); return true; } } @@ -265,12 +315,13 @@ public class PceOtnNode implements PceNode { } private boolean checkTpForOdtuTermination(TerminationPoint1 ontTp1) { - for (SupportedInterfaceCapability sic : ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability() - .values()) { - LOG.info("in checkTpForOduTermination - sic = {}", sic.getIfCapType()); - if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class) || sic.getIfCapType().equals(IfOtsiOtsigroup.class)) - && (ontTp1.getXpdrTpPortConnectionAttributes() == null - || ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) { + for (SupportedInterfaceCapability sic : + ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) { + LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType()); + if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.VALUE) + || sic.getIfCapType().equals(IfOtsiOtsigroup.VALUE)) + && (ontTp1.getXpdrTpPortConnectionAttributes() == null + || ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) { return true; } } @@ -279,30 +330,27 @@ public class PceOtnNode implements PceNode { private boolean checkOdtuTTPforLoOduCreation(TerminationPoint1 ontTp1, int tsNb) { XpdrTpPortConnectionAttributes portConAttr = ontTp1.getXpdrTpPortConnectionAttributes(); - return portConAttr != null - && portConAttr.getTsPool() != null - && portConAttr.getTsPool().size() >= tsNb - && portConAttr.getOdtuTpnPool() != null - && (portConAttr.getOdtuTpnPool().values() - .stream().findFirst().get().getOdtuType() - .equals(ODTU4TsAllocated.class) - || - portConAttr.getOdtuTpnPool().values() - .stream().findFirst().get().getOdtuType() - .equals(ODTUCnTs.class)) - && !portConAttr.getOdtuTpnPool().values() - .stream().findFirst().get().getTpnPool() - .isEmpty(); - //TODO a dedicated method for OdtuTpnPool first value would probably be welcome + if (portConAttr == null + || portConAttr.getTsPool() == null + || portConAttr.getTsPool().size() < tsNb + || portConAttr.getOdtuTpnPool() == null) { + return false; + } + return checkFirstOdtuTpn(portConAttr.getOdtuTpnPool().values().stream().findFirst().orElseThrow()); + } + + private boolean checkFirstOdtuTpn(OdtuTpnPool otPool) { + return (otPool.getOdtuType().equals(ODTU4TsAllocated.VALUE)) + || otPool.getOdtuType().equals(ODTUCnTs.VALUE) + && !otPool.getTpnPool().isEmpty(); } private boolean checkClientTp(TerminationPoint1 ontTp1) { - for (SupportedInterfaceCapability sic : ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability() - .values()) { + for (SupportedInterfaceCapability sic : + ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) { LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType()); // we could also check the administrative status of the tp - if (serviceTypeEthClassMap.containsKey(otnServiceType) - && sic.getIfCapType().equals(serviceTypeEthClassMap.get(otnServiceType))) { + if (SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType).equals(sic.getIfCapType())) { return true; } } @@ -313,12 +361,13 @@ public class PceOtnNode implements PceNode { if (!isValid()) { return; } - if (this.nodeId.getValue().equals(anodeId) || (this.nodeId.getValue().equals(znodeId))) { - initXndrTps("AZ"); + if (this.nodeId.getValue().equals(anodeId) + || (this.nodeId.getValue().equals(znodeId))) { + initXndrTps(AZ_MODETYPE); } else if (OpenroadmNodeType.SWITCH.equals(this.nodeType)) { - initXndrTps("intermediate"); + initXndrTps(INTERMEDIATE_MODETYPE); } else { - LOG.info("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue()); + LOG.warn("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue()); valid = false; } } @@ -327,14 +376,15 @@ public class PceOtnNode implements PceNode { if (this.nodeType != OpenroadmNodeType.TPDR) { return true; } - Node1 node1 = node.augmentation(Node1.class); - SwitchingPools sp = node1.getSwitchingPools(); - List osp = new ArrayList<>(sp.nonnullOduSwitchingPools().values()); - for (OduSwitchingPools ospx : osp) { - List nbl = new ArrayList<>(ospx.nonnullNonBlockingList().values()); - for (NonBlockingList nbll : nbl) { - if (nbll.getAvailableInterconnectBandwidth().toJava() >= neededBW && nbll.getTpList() != null - && nbll.getTpList().contains(tp1.getTpId()) && nbll.getTpList().contains(tp2.getTpId())) { + for (OduSwitchingPools ospx : + node.augmentation(Node1.class) + .getSwitchingPools() + .nonnullOduSwitchingPools().values()) { + for (NonBlockingList nbll : ospx.nonnullNonBlockingList().values()) { + if (nbll.getAvailableInterconnectBandwidth().toJava() >= neededBW + && nbll.getTpList() != null + && nbll.getTpList().contains(tp1.getTpId()) + && nbll.getTpList().contains(tp2.getTpId())) { LOG.debug("validateSwitchingPoolBandwidth: couple of tp {} x {} valid for crossconnection", tp1.getTpId(), tp2.getTpId()); return true; @@ -354,9 +404,9 @@ public class PceOtnNode implements PceNode { return; } // Validate switch for use as an intermediate XPONDER on the path - initXndrTps("intermediate"); + initXndrTps(INTERMEDIATE_MODETYPE); if (this.valid) { - LOG.info("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue()); + LOG.debug("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue()); } else { LOG.debug("validateIntermediateSwitch: Switch unusable for transit == {}", nodeId.getValue()); } @@ -370,24 +420,17 @@ public class PceOtnNode implements PceNode { .getTerminationPoint().values().stream() .filter(type -> type .augmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526 .TerminationPoint1.class) .getTpType() .equals(OpenroadmTpType.XPONDERNETWORK)) .collect(Collectors.toList())) { XpdrTpPortConnectionAttributes portConAttr = tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes(); - if (portConAttr != null - && portConAttr.getOdtuTpnPool() != null - && (portConAttr.getOdtuTpnPool().values().stream().findFirst().get().getOdtuType() - .equals(ODTU4TsAllocated.class) - || portConAttr.getOdtuTpnPool().values().stream().findFirst().get().getOdtuType() - .equals(ODTUCnTs.class))) { - //TODO a dedicated method for OdtuTpnPool first value would probably be welcome - List tpnPool = - portConAttr.getOdtuTpnPool().values().stream().findFirst().get().getTpnPool(); - if (tpnPool != null) { - tpAvailableTribPort.put(tp.getTpId().getValue(), tpnPool); + if (portConAttr != null && portConAttr.getOdtuTpnPool() != null) { + OdtuTpnPool otPool = portConAttr.getOdtuTpnPool().values().stream().findFirst().orElseThrow(); + if (checkFirstOdtuTpn(otPool)) { + tpAvailableTribPort.put(tp.getTpId().getValue(), new ArrayList<>(otPool.getTpnPool())); } } } @@ -396,24 +439,28 @@ public class PceOtnNode implements PceNode { public void checkAvailableTribSlot() { for (TerminationPoint tp : node.augmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class) + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) .getTerminationPoint().values().stream() .filter(type -> type .augmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1.class) + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526 + .TerminationPoint1.class) .getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) .collect(Collectors.toList()) ) { XpdrTpPortConnectionAttributes portConAttr = tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes(); if (portConAttr != null && portConAttr.getTsPool() != null) { - tpAvailableTribSlot.put(tp.getTpId().getValue(), portConAttr.getTsPool()); + tpAvailableTribSlot.put(tp.getTpId().getValue(), new ArrayList<>(portConAttr.getTsPool())); } } } public boolean isValid() { - if (node == null || nodeId == null || nodeType == null || this.getSupNetworkNodeId() == null + if (nodeId == null + || nodeType == null + || this.getSupNetworkNodeId() == null || this.getSupClliNodeId() == null) { LOG.error("PceNode: one of parameters is not populated : nodeId, node type, supporting nodeId"); valid = false; @@ -421,55 +468,6 @@ public class PceOtnNode implements PceNode { return valid; } - public boolean isPceOtnNodeValid(final PceOtnNode pceOtnNode) { - if (pceOtnNode == null || pceOtnNode.node == null || pceOtnNode.getNodeId() == null - || pceOtnNode.nodeType == null || pceOtnNode.getSupNetworkNodeId() == null - || pceOtnNode.getSupClliNodeId() == null || pceOtnNode.otnServiceType == null) { - LOG.error( - "PceOtnNode: one of parameters is not populated : nodeId, node type, supporting nodeId, otnServiceType" - ); - return false; - } - if (isNodeTypeValid(pceOtnNode)) { - return isOtnServiceTypeValid(pceOtnNode); - } - LOG.error("PceOtnNode node type: node type is not one of MUXPDR or SWITCH or TPDR"); - return false; - } - - private boolean isOtnServiceTypeValid(PceOtnNode pceOtnNode) { - if (pceOtnNode.modeType == null) { - return false; - } - //Todo refactor Strings (mode and otnServiceType ) to enums - if (pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_ODU4) - && pceOtnNode.modeType.equals("AZ")) { - return true; - } - return (pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_10GE) - || pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_1GE) - || pceOtnNode.otnServiceType.equals(StringConstants.SERVICE_TYPE_100GE_S)) - && (isAz(pceOtnNode) || isIntermediate(pceOtnNode)); - //TODO serviceTypeEthTsNbMap.containsKey(this.otnServiceType) might be more appropriate here - // but only SERVICE_TYPE_100GE_S is managed and not SERVICE_TYPE_100GE_M and _T - } - - private boolean isIntermediate(PceOtnNode pceOtnNode) { - return pceOtnNode.modeType.equals("intermediate") - && checkSwPool(null, pceOtnNode.availableXpdrNWTps, 0, 2); - } - - private boolean isAz(PceOtnNode pceOtnNode) { - return pceOtnNode.modeType.equals("AZ") - && checkSwPool(pceOtnNode.availableXpdrClientTps, pceOtnNode.availableXpdrNWTps, 1, 1); - } - - private boolean isNodeTypeValid(final PceOtnNode pceOtnNode) { - return pceOtnNode.nodeType == OpenroadmNodeType.MUXPDR - || pceOtnNode.nodeType == OpenroadmNodeType.SWITCH - || pceOtnNode.nodeType == OpenroadmNodeType.TPDR; - } - @Override public void addOutgoingLink(PceLink outLink) { this.outgoingLinks.add(outLink); @@ -569,6 +567,21 @@ public class PceOtnNode implements PceNode { return null; } + @Override + public String getXponderOperationalMode(XpdrNetworkAttributes tp) { + return null; + } + + @Override + public String getOperationalMode() { + return null; + } + + @Override + public OpenroadmNodeType getORNodeType() { + return this.nodeType; + } + /* * (non-Javadoc) *