X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2FPceSendingPceRPCs.java;h=08b46d744edc30a86cd5ff183a7b0ea1cb0421c2;hb=59cc97ad9cd8aa61b6730879dd448651a796c290;hp=4b6b05133d6e20ca7980abbdd31530dfffe380f8;hpb=56dd2add269f0fdc8efdc1e3bfece25301ba6a3f;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java b/pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java old mode 100755 new mode 100644 index 4b6b05133..08b46d744 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java @@ -9,23 +9,27 @@ package org.opendaylight.transportpce.pce; import org.opendaylight.transportpce.common.ResponseCodes; +import org.opendaylight.transportpce.common.mapping.PortMapping; import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.pce.constraints.OperatorConstraints; import org.opendaylight.transportpce.pce.constraints.PceConstraints; import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc; -import org.opendaylight.transportpce.pce.gnpy.ConnectToGnpyServer; import org.opendaylight.transportpce.pce.gnpy.GnpyException; import org.opendaylight.transportpce.pce.gnpy.GnpyResult; import org.opendaylight.transportpce.pce.gnpy.GnpyUtilitiesImpl; +import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer; import org.opendaylight.transportpce.pce.graph.PceGraph; import org.opendaylight.transportpce.pce.networkanalyzer.PceCalculation; import org.opendaylight.transportpce.pce.networkanalyzer.PceResult; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev190624.PathComputationRequestInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev190624.PathComputationRequestInputBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev190624.service.path.rpc.result.PathDescriptionBuilder; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.AToZDirection; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.ZToADirection; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.RoutingConstraintsSp.PceMetric; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev171017.routing.constraints.sp.HardConstraints; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +37,7 @@ import org.slf4j.LoggerFactory; * Class for Sending * PCE requests : * - path-computation-request + * - path-computation-reroute * - cancel-resource-reserve. * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange * @@ -58,20 +63,38 @@ public class PceSendingPceRPCs { private Boolean success; private String message; private String responseCode; + private final GnpyConsumer gnpyConsumer; + private PortMapping portMapping; + // Define the termination points whose reservation status is not taken into account during the pruning process + private Endpoints endpoints; - public PceSendingPceRPCs() { + public PceSendingPceRPCs(GnpyConsumer gnpyConsumer) { setPathDescription(null); this.input = null; this.networkTransaction = null; + this.gnpyConsumer = gnpyConsumer; } - public PceSendingPceRPCs(PathComputationRequestInput input, - NetworkTransactionService networkTransaction) { + public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction, + GnpyConsumer gnpyConsumer, PortMapping portMapping) { + this.gnpyConsumer = gnpyConsumer; setPathDescription(null); - // TODO compliance check to check that input is not empty this.input = input; this.networkTransaction = networkTransaction; + this.portMapping = portMapping; + this.endpoints = null; + } + + public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction, + GnpyConsumer gnpyConsumer, PortMapping portMapping, + Endpoints endpoints) { + this.gnpyConsumer = gnpyConsumer; + setPathDescription(null); + this.input = input; + this.networkTransaction = networkTransaction; + this.portMapping = portMapping; + this.endpoints = endpoints; } public void cancelResourceReserve() { @@ -81,30 +104,33 @@ public class PceSendingPceRPCs { // sleep for 10s Thread.sleep(10000); } catch (InterruptedException e) { - LOG.error(e.toString()); + LOG.error("in PCESendingPceRPC: ",e); } success = true; LOG.info("cancelResourceReserve ..."); } - public void pathComputationWithConstraints(PceConstraints hardConstraints, PceConstraints softConstraints) { + private void pathComputationWithConstraints(PceConstraints hardConstraints, PceConstraints softConstraints, + PceConstraintMode mode) { - PceCalculation nwAnalizer = - new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc); - nwAnalizer.calcPath(); + PceCalculation nwAnalizer = new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc, + portMapping, endpoints); + nwAnalizer.retrievePceNetwork(); rc = nwAnalizer.getReturnStructure(); + String serviceType = nwAnalizer.getServiceType(); if (!rc.getStatus()) { - LOG.error("In pathComputationWithConstraints, nwAnalizer: result = {}", rc.toString()); + LOG.error("In pathComputationWithConstraints, nwAnalizer: result = {}", rc); return; } + OperatorConstraints opConstraints = new OperatorConstraints(networkTransaction); LOG.info("PceGraph ..."); - PceGraph graph = new PceGraph(nwAnalizer.getaendPceNode(), - nwAnalizer.getzendPceNode(), nwAnalizer.getAllPceNodes(), - hardConstraints, softConstraints, rc); + PceGraph graph = new PceGraph(nwAnalizer.getaendPceNode(), nwAnalizer.getzendPceNode(), + nwAnalizer.getAllPceNodes(), nwAnalizer.getAllPceLinks(), hardConstraints, + rc, serviceType, networkTransaction, mode, opConstraints.getBitMapConstraint(input.getCustomerName())); graph.calcPath(); rc = graph.getReturnStructure(); if (!rc.getStatus()) { - LOG.warn("In pathComputation : Graph return without Path "); + LOG.warn("In pathComputationWithConstraints : Graph return without Path "); // TODO fix. This is quick workaround for algorithm problem if ((rc.getLocalCause() == PceResult.LocalCause.TOO_HIGH_LATENCY) && (hardConstraints.getPceMetrics() == PceMetric.HopCount) @@ -112,8 +138,14 @@ public class PceSendingPceRPCs { hardConstraints.setPceMetrics(PceMetric.PropagationDelay); graph = patchRerunGraph(graph); } + + if (rc.getLocalCause() == PceResult.LocalCause.HD_NODE_INCLUDE) { + graph.setKpathsToBring(graph.getKpathsToBring() * 10); + graph = patchRerunGraph(graph); + } + if (!rc.getStatus()) { - LOG.error("In pathComputationWithConstraints, graph.calcPath: result = {}", rc.toString()); + LOG.error("In pathComputationWithConstraints, graph.calcPath: result = {}", rc); return; } } @@ -122,8 +154,7 @@ public class PceSendingPceRPCs { description.buildDescriptions(); rc = description.getReturnStructure(); if (!rc.getStatus()) { - LOG.error("In pathComputationWithConstraints, description: result = {}", rc.toString()); - return; + LOG.error("In pathComputationWithConstraints, description: result = {}", rc); } } @@ -132,7 +163,7 @@ public class PceSendingPceRPCs { PceConstraintsCalc constraints = new PceConstraintsCalc(input, networkTransaction); pceHardConstraints = constraints.getPceHardConstraints(); pceSoftConstraints = constraints.getPceSoftConstraints(); - pathComputationWithConstraints(pceHardConstraints, pceSoftConstraints); + pathComputationWithConstraints(pceHardConstraints, pceSoftConstraints, PceConstraintMode.Loose); this.success = rc.getStatus(); this.message = rc.getMessage(); this.responseCode = rc.getResponseCode(); @@ -144,10 +175,11 @@ public class PceSendingPceRPCs { ztoa = rc.getZtoADirection(); } + //Connect to Gnpy to check path feasibility and recompute another path in case of path non-feasibility try { - ConnectToGnpyServer connectToGnpy = new ConnectToGnpyServer(); - if (connectToGnpy.isGnpyURLExist()) { - GnpyUtilitiesImpl gnpy = new GnpyUtilitiesImpl(networkTransaction, input); + if (gnpyConsumer.isAvailable()) { + GnpyUtilitiesImpl gnpy = new GnpyUtilitiesImpl(networkTransaction, input, + gnpyConsumer); if (rc.getStatus() && gnpyToCheckFeasiblity(atoz,ztoa,gnpy)) { setPathDescription(new PathDescriptionBuilder().setAToZDirection(atoz).setZToADirection(ztoa)); return; @@ -155,19 +187,16 @@ public class PceSendingPceRPCs { callGnpyToComputeNewPath(gnpy); } else { setPathDescription(new PathDescriptionBuilder().setAToZDirection(atoz).setZToADirection(ztoa)); - return; } } catch (GnpyException e) { LOG.error("Exception raised by GNPy {}",e.getMessage()); setPathDescription(new PathDescriptionBuilder().setAToZDirection(atoz).setZToADirection(ztoa)); - return; } - return; } private boolean gnpyToCheckFeasiblity(AToZDirection atoz, ZToADirection ztoa, GnpyUtilitiesImpl gnpy) - throws GnpyException, Exception { + throws GnpyException { //Call GNPy for path verification if (gnpy.verifyComputationByGnpy(atoz, ztoa, pceHardConstraints)) { @@ -179,12 +208,12 @@ public class PceSendingPceRPCs { return false; } - private void callGnpyToComputeNewPath(GnpyUtilitiesImpl gnpy) throws GnpyException, Exception { + private void callGnpyToComputeNewPath(GnpyUtilitiesImpl gnpy) throws GnpyException { //Call GNPy in the case of non feasibility LOG.info("In pceSendingPceRPC: the path is not feasible according to Gnpy"); HardConstraints gnpyPathAsHC = null; - gnpyPathAsHC = gnpy.askNewPathFromGnpy(gnpyPathAsHC, pceHardConstraints); + gnpyPathAsHC = gnpy.askNewPathFromGnpy(pceHardConstraints); if (gnpyPathAsHC == null) { LOG.info("In pceSendingPceRPC: GNPy failed to find another path"); this.success = false; @@ -198,13 +227,17 @@ public class PceSendingPceRPCs { LOG.info("In pceSendingPceRPC: GNPy succeed to find another path"); // Compute the path PathComputationRequestInput inputFromGnpy = new PathComputationRequestInputBuilder() - .setServiceName(input.getServiceName()).setHardConstraints(gnpyPathAsHC) - .setSoftConstraints(input.getSoftConstraints()).setPceMetric(PceMetric.HopCount) - .setServiceAEnd(input.getServiceAEnd()).setServiceZEnd(input.getServiceZEnd()).build(); + .setServiceName(input.getServiceName()) + .setHardConstraints(gnpyPathAsHC) + .setSoftConstraints(input.getSoftConstraints()) + .setPceRoutingMetric(PceMetric.HopCount) + .setServiceAEnd(input.getServiceAEnd()) + .setServiceZEnd(input.getServiceZEnd()) + .build(); PceConstraintsCalc constraintsGnpy = new PceConstraintsCalc(inputFromGnpy, networkTransaction); PceConstraints gnpyHardConstraints = constraintsGnpy.getPceHardConstraints(); PceConstraints gnpySoftConstraints = constraintsGnpy.getPceSoftConstraints(); - pathComputationWithConstraints(gnpyHardConstraints, gnpySoftConstraints); + pathComputationWithConstraints(gnpyHardConstraints, gnpySoftConstraints, PceConstraintMode.Strict); AToZDirection atoz = rc.getAtoZDirection(); ZToADirection ztoa = rc.getZtoADirection(); if (gnpyToCheckFeasiblity(atoz, ztoa,gnpy)) { @@ -224,7 +257,7 @@ public class PceSendingPceRPCs { private PceGraph patchRerunGraph(PceGraph graph) { LOG.info("In pathComputation patchRerunGraph : rerun Graph with metric = PROPAGATION-DELAY "); - graph.setConstrains(pceHardConstraints, pceSoftConstraints); + graph.setConstrains(pceHardConstraints); graph.calcPath(); return graph; }