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.GnpyException;
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.rev200128.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.service.path.rpc.result.PathDescriptionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.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;
* 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
*
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(GnpyConsumer gnpyConsumer) {
setPathDescription(null);
this.gnpyConsumer = gnpyConsumer;
}
- public PceSendingPceRPCs(PathComputationRequestInput input,
- NetworkTransactionService networkTransaction, GnpyConsumer gnpyConsumer, PortMapping portMapping) {
+ 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() {
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, portMapping);
+ PceCalculation nwAnalizer = new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc,
+ portMapping, endpoints);
nwAnalizer.retrievePceNetwork();
rc = nwAnalizer.getReturnStructure();
String serviceType = nwAnalizer.getServiceType();
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, serviceType);
+ 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()) {
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();
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)) {
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;
}