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=0ec90b7c81b2c609c711a2c199b711e79ee15a99;hb=62fc6625966276207a38955eaf07988f77f6984f;hp=b0fe7c08ab9761240cedd5f63b759d949ee469c2;hpb=738d0daf16440e92fc7b111d3db83b42573c705a;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 b0fe7c08a..0ec90b7c8 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 @@ -17,13 +17,15 @@ 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; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.pce.constraints.PceConstraints; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev190624.PathComputationRequestInput; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmNodeType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; @@ -36,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +//import org.opendaylight.yangtools.yang.common.Decimal64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,6 +51,10 @@ public class PceCalculation { private PathComputationRequestInput input; private String anodeId = ""; private String znodeId = ""; + private String serviceFormatA = ""; + private String serviceFormatZ = ""; + private String serviceType = ""; + private Long serviceRate = 0L; private PceConstraints pceHardConstraints; @@ -64,7 +71,7 @@ public class PceCalculation { // this List serves graph calculation private Map allPceNodes = new HashMap(); - // this List serves calculation of ZtoA path descritopn + // this List serves calculation of ZtoA path description // TODO maybe better solution is possible private Map allPceLinks = new HashMap(); private Set linksToExclude = new HashSet(); @@ -84,22 +91,20 @@ public class PceCalculation { parseInput(); } - public void calcPath() { + public void retrievePceNetwork() { - LOG.info("In PceCalculation calcPath: "); + LOG.info("In PceCalculation retrieveNetwork: "); if (!readMdSal()) { returnStructure.setRC(ResponseCodes.RESPONSE_FAILED); return; } - MapUtils.mapDiversityConstraints(allNodes, allLinks, pceHardConstraints); if (!analyzeNw()) { returnStructure.setRC(ResponseCodes.RESPONSE_FAILED); return; } - printNodesInfo(allPceNodes); returnStructure.setRC(ResponseCodes.RESPONSE_OK); @@ -109,16 +114,77 @@ public class PceCalculation { private boolean parseInput() { anodeId = input.getServiceAEnd().getNodeId(); znodeId = input.getServiceZEnd().getNodeId(); + if (input.getServiceAEnd().getServiceFormat() == null || input.getServiceZEnd().getServiceFormat() == null + || input.getServiceAEnd().getServiceRate() == null) { + LOG.error("Service Format and Service Rate are required for a path calculation"); + return false; + } + serviceFormatA = input.getServiceAEnd().getServiceFormat().getName(); + serviceFormatZ = input.getServiceZEnd().getServiceFormat().getName(); + serviceRate = input.getServiceAEnd().getServiceRate(); + LOG.info("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId); + if (!(serviceFormatA.equals(serviceFormatZ))) { + LOG.info("parseInput: different service format for A and Z not handled, will use service format from Aend"); + } else if (serviceRate == 100L) { + switch (serviceFormatA) { + case "Ethernet": + case "OC": + serviceType = "100GE"; + break; + case "OTU": + serviceType = "OTU4"; + break; + case "ODU": + serviceType = "ODU4"; + break; + default: + LOG.debug("parseInput: unsupported service type: Format {} Rate 100L", serviceFormatA); + break; + } + //switch(serviceRate) may seem a better option at first glance. + //But switching on Long or long is not directly possible in Java. + //And casting to int bumps the limit here. + //Passing by ENUM or String are possible alternatives. + //Maybe HashMap and similar options should also be considered here. + } else if (serviceFormatA == "Ethernet") { + //only rate 100L is currently supported except in Ethernet + if (serviceRate == 10L) { + serviceType = "10GE"; + } else if (serviceRate == 1L) { + serviceType = "1GE"; + } else { + LOG.debug("parseInput: unsupported service type: Format Ethernet Rate {}", String.valueOf(serviceRate)); + } + } else { + LOG.debug("parseInput: unsupported service type: Format {} Rate {}", + serviceFormatA, String.valueOf(serviceRate)); + } + returnStructure.setRate(input.getServiceAEnd().getServiceRate()); + returnStructure.setServiceFormat(input.getServiceAEnd().getServiceFormat()); return true; } private boolean readMdSal() { - LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID); - InstanceIdentifier nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) - .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); + InstanceIdentifier nwInstanceIdentifier = null; Network nw = null; + if (("OC".equals(serviceFormatA)) || ("OTU".equals(serviceFormatA)) || (("Ethernet".equals(serviceFormatA)) + && (serviceRate == 100L))) { + + LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID); + nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); + } else if ("ODU".equals(serviceFormatA) || ("Ethernet".equals(serviceFormatA) && serviceRate == 10L) + || ("Ethernet".equals(serviceFormatA) && serviceRate == 1L)) { + LOG.info("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID); + nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build(); + } else { + LOG.info("readMdSal: service-rate {} / service-format not handled {}", serviceRate, serviceFormatA); + return false; + } + try { Optional nwOptional = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier).get(); @@ -131,7 +197,7 @@ public class PceCalculation { networkTransactionService.close(); returnStructure.setRC(ResponseCodes.RESPONSE_FAILED); throw new RuntimeException( - "readMdSal: Error reading from operational store, topology : " + nwInstanceIdentifier + " :" + e); + "readMdSal: Error reading from operational store, topology : " + nwInstanceIdentifier + " :" + e); } networkTransactionService.close(); @@ -139,10 +205,15 @@ public class PceCalculation { LOG.error("readMdSal: network is null: {}", nwInstanceIdentifier); return false; } - allNodes = nw.getNode(); + allNodes = nw.getNode().stream().sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId() + .getValue())).collect(Collectors.toList()); Network1 nw1 = nw.augmentation(Network1.class); - - allLinks = nw1.getLink(); + if (nw1 != null) { + allLinks = nw1.getLink().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; @@ -164,34 +235,52 @@ public class PceCalculation { LOG.debug("analyzeNw: allNodes size {}, allLinks size {}", allNodes.size(), allLinks.size()); - for (Node node : allNodes) { - validateNode(node); - } - LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); + if (("100GE".equals(serviceType)) || ("OTU4".equals(serviceType))) { + // 100GE service and OTU4 service are handled at the openroadm-topology layer + for (Node node : allNodes) { + validateNode(node); + } - if (aendPceNode == null || zendPceNode == null) { - LOG.error("analyzeNw: Error in reading nodes: A or Z do not present in the network"); - return false; - } + LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size()); - 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); + } + // 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); + } - LOG.debug("analyzeNw: addLinks size {}, dropLinks size {}", addLinks.size(), dropLinks.size()); + } else { + // ODU4, 10GE/ODU2e or 1GE/ODU0 services are handled at openroadm-otn layer - // 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 (Node node : allNodes) { + validateOtnNode(node); + } - for (PceLink link : addLinks) { - filteraddLinks(link); - } - for (PceLink link : dropLinks) { - filterdropLinks(link); + LOG.info("analyzeNw: allPceNodes {}", allPceNodes.toString()); + + 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); + } } LOG.info("analyzeNw: allPceNodes size {}, allPceLinks size {}", allPceNodes.size(), allPceLinks.size()); @@ -243,13 +332,7 @@ public class PceCalculation { } private boolean validateLink(Link link) { - - LOG.debug("validateLink: link {} ", link.toString()); - - if (linksToExclude.contains(link.getLinkId())) { - LOG.info("validateLink: Link is ignored due opposite link problem - {}", link.getLinkId().getValue()); - return false; - } + LOG.info("validateLink: link {} ", link.toString()); NodeId sourceId = link.getSource().getSourceNode(); NodeId destId = link.getDestination().getDestNode(); @@ -258,87 +341,127 @@ public class PceCalculation { if (source == null) { LOG.debug("validateLink: Link is ignored due source node is rejected by node validation - {}", - link.getSource().getSourceNode().getValue()); + link.getSource().getSourceNode().getValue()); return false; } if (dest == null) { LOG.debug("validateLink: Link is ignored due dest node is rejected by node validation - {}", - link.getDestination().getDestNode().getValue()); + link.getDestination().getDestNode().getValue()); return false; } - PceLink pcelink = new PceLink(link, source, dest); - if (!pcelink.isValid()) { - dropOppositeLink(link); - LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link"); - return false; - } + if (("100GE".equals(serviceType)) || ("OTU4".equals(serviceType))) { + // 100GE or OTU4 services are handled at WDM Layer + PceLink pcelink = new PceLink(link, source, dest); + if (!pcelink.isValid()) { + dropOppositeLink(link); + LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link"); + return false; + } + LinkId linkId = pcelink.getLinkId(); + switch (validateLinkConstraints(pcelink)) { + case HARD_EXCLUDE: + dropOppositeLink(link); + LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue()); + return false; + default: + break; + } + switch (pcelink.getlinkType()) { + case ROADMTOROADM: + case EXPRESSLINK: + allPceLinks.put(linkId, pcelink); + source.addOutgoingLink(pcelink); + LOG.debug("validateLink: {}-LINK added to allPceLinks {}", + pcelink.getlinkType(), pcelink.toString()); + break; + case ADDLINK: + pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString())); + addLinks.add(pcelink); + LOG.debug("validateLink: ADD-LINK saved {}", pcelink.toString()); + break; + case DROPLINK: + pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString())); + dropLinks.add(pcelink); + LOG.debug("validateLink: DROP-LINK saved {}", pcelink.toString()); + break; + case XPONDERINPUT: + // store separately all SRG links directly + azSrgs.add(sourceId); + // connected to A/Z + if (!dest.checkTP(pcelink.getDestTP().toString())) { + LOG.debug( + "validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink.toString()); + return false; + } + if (dest.getXpdrClient(pcelink.getDestTP().toString()) != null) { + pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().toString())); + } + allPceLinks.put(linkId, pcelink); + source.addOutgoingLink(pcelink); + LOG.debug("validateLink: XPONDER-INPUT link added to allPceLinks {}", pcelink.toString()); + break; + // does it mean XPONDER==>>SRG ? + case XPONDEROUTPUT: + // store separately all SRG links directly + azSrgs.add(destId); + // connected to A/Z + if (!source.checkTP(pcelink.getSourceTP().toString())) { + LOG.debug( + "validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink.toString()); + return false; + } + if (source.getXpdrClient(pcelink.getSourceTP().toString()) != null) { + pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().toString())); + } + allPceLinks.put(linkId, pcelink); + source.addOutgoingLink(pcelink); + LOG.debug("validateLink: XPONDER-OUTPUT link added to allPceLinks {}", pcelink.toString()); + break; + default: + LOG.warn("validateLink: link type is not supported {}", pcelink.toString()); + } + return true; - LinkId linkId = pcelink.getLinkId(); + } else if (("ODU4".equals(serviceType)) || ("10GE".equals(serviceType)) || ("1GE".equals(serviceType))) { + // ODU4, 1GE and 10GE services relying on ODU2, ODU2e or ODU0 services are handled at OTN layer + PceLink pceOtnLink = new PceLink(link, source, dest); - switch (validateLinkConstraints(pcelink)) { - case HARD_EXCLUDE : + if (!pceOtnLink.isOtnValid(link, serviceType)) { dropOppositeLink(link); - LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue()); + LOG.error(" validateLink: Link is ignored due errors in network data or in opposite link"); return false; - default: - break; - } + } - switch (pcelink.getlinkType()) { - case ROADMTOROADM : - allPceLinks.put(linkId, pcelink); - source.addOutgoingLink(pcelink); - LOG.debug("validateLink: ROADMTOROADM-LINK added to allPceLinks {}", pcelink.toString()); - break; - case EXPRESSLINK : - allPceLinks.put(linkId, pcelink); - source.addOutgoingLink(pcelink); - LOG.debug("validateLink: EXPRESS-LINK added to allPceLinks {}", pcelink.toString()); - break; - case ADDLINK : - pcelink.setClient(source.getRdmSrgClient(pcelink.getSourceTP().toString(), true)); - addLinks.add(pcelink); - LOG.debug("validateLink: ADD-LINK saved {}", pcelink.toString()); - break; - case DROPLINK : - pcelink.setClient(dest.getRdmSrgClient(pcelink.getDestTP().toString(), false)); - dropLinks.add(pcelink); - LOG.debug("validateLink: DROP-LINK saved {}", pcelink.toString()); - break; - case XPONDERINPUT : - // store separately all SRG links directly - azSrgs.add(sourceId); - // connected to A/Z - if (!dest.checkTP(pcelink.getDestTP().toString())) { - LOG.debug("validateLink: XPONDER-INPUT is rejected as NW port is busy - {} ", pcelink.toString()); + LinkId linkId = pceOtnLink.getLinkId(); + switch (validateLinkConstraints(pceOtnLink)) { + case HARD_EXCLUDE: + dropOppositeLink(link); + LOG.debug("validateLink: constraints : link is ignored == {}", linkId.getValue()); return false; - } - pcelink.setClient(dest.getClient(pcelink.getDestTP().toString())); - allPceLinks.put(linkId, pcelink); - source.addOutgoingLink(pcelink); - LOG.debug("validateLink: XPONDER-INPUT link added to allPceLinks {}", pcelink.toString()); - break; - // does it mean XPONDER==>>SRG ? - case XPONDEROUTPUT : - // store separately all SRG links directly - azSrgs.add(destId); - // connected to A/Z - if (!source.checkTP(pcelink.getSourceTP().toString())) { - LOG.debug("validateLink: XPONDER-OUTPUT is rejected as NW port is busy - {} ", pcelink.toString()); - return false; - } - pcelink.setClient(source.getClient(pcelink.getSourceTP().toString())); - allPceLinks.put(linkId, pcelink); - source.addOutgoingLink(pcelink); - LOG.debug("validateLink: XPONDER-OUTPUT link added to allPceLinks {}", pcelink.toString()); - break; - default: - LOG.warn("validateLink: link type is not supported {}", pcelink.toString()); + default: + break; + } + switch (pceOtnLink.getlinkType()) { + case OTNLINK: + if (dest.getXpdrClient(pceOtnLink.getDestTP().toString()) != null) { + pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().toString())); + } + + allPceLinks.put(linkId, pceOtnLink); + source.addOutgoingLink(pceOtnLink); + LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink.toString()); + break; + default: + LOG.warn("validateLink: link type is not supported {}", pceOtnLink.toString()); + } + return true; + } else { + LOG.error(" validateLink: Unmanaged service type {}", serviceType); + return false; } - return true; } private boolean validateNode(Node node) { @@ -351,7 +474,8 @@ public class PceCalculation { } OpenroadmNodeType nodeType = node1.getNodeType(); - PceNode pceNode = new PceNode(node,nodeType,node.getNodeId()); + PceOpticalNode pceNode = new PceOpticalNode(node, nodeType, node.getNodeId(), + input.getServiceAEnd().getServiceFormat(), "optical"); pceNode.validateAZxponder(anodeId, znodeId); pceNode.initWLlist(); @@ -361,17 +485,18 @@ public class PceCalculation { } switch (validateNodeConstraints(pceNode)) { - case HARD_EXCLUDE : + case HARD_EXCLUDE: return false; - default : + default: break; } - - if ((pceNode.getSupNodeIdPceNode().equals(anodeId)) && (endPceNode(nodeType,pceNode.getNodeId(), pceNode))) { + if ((pceNode.getSupNetworkNodeId().equals(anodeId) && (this.aendPceNode == null)) + && (endPceNode(nodeType, pceNode.getNodeId(), pceNode))) { this.aendPceNode = pceNode; } - if ((pceNode.getSupNodeIdPceNode().equals(znodeId)) && (endPceNode(nodeType,pceNode.getNodeId(), pceNode))) { + if ((pceNode.getSupNetworkNodeId().equals(znodeId) && (this.zendPceNode == null)) + && (endPceNode(nodeType, pceNode.getNodeId(), pceNode))) { this.zendPceNode = pceNode; } @@ -380,21 +505,62 @@ public class PceCalculation { return true; } - private ConstraintTypes validateNodeConstraints(PceNode pcenode) { + private boolean validateOtnNode(Node node) { - if (pceHardConstraints.getExcludeSupNodes().isEmpty() && pceHardConstraints.getExcludeCLLI().isEmpty()) { - return ConstraintTypes.NONE; + 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 (!pceOtnNode.isValid()) { + LOG.warn(" validateOtnNode: Node {} is ignored", node.getNodeId().getValue()); + return false; + } + switch (validateNodeConstraints(pceOtnNode)) { + case HARD_EXCLUDE: + return false; + default: + break; + } + 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()); + return true; + } else { + LOG.error("ValidateOtnNode: no node-type augmentation. Node {} is ignored", node.getNodeId().getValue()); + return false; } - if (pceHardConstraints.getExcludeSupNodes().contains(pcenode.getSupNodeIdPceNode())) { +// if (mode == "AZ") { +// pceOtnNode.validateAZxponder(anodeId, znodeId); +// } else if (mode == "intermediate") { +// pceOtnNode.validateIntermediateSwitch(); +// } else { +// LOG.error("validateOtnNode: unproper mode passed to the method : {} not supported", mode); +// return null; +// } + } + + private ConstraintTypes validateNodeConstraints(PceNode pcenode) { + if (pceHardConstraints.getExcludeSupNodes().isEmpty() && pceHardConstraints.getExcludeCLLI().isEmpty()) { + return ConstraintTypes.NONE; + } + if (pceHardConstraints.getExcludeSupNodes().contains(pcenode.getSupNetworkNodeId())) { LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); return ConstraintTypes.HARD_EXCLUDE; } - if (pceHardConstraints.getExcludeCLLI().contains(pcenode.getCLLI())) { + if (pceHardConstraints.getExcludeCLLI().contains(pcenode.getSupClliNodeId())) { LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue()); return ConstraintTypes.HARD_EXCLUDE; } - return ConstraintTypes.NONE; } @@ -429,22 +595,25 @@ public class PceCalculation { } } - private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceNode pceNode) { - Boolean add = true; + private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceOpticalNode pceNode) { switch (openroadmNodeType) { - case SRG : + case SRG: pceNode.initSrgTps(); this.azSrgs.add(nodeId); break; - case XPONDER : + case XPONDER: pceNode.initXndrTps(); break; default: - add = false; LOG.warn("endPceNode: Node {} is not SRG or XPONDER !", nodeId); - break; + return false; + } + + if (!pceNode.isValid()) { + LOG.error("validateNode : there are no availaible wavelengths in node {}", pceNode.getNodeId().getValue()); + return false; } - return add; + return true; } public PceNode getaendPceNode() { @@ -463,6 +632,10 @@ public class PceCalculation { return this.allPceLinks; } + public String getServiceType() { + return serviceType; + } + public PceResult getReturnStructure() { return returnStructure; } @@ -475,12 +648,4 @@ public class PceCalculation { LOG.info("In printNodes in node {} : outgoing links {} ", pcenode.getNodeId().getValue(), links.toString()); } } - - /*private static void printLinksInfo(Map allpcelinks) { - Iterator> links = allpcelinks.entrySet().iterator(); - while (links.hasNext()) { - LOG.info("In printLinksInfo link {} : ", links.next().getValue().toString()); - } - }*/ - }