X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fnetworkanalyzer%2FPceCalculation.java;h=facffa8c17085f09bf95dc7e8d2448f21a7f76a6;hb=3864192e72c83efcabc741d0cb84600dec58c357;hp=d48c0e2d86744e82ae5dc7adc2932ca9054c954a;hpb=4f612167d648ea58503f97ec616a8a1fcf593d48;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java index d48c0e2d8..facffa8c1 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java @@ -8,14 +8,13 @@ package org.opendaylight.transportpce.pce.networkanalyzer; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -30,15 +29,15 @@ import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.common.service.ServiceTypes; import org.opendaylight.transportpce.pce.PceComplianceCheck; import org.opendaylight.transportpce.pce.constraints.PceConstraints; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev210701.PathComputationRequestInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mc.capabilities.McCapabilities; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.Endpoints; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mc.capabilities.McCapabilities; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; @@ -56,7 +55,7 @@ import org.slf4j.LoggerFactory; public class PceCalculation { /* Logging. */ private static final Logger LOG = LoggerFactory.getLogger(PceCalculation.class); - private NetworkTransactionService networkTransactionService = null; + private NetworkTransactionService networkTransactionService; ///////////// data parsed from Input///////////////// private PathComputationRequestInput input; @@ -72,7 +71,7 @@ public class PceCalculation { ///////////// Intermediate data///////////////// private List addLinks = new ArrayList<>(); private List dropLinks = new ArrayList<>(); - private HashSet azSrgs = new HashSet<>(); + private List azSrgs = new ArrayList<>(); private PceNode aendPceNode = null; private PceNode zendPceNode = null; @@ -85,9 +84,11 @@ public class PceCalculation { // this List serves calculation of ZtoA path description // TODO maybe better solution is possible private Map allPceLinks = new HashMap<>(); - private Set linksToExclude = new HashSet<>(); + private List linksToExclude = new ArrayList<>(); private PceResult returnStructure; private PortMapping portMapping; + // Define the termination points whose reservation status is not taken into account during the pruning process + private Endpoints endpoints; private enum ConstraintTypes { NONE, HARD_EXCLUDE, HARD_INCLUDE, HARD_DIVERSITY, SOFT_EXCLUDE, SOFT_INCLUDE, SOFT_DIVERSITY; @@ -96,21 +97,34 @@ public class PceCalculation { private MappingUtils mappingUtils; public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService, - PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc, - PortMapping portMapping) { + PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc, + PortMapping portMapping) { this.input = input; this.networkTransactionService = networkTransactionService; this.returnStructure = rc; + this.pceHardConstraints = pceHardConstraints; + this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker()); + this.portMapping = portMapping; + this.endpoints = null; + parseInput(); + } + public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService, + PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc, + PortMapping portMapping, Endpoints endpoints) { + this.input = input; + this.networkTransactionService = networkTransactionService; + this.returnStructure = rc; this.pceHardConstraints = pceHardConstraints; this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker()); this.portMapping = portMapping; + this.endpoints = endpoints; parseInput(); } public void retrievePceNetwork() { - LOG.info("In PceCalculation retrieveNetwork: "); + LOG.debug("In PceCalculation retrieveNetwork"); if (!readMdSal()) { returnStructure.setRC(ResponseCodes.RESPONSE_FAILED); @@ -125,7 +139,6 @@ public class PceCalculation { printNodesInfo(allPceNodes); returnStructure.setRC(ResponseCodes.RESPONSE_OK); - return; } private boolean parseInput() { @@ -138,18 +151,17 @@ public class PceCalculation { serviceFormatA = input.getServiceAEnd().getServiceFormat().getName(); serviceFormatZ = input.getServiceZEnd().getServiceFormat().getName(); serviceRate = input.getServiceAEnd().getServiceRate(); - if (NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId()).getNodeInfo().getNodeType()) - && input.getServiceAEnd().getTxDirection() != null - && input.getServiceAEnd().getTxDirection().getPort() != null - && input.getServiceAEnd().getTxDirection().getPort().getPortName() != null) { - Mapping mapping = portMapping.getMapping(input.getServiceAEnd().getNodeId(), - input.getServiceAEnd().getTxDirection().getPort().getPortName()); - serviceType = ServiceTypes.getServiceType(serviceFormatA, serviceRate, mapping); - } else { - serviceType = ServiceTypes.getServiceType(serviceFormatA, serviceRate, null); - } - - LOG.info("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId); + serviceType = ServiceTypes.getServiceType( + serviceFormatA, + serviceRate, + NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId()).getNodeInfo().getNodeType()) + && checkAendInputTxPortName() + ? portMapping.getMapping( + input.getServiceAEnd().getNodeId(), + input.getServiceAEnd().getTxDirection().getPort().getPortName()) + : null); + + LOG.debug("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId); getAZnodeId(); @@ -158,18 +170,38 @@ public class PceCalculation { return true; } + private boolean checkAendInputTxPortName() { + return checkAendInputTxPort() + && input.getServiceAEnd().getTxDirection().getPort().getPortName() != null; + } + + private boolean checkAendInputTxPortDeviceName() { + return checkAendInputTxPort() + && input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName() != null; + } + + private boolean checkAendInputTxPort() { + return input.getServiceAEnd() != null + && input.getServiceAEnd().getTxDirection() != null + && input.getServiceAEnd().getTxDirection().getPort() != null; + } + + private boolean checkZendInputTxPortDeviceName() { + return input.getServiceZEnd() != null + && input.getServiceZEnd().getTxDirection() != null + && input.getServiceZEnd().getTxDirection().getPort() != null + && input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName() != null; + } + private void getAZnodeId() { - if (StringConstants.SERVICE_TYPE_ODU4.equals(serviceType) - || StringConstants.SERVICE_TYPE_ODUC4.equals(serviceType) - || StringConstants.SERVICE_TYPE_100GE_M.equals(serviceType) - || StringConstants.SERVICE_TYPE_10GE.equals(serviceType) - || StringConstants.SERVICE_TYPE_1GE.equals(serviceType)) { - anodeId = input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName(); - znodeId = input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName(); - } else { - anodeId = input.getServiceAEnd().getNodeId(); - znodeId = input.getServiceZEnd().getNodeId(); - } + anodeId = + checkAendInputTxPortDeviceName() + ? input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName() + : input.getServiceAEnd().getNodeId(); + znodeId = + checkZendInputTxPortDeviceName() + ? input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName() + : input.getServiceZEnd().getNodeId(); } private boolean readMdSal() { @@ -178,17 +210,22 @@ public class PceCalculation { case StringConstants.SERVICE_TYPE_100GE_T: case StringConstants.SERVICE_TYPE_400GE: case StringConstants.SERVICE_TYPE_OTU4: + case StringConstants.SERVICE_TYPE_OTUC2: + case StringConstants.SERVICE_TYPE_OTUC3: case StringConstants.SERVICE_TYPE_OTUC4: - LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID); + LOG.debug("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID); nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); break; case StringConstants.SERVICE_TYPE_100GE_M: + case StringConstants.SERVICE_TYPE_100GE_S: case StringConstants.SERVICE_TYPE_ODU4: + case StringConstants.SERVICE_TYPE_ODUC2: + case StringConstants.SERVICE_TYPE_ODUC3: case StringConstants.SERVICE_TYPE_ODUC4: case StringConstants.SERVICE_TYPE_10GE: case StringConstants.SERVICE_TYPE_1GE: - LOG.info("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID); + LOG.debug("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID); nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build(); break; @@ -198,36 +235,36 @@ public class PceCalculation { break; } - if (readTopology(nwInstanceIdentifier) != null) { - allNodes = readTopology(nwInstanceIdentifier).nonnullNode().values().stream().sorted((n1, n2) - -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList()); - Network1 nw1 = readTopology(nwInstanceIdentifier).augmentation(Network1.class); - if (nw1 != null) { - allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2) - -> l1.getSource().getSourceTp().toString().compareTo(l2.getSource().getSourceTp().toString())) - .collect(Collectors.toList()); - } else { - LOG.warn("no otn links in otn-topology"); - } - if (allNodes == null || allNodes.isEmpty()) { - LOG.error("readMdSal: no nodes "); - return false; - } - LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size()); - LOG.debug("readMdSal: network nodes: {} nodes added", allNodes); - - if (allLinks == null || allLinks.isEmpty()) { - LOG.error("readMdSal: no links "); - return false; - } - LOG.info("readMdSal: network links: {} links added", allLinks.size()); - LOG.debug("readMdSal: network links: {} links added", allLinks); + if (readTopology(nwInstanceIdentifier) == null) { + LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier); + return false; + } - return true; + allNodes = readTopology(nwInstanceIdentifier).nonnullNode().values().stream().sorted((n1, n2) + -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue())).collect(Collectors.toList()); + Network1 nw1 = readTopology(nwInstanceIdentifier).augmentation(Network1.class); + if (nw1 == null) { + LOG.warn("no otn links in otn-topology"); } else { - LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier); + allLinks = nw1.nonnullLink().values().stream().sorted((l1, l2) + -> l1.getSource().getSourceTp().getValue().compareTo(l2.getSource().getSourceTp().getValue())) + .collect(Collectors.toList()); + } + if (allNodes == null || allNodes.isEmpty()) { + LOG.error("readMdSal: no nodes "); + return false; + } + LOG.info("readMdSal: network nodes: {} nodes added", allNodes.size()); + LOG.debug("readMdSal: network nodes: {} nodes added", allNodes); + + if (allLinks == null || allLinks.isEmpty()) { + LOG.error("readMdSal: no links "); return false; } + LOG.info("readMdSal: network links: {} links added", allLinks.size()); + LOG.debug("readMdSal: network links: {} links added", allLinks); + + return true; } private Network readTopology(InstanceIdentifier nwInstanceIdentifier) { @@ -236,16 +273,12 @@ public class PceCalculation { Optional nwOptional = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier).get(); if (nwOptional.isPresent()) { - nw = nwOptional.get(); + nw = nwOptional.orElseThrow(); LOG.debug("readMdSal: network nodes: nwOptional.isPresent = true {}", nw); - networkTransactionService.close(); } } catch (InterruptedException | ExecutionException e) { LOG.error("readMdSal: Error reading topology {}", nwInstanceIdentifier); - networkTransactionService.close(); returnStructure.setRC(ResponseCodes.RESPONSE_FAILED); - throw new RuntimeException( - "readMdSal: Error reading from operational store, topology : " + nwInstanceIdentifier + " :" + e); } return nw; } @@ -253,56 +286,60 @@ public class PceCalculation { private boolean analyzeNw() { LOG.debug("analyzeNw: allNodes size {}, allLinks size {}", allNodes.size(), allLinks.size()); + switch (serviceType) { + case StringConstants.SERVICE_TYPE_100GE_T: + case StringConstants.SERVICE_TYPE_OTU4: + case StringConstants.SERVICE_TYPE_400GE: + case StringConstants.SERVICE_TYPE_OTUC2: + case StringConstants.SERVICE_TYPE_OTUC3: + case StringConstants.SERVICE_TYPE_OTUC4: + // 100GE service and OTU4 service are handled at the openroadm-topology layer + for (Node node : allNodes) { + validateNode(node); + } - if (StringConstants.SERVICE_TYPE_100GE_T.equals(serviceType) - || StringConstants.SERVICE_TYPE_OTU4.equals(serviceType) - || StringConstants.SERVICE_TYPE_400GE.equals(serviceType) - || StringConstants.SERVICE_TYPE_OTUC4.equals(serviceType)) { - // 100GE service and OTU4 service are handled at the openroadm-topology layer - for (Node node : allNodes) { - validateNode(node); - } - - LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); + LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); - if (aendPceNode == null || zendPceNode == null) { - LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); - return false; - } - for (Link link : allLinks) { - validateLink(link); - } - // debug prints - LOG.debug("analyzeNw: addLinks size {}, dropLinks size {}", addLinks.size(), dropLinks.size()); - // debug prints - LOG.debug("analyzeNw: azSrgs size = {}", azSrgs.size()); - for (NodeId srg : azSrgs) { - LOG.debug("analyzeNw: A/Z Srgs SRG = {}", srg.getValue()); - } - // debug prints - for (PceLink link : addLinks) { - filteraddLinks(link); - } - for (PceLink link : dropLinks) { - filterdropLinks(link); - } + if (aendPceNode == null || zendPceNode == null) { + LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); + return false; + } + for (Link link : allLinks) { + validateLink(link); + } + // debug prints + LOG.debug("analyzeNw: addLinks size {}, dropLinks size {}", addLinks.size(), dropLinks.size()); + // debug prints + LOG.debug("analyzeNw: azSrgs size = {}", azSrgs.size()); + for (NodeId srg : azSrgs) { + LOG.debug("analyzeNw: A/Z Srgs SRG = {}", srg.getValue()); + } + // debug prints + for (PceLink link : addLinks) { + filteraddLinks(link); + } + for (PceLink link : dropLinks) { + filterdropLinks(link); + } + break; - } else { - // ODU4, 10GE/ODU2e or 1GE/ODU0 services are handled at openroadm-otn layer + default: + // ODU4, 10GE/ODU2e or 1GE/ODU0 services are handled at openroadm-otn layer - for (Node node : allNodes) { - validateOtnNode(node); - } + for (Node node : allNodes) { + validateOtnNode(node); + } - LOG.info("analyzeNw: allPceNodes {}", allPceNodes); + LOG.info("analyzeNw: allPceNodes {}", allPceNodes); - if (aendPceNode == null || zendPceNode == null) { - LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); - return false; - } - for (Link link : allLinks) { - validateLink(link); - } + if (aendPceNode == null || zendPceNode == null) { + LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); + return false; + } + for (Link link : allLinks) { + validateLink(link); + } + break; } LOG.info("analyzeNw: allPceNodes size {}, allPceLinks size {}", allPceNodes.size(), allPceLinks.size()); @@ -354,7 +391,7 @@ public class PceCalculation { } private boolean validateLink(Link link) { - LOG.info("validateLink: link {} ", link); + LOG.debug("validateLink: link {} ", link); NodeId sourceId = link.getSource().getSourceNode(); NodeId destId = link.getDestination().getDestNode(); @@ -382,12 +419,17 @@ public class PceCalculation { switch (serviceType) { case StringConstants.SERVICE_TYPE_100GE_T: case StringConstants.SERVICE_TYPE_OTU4: + case StringConstants.SERVICE_TYPE_OTUC2: + case StringConstants.SERVICE_TYPE_OTUC3: case StringConstants.SERVICE_TYPE_OTUC4: case StringConstants.SERVICE_TYPE_400GE: return processPceLink(link, sourceId, destId, source, dest); case StringConstants.SERVICE_TYPE_ODU4: case StringConstants.SERVICE_TYPE_10GE: case StringConstants.SERVICE_TYPE_100GE_M: + case StringConstants.SERVICE_TYPE_100GE_S: + case StringConstants.SERVICE_TYPE_ODUC2: + case StringConstants.SERVICE_TYPE_ODUC3: case StringConstants.SERVICE_TYPE_ODUC4: case StringConstants.SERVICE_TYPE_1GE: return processPceOtnLink(link, source, dest); @@ -418,34 +460,53 @@ public class PceCalculation { deviceNodeId = node.getNodeId().getValue(); } - LOG.info("Device node id {} for {}", deviceNodeId, node); + LOG.debug("Device node id {} for {}", deviceNodeId, node); PceOpticalNode pceNode = new PceOpticalNode(deviceNodeId, this.serviceType, portMapping, node, nodeType, mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()), getCentralFreqGranularity(deviceNodeId, node.getNodeId())); + if (endpoints != null) { + pceNode.setEndpoints(endpoints); + } pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat()); pceNode.initFrequenciesBitSet(); if (!pceNode.isValid()) { - LOG.warn(" validateNode: Node is ignored"); + LOG.debug(" validateNode: Node {} is ignored", node.getNodeId().getValue()); return; } if (validateNodeConstraints(pceNode).equals(ConstraintTypes.HARD_EXCLUDE)) { return; } - if (endPceNode(nodeType, pceNode.getNodeId(), pceNode) && this.aendPceNode == null - && isAZendPceNode(this.serviceFormatA, pceNode, anodeId, "A")) { - this.aendPceNode = pceNode; - } - if (endPceNode(nodeType, pceNode.getNodeId(), pceNode) && this.zendPceNode == null - && isAZendPceNode(this.serviceFormatZ, pceNode, znodeId, "Z")) { - this.zendPceNode = pceNode; + + if (endPceNode(nodeType, pceNode.getNodeId(), pceNode)) { + if (this.aendPceNode == null && isAZendPceNode(this.serviceFormatA, pceNode, anodeId, "A")) { + // Added to ensure A-node has a addlink in the topology + List links = this.allLinks.stream() + .filter(x -> x.getSource().getSourceNode().getValue().contains(pceNode.getNodeId().getValue())) + .collect(Collectors.toList()); + if (!links.isEmpty()) { + this.aendPceNode = pceNode; + } + } + if (this.zendPceNode == null && isAZendPceNode(this.serviceFormatZ, pceNode, znodeId, "Z")) { + // Added to ensure Z-node has a droplink in the topology + List links = this.allLinks.stream() + .filter(x -> x.getDestination().getDestNode().getValue().contains(pceNode.getNodeId().getValue())) + .collect(Collectors.toList()); + if (!links.isEmpty()) { + this.zendPceNode = pceNode; + } + } } allPceNodes.put(pceNode.getNodeId(), pceNode); LOG.debug("validateNode: node is saved {}", pceNode.getNodeId().getValue()); - return; } + @SuppressWarnings("fallthrough") + @SuppressFBWarnings( + value = "SF_SWITCH_FALLTHROUGH", + justification = "intentional fallthrough") private boolean isAZendPceNode(String serviceFormat, PceOpticalNode pceNode, String azNodeId, String azEndPoint) { switch (serviceFormat) { case "Ethernet": @@ -453,17 +514,20 @@ public class PceCalculation { if (pceNode.getSupNetworkNodeId().equals(azNodeId)) { return true; } - return false; + //fallthrough case "OTU": - if ("A".equals(azEndPoint) && pceNode.getNodeId().getValue() - .equals(this.input.getServiceAEnd().getRxDirection().getPort().getPortDeviceName())) { - return true; - } - if ("Z".equals(azEndPoint) && pceNode.getNodeId().getValue() - .equals(this.input.getServiceZEnd().getRxDirection().getPort().getPortDeviceName())) { - return true; + switch (azEndPoint) { + case "A": + return checkAendInputTxPortDeviceName() + && pceNode.getNodeId().getValue() + .equals(this.input.getServiceAEnd().getTxDirection().getPort().getPortDeviceName()); + case "Z": + return checkZendInputTxPortDeviceName() + && pceNode.getNodeId().getValue() + .equals(this.input.getServiceZEnd().getTxDirection().getPort().getPortDeviceName()); + default: + return false; } - return false; default: LOG.debug("Unsupported service Format {} for node {}", serviceFormat, pceNode.getNodeId().getValue()); return false; @@ -473,32 +537,47 @@ public class PceCalculation { private void validateOtnNode(Node node) { LOG.info("validateOtnNode: {} ", node.getNodeId().getValue()); // PceOtnNode will be used in Graph algorithm - if (node.augmentation(Node1.class) != null) { - OpenroadmNodeType nodeType = node.augmentation(Node1.class).getNodeType(); - - PceOtnNode pceOtnNode = new PceOtnNode(node, nodeType, node.getNodeId(), "otn", serviceType); - pceOtnNode.validateXponder(anodeId, znodeId); + if (node.augmentation(Node1.class) == null) { + LOG.error("ValidateOtnNode: no node-type augmentation. Node {} is ignored", node.getNodeId().getValue()); + return; + } - if (!pceOtnNode.isValid()) { - LOG.warn(" validateOtnNode: Node {} is ignored", node.getNodeId().getValue()); - return; - } - if (validateNodeConstraints(pceOtnNode).equals(ConstraintTypes.HARD_EXCLUDE)) { - return; - } - if (pceOtnNode.getNodeId().getValue().equals(anodeId) && this.aendPceNode == null) { - this.aendPceNode = pceOtnNode; - } - if (pceOtnNode.getNodeId().getValue().equals(znodeId) && this.zendPceNode == null) { - this.zendPceNode = pceOtnNode; - } - allPceNodes.put(pceOtnNode.getNodeId(), pceOtnNode); - LOG.info("validateOtnNode: node {} is saved", node.getNodeId().getValue()); + OpenroadmNodeType nodeType = node.augmentation(Node1.class).getNodeType(); + String clientPort = null; + if (node.getNodeId().getValue().equals(anodeId) + && this.aendPceNode == null + && input.getServiceAEnd() != null + && input.getServiceAEnd().getRxDirection() != null + && input.getServiceAEnd().getRxDirection().getPort() != null + && input.getServiceAEnd().getRxDirection().getPort().getPortName() != null) { + clientPort = input.getServiceAEnd().getRxDirection().getPort().getPortName(); + } else if (node.getNodeId().getValue().equals(znodeId) + && this.zendPceNode == null + && input.getServiceZEnd() != null + && input.getServiceZEnd().getRxDirection() != null + && input.getServiceZEnd().getRxDirection().getPort() != null + && input.getServiceZEnd().getRxDirection().getPort().getPortName() != null) { + clientPort = input.getServiceZEnd().getRxDirection().getPort().getPortName(); + } + + PceOtnNode pceOtnNode = new PceOtnNode(node, nodeType, node.getNodeId(), "otn", serviceType, clientPort); + pceOtnNode.validateXponder(anodeId, znodeId); + + if (!pceOtnNode.isValid()) { + LOG.warn(" validateOtnNode: Node {} is ignored", node.getNodeId().getValue()); return; - } else { - LOG.error("ValidateOtnNode: no node-type augmentation. Node {} is ignored", node.getNodeId().getValue()); + } + if (validateNodeConstraints(pceOtnNode).equals(ConstraintTypes.HARD_EXCLUDE)) { return; } + if (pceOtnNode.getNodeId().getValue().equals(anodeId) && this.aendPceNode == null) { + this.aendPceNode = pceOtnNode; + } + if (pceOtnNode.getNodeId().getValue().equals(znodeId) && this.zendPceNode == null) { + this.zendPceNode = pceOtnNode; + } + allPceNodes.put(pceOtnNode.getNodeId(), pceOtnNode); + LOG.info("validateOtnNode: node {} is saved", node.getNodeId().getValue()); } private ConstraintTypes validateNodeConstraints(PceNode pcenode) { @@ -506,11 +585,11 @@ public class PceCalculation { return ConstraintTypes.NONE; } if (pceHardConstraints.getExcludeSupNodes().contains(pcenode.getSupNetworkNodeId())) { - LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); + LOG.debug("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); return ConstraintTypes.HARD_EXCLUDE; } if (pceHardConstraints.getExcludeCLLI().contains(pcenode.getSupClliNodeId())) { - LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); + LOG.debug("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); return ConstraintTypes.HARD_EXCLUDE; } return ConstraintTypes.NONE; @@ -529,7 +608,7 @@ public class PceCalculation { List constraints = new ArrayList<>(pceHardConstraints.getExcludeSRLG()); constraints.retainAll(link.getsrlgList()); if (!constraints.isEmpty()) { - LOG.info("validateLinkConstraints: {}", link.getLinkId().getValue()); + LOG.debug("validateLinkConstraints: {}", link.getLinkId().getValue()); return ConstraintTypes.HARD_EXCLUDE; } @@ -556,7 +635,7 @@ public class PceCalculation { pceNode.initXndrTps(input.getServiceAEnd().getServiceFormat()); break; default: - LOG.warn("endPceNode: Node {} is not SRG or XPONDER !", nodeId); + LOG.debug("endPceNode: Node {} is not SRG or XPONDER !", nodeId); return false; } @@ -589,12 +668,14 @@ public class PceCalculation { pcelink.getlinkType(), pcelink); break; case ADDLINK: - pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString())); + pcelink.setClientA( + source.getRdmSrgClient(pcelink.getSourceTP().getValue(), StringConstants.SERVICE_DIRECTION_AZ)); addLinks.add(pcelink); LOG.debug("validateLink: ADD-LINK saved {}", pcelink); break; case DROPLINK: - pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString())); + pcelink.setClientZ( + dest.getRdmSrgClient(pcelink.getDestTP().getValue(), StringConstants.SERVICE_DIRECTION_ZA)); dropLinks.add(pcelink); LOG.debug("validateLink: DROP-LINK saved {}", pcelink); break; @@ -602,13 +683,13 @@ public class PceCalculation { // store separately all SRG links directly azSrgs.add(sourceId); // connected to A/Z - if (!dest.checkTP(pcelink.getDestTP().toString())) { + if (!dest.checkTP(pcelink.getDestTP().getValue())) { LOG.debug( "validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink); return false; } - if (dest.getXpdrClient(pcelink.getDestTP().toString()) != null) { - pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().toString())); + if (dest.getXpdrClient(pcelink.getDestTP().getValue()) != null) { + pcelink.setClientZ(dest.getXpdrClient(pcelink.getDestTP().getValue())); } allPceLinks.put(linkId, pcelink); source.addOutgoingLink(pcelink); @@ -619,13 +700,13 @@ public class PceCalculation { // store separately all SRG links directly azSrgs.add(destId); // connected to A/Z - if (!source.checkTP(pcelink.getSourceTP().toString())) { + if (!source.checkTP(pcelink.getSourceTP().getValue())) { LOG.debug( "validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink); return false; } - if (source.getXpdrClient(pcelink.getSourceTP().toString()) != null) { - pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().toString())); + if (source.getXpdrClient(pcelink.getSourceTP().getValue()) != null) { + pcelink.setClientA(source.getXpdrClient(pcelink.getSourceTP().getValue())); } allPceLinks.put(linkId, pcelink); source.addOutgoingLink(pcelink); @@ -655,13 +736,15 @@ public class PceCalculation { switch (pceOtnLink.getlinkType()) { case OTNLINK: - if (dest.getXpdrClient(pceOtnLink.getDestTP().toString()) != null) { - pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().toString())); + if (source.getXpdrClient(pceOtnLink.getSourceTP().getValue()) != null) { + pceOtnLink.setClientA(source.getXpdrClient(pceOtnLink.getSourceTP().getValue())); + } + if (dest.getXpdrClient(pceOtnLink.getDestTP().getValue()) != null) { + pceOtnLink.setClientZ(dest.getXpdrClient(pceOtnLink.getDestTP().getValue())); } - allPceLinks.put(linkId, pceOtnLink); source.addOutgoingLink(pceOtnLink); - LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink); + LOG.debug("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink); break; default: LOG.warn("validateLink: link type is not supported {}", pceOtnLink); @@ -695,7 +778,7 @@ public class PceCalculation { private static void printNodesInfo(Map allPceNodes) { allPceNodes.forEach(((nodeId, pceNode) -> { - LOG.info("In printNodes in node {} : outgoing links {} ", pceNode.getNodeId().getValue(), + LOG.debug("In printNodes in node {} : outgoing links {} ", pceNode.getNodeId().getValue(), pceNode.getOutgoingLinks()); })); } @@ -715,12 +798,12 @@ public class PceCalculation { String moduleName = params[params.length - 1]; for (McCapabilities mcCapabitility : mcCapabilities) { if (mcCapabitility.getMcNodeName().contains("XPDR") - && mcCapabitility.getSlotWidthGranularity() != null) { - return mcCapabitility.getSlotWidthGranularity().getValue(); + && mcCapabitility.getSlotWidthGranularity() != null) { + return mcCapabitility.getSlotWidthGranularity().getValue().decimalValue(); } if (mcCapabitility.getMcNodeName().contains(moduleName) && mcCapabitility.getSlotWidthGranularity() != null) { - return mcCapabitility.getSlotWidthGranularity().getValue(); + return mcCapabitility.getSlotWidthGranularity().getValue().decimalValue(); } } return GridConstant.SLOT_WIDTH_50; @@ -741,12 +824,12 @@ public class PceCalculation { String moduleName = params[params.length - 1]; for (McCapabilities mcCapabitility : mcCapabilities) { if (mcCapabitility.getMcNodeName().contains("XPDR") - && mcCapabitility.getCenterFreqGranularity() != null) { - return mcCapabitility.getCenterFreqGranularity().getValue(); + && mcCapabitility.getCenterFreqGranularity() != null) { + return mcCapabitility.getCenterFreqGranularity().getValue().decimalValue(); } if (mcCapabitility.getMcNodeName().contains(moduleName) - && mcCapabitility.getCenterFreqGranularity() != null) { - return mcCapabitility.getCenterFreqGranularity().getValue(); + && mcCapabitility.getCenterFreqGranularity() != null) { + return mcCapabitility.getCenterFreqGranularity().getValue().decimalValue(); } } return GridConstant.SLOT_WIDTH_50;