X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fservice%2FPathComputationServiceImpl.java;h=3d34aa1d2d9bd5dabd6af21df692a334b605a19f;hb=703ea2446974f96c2b57cd96c2d55edd4b3f99b2;hp=24ec30ff404eeab453df8520f2fb82d41ee5c609;hpb=952583aa9f0de2de04f230291a5989413591a7b7;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java b/pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java index 24ec30ff4..3d34aa1d2 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java @@ -17,43 +17,51 @@ import java.util.concurrent.Callable; import java.util.concurrent.Executors; import java.util.stream.Collectors; import org.opendaylight.mdsal.binding.api.NotificationPublishService; +import org.opendaylight.transportpce.common.mapping.PortMapping; import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.pce.PceComplianceCheck; import org.opendaylight.transportpce.pce.PceComplianceCheckResult; import org.opendaylight.transportpce.pce.PceSendingPceRPCs; import org.opendaylight.transportpce.pce.gnpy.GnpyResult; import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer; -import org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result.Response; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.CancelResourceReserveInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.CancelResourceReserveOutput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.CancelResourceReserveOutputBuilder; -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.PathComputationRequestOutput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestOutputBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.ServicePathRpcResult; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.ServicePathRpcResultBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.GnpyResponse; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.GnpyResponseBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.gnpy.response.ResponseType; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.gnpy.response.response.type.NoPathCase; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.gnpy.response.response.type.NoPathCaseBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.gnpy.response.response.type.PathCase; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.gnpy.gnpy.response.response.type.PathCaseBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.path.performance.PathProperties; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.path.performance.PathPropertiesBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.path.performance.path.properties.PathMetric; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.path.performance.path.properties.PathMetricBuilder; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.service.path.rpc.result.PathDescription; -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.openroadm.common.service.types.rev190531.configuration.response.common.ConfigurationResponseCommonBuilder; -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.service.types.rev200128.RpcStatusEx; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.ServicePathNotificationTypes; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.response.parameters.sp.ResponseParametersBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.Response; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutputBuilder; +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.PathComputationRequestInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResult; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResultBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.GnpyResponse; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.GnpyResponseBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.gnpy.response.response.type.NoPathCaseBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.gnpy.response.response.type.PathCaseBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.PathPropertiesBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.path.properties.PathMetric; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.path.properties.PathMetricBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder; +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.RpcStatusEx; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Component(immediate = true) public class PathComputationServiceImpl implements PathComputationService { private static final Logger LOG = LoggerFactory.getLogger(PathComputationServiceImpl.class); @@ -62,32 +70,36 @@ public class PathComputationServiceImpl implements PathComputationService { private final ListeningExecutorService executor; private ServicePathRpcResult notification = null; private final GnpyConsumer gnpyConsumer; + private PortMapping portMapping; - public PathComputationServiceImpl(NetworkTransactionService networkTransactionService, - NotificationPublishService notificationPublishService, - GnpyConsumer gnpyConsumer) { + @Activate + public PathComputationServiceImpl(@Reference NetworkTransactionService networkTransactionService, + @Reference NotificationPublishService notificationPublishService, + @Reference GnpyConsumer gnpyConsumer, + @Reference PortMapping portMapping) { this.notificationPublishService = notificationPublishService; this.networkTransactionService = networkTransactionService; this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5)); this.gnpyConsumer = gnpyConsumer; - } - - public void init() { - LOG.info("init ..."); - } - - public void close() { - LOG.info("close."); + this.portMapping = portMapping; + LOG.info("PathComputationServiceImpl instantiated"); } @SuppressFBWarnings( value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "false positive, this method is used by public method cancelResourceReserve") - private void sendNotifications(ServicePathNotificationTypes servicePathNotificationTypes, String serviceName, - RpcStatusEx rpcStatusEx, String message, PathDescription pathDescription) { + private void sendNotifications( + ServicePathNotificationTypes servicePathNotificationTypes, + String serviceName, + RpcStatusEx rpcStatusEx, + String message, + PathDescription pathDescription) { ServicePathRpcResultBuilder servicePathRpcResultBuilder = - new ServicePathRpcResultBuilder().setNotificationType(servicePathNotificationTypes) - .setServiceName(serviceName).setStatus(rpcStatusEx).setStatusMessage(message); + new ServicePathRpcResultBuilder() + .setNotificationType(servicePathNotificationTypes) + .setServiceName(serviceName) + .setStatus(rpcStatusEx) + .setStatusMessage(message); if (pathDescription != null) { servicePathRpcResultBuilder.setPathDescription(pathDescription); } @@ -106,34 +118,40 @@ public class PathComputationServiceImpl implements PathComputationService { @Override public CancelResourceReserveOutput call() throws Exception { - String message = ""; - sendNotifications(ServicePathNotificationTypes.CancelResourceReserve, input.getServiceName(), - RpcStatusEx.Pending, "Service compliant, submitting cancelResourceReserve Request ...", null); + sendNotifications( + ServicePathNotificationTypes.CancelResourceReserve, + input.getServiceName(), + RpcStatusEx.Pending, + "Service compliant, submitting cancelResourceReserve Request ...", + null); PceSendingPceRPCs sendingPCE = new PceSendingPceRPCs(gnpyConsumer); sendingPCE.cancelResourceReserve(); - if (Boolean.TRUE.equals(sendingPCE.getSuccess())) { - message = "ResourceReserve cancelled !"; - } else { - message = "Cancelling ResourceReserve failed !"; - } - LOG.info("in PathComputationServiceImpl : {}",message); - sendNotifications(ServicePathNotificationTypes.CancelResourceReserve, input.getServiceName(), - RpcStatusEx.Successful, "cancel Resource Reserve successful!", null); - ConfigurationResponseCommonBuilder configurationResponseCommon = - new ConfigurationResponseCommonBuilder(); - configurationResponseCommon.setAckFinalIndicator("Yes") - .setRequestId(input.getServiceHandlerHeader().getRequestId()).setResponseCode("200") - .setResponseMessage(""); - CancelResourceReserveOutputBuilder output = new CancelResourceReserveOutputBuilder(); - output.setConfigurationResponseCommon(configurationResponseCommon.build()); - return output.build(); + LOG.info("in PathComputationServiceImpl : {}", + Boolean.TRUE.equals(sendingPCE.getSuccess()) + ? "ResourceReserve cancelled !" + : "Cancelling ResourceReserve failed !"); + sendNotifications( + ServicePathNotificationTypes.CancelResourceReserve, + input.getServiceName(), + RpcStatusEx.Successful, + "cancel Resource Reserve successful!", + null); + return new CancelResourceReserveOutputBuilder() + .setConfigurationResponseCommon( + new ConfigurationResponseCommonBuilder() + .setAckFinalIndicator("Yes") + .setRequestId(input.getServiceHandlerHeader().getRequestId()) + .setResponseCode("200") + .setResponseMessage("") + .build()) + .build(); } }); } @Override public ListenableFuture pathComputationRequest(PathComputationRequestInput input) { - LOG.info("pathComputationRequest"); + LOG.debug("input parameters are : input = {}", input.toString()); return executor.submit(new Callable() { @Override @@ -144,26 +162,33 @@ public class PathComputationServiceImpl implements PathComputationService { PceComplianceCheckResult check = PceComplianceCheck.check(input); if (!check.hasPassed()) { LOG.error("Path not calculated, service not compliant : {}", check.getMessage()); - sendNotifications(ServicePathNotificationTypes.PathComputationRequest, input.getServiceName(), - RpcStatusEx.Failed, "Path not calculated, service not compliant", null); - configurationResponseCommon.setAckFinalIndicator("Yes") + sendNotifications( + ServicePathNotificationTypes.PathComputationRequest, + input.getServiceName(), + RpcStatusEx.Failed, + "Path not calculated, service not compliant", + null); + configurationResponseCommon + .setAckFinalIndicator("Yes") .setRequestId(input.getServiceHandlerHeader().getRequestId()) - .setResponseCode("Path not calculated").setResponseMessage(check.getMessage()); - output.setConfigurationResponseCommon(configurationResponseCommon.build()) - .setResponseParameters(null); - return output.build(); + .setResponseCode("Path not calculated") + .setResponseMessage(check.getMessage()); + return output + .setConfigurationResponseCommon(configurationResponseCommon.build()) + .setResponseParameters(null) + .build(); } - sendNotifications(ServicePathNotificationTypes.PathComputationRequest, input.getServiceName(), - RpcStatusEx.Pending, "Service compliant, submitting pathComputation Request ...", null); - String message = ""; - String responseCode = ""; - PceSendingPceRPCs sendingPCE = new PceSendingPceRPCs(input, networkTransactionService, - gnpyConsumer); + sendNotifications( + ServicePathNotificationTypes.PathComputationRequest, + input.getServiceName(), + RpcStatusEx.Pending, + "Service compliant, submitting pathComputation Request ...", + null); + PceSendingPceRPCs sendingPCE = + new PceSendingPceRPCs(input, networkTransactionService, gnpyConsumer, portMapping); sendingPCE.pathComputation(); - message = sendingPCE.getMessage(); - responseCode = sendingPCE.getResponseCode(); - PathDescriptionBuilder path = null; - path = sendingPCE.getPathDescription(); + String message = sendingPCE.getMessage(); + String responseCode = sendingPCE.getResponseCode(); LOG.info("PCE response: {} {}", message, responseCode); //add the GNPy result @@ -178,43 +203,63 @@ public class PathComputationServiceImpl implements PathComputationService { GnpyResponse respZtoA = generateGnpyResponse(gnpyZtoA.getResponse(),"Z-to-A"); listResponse.add(respZtoA); } - output.setGnpyResponse(listResponse.stream() - .collect(Collectors.toMap(GnpyResponse::key, gnpyResponse -> gnpyResponse))); + output + .setGnpyResponse( + listResponse.stream() + .collect(Collectors.toMap(GnpyResponse::key, gnpyResponse -> gnpyResponse))); + PathDescriptionBuilder path = sendingPCE.getPathDescription(); if (Boolean.FALSE.equals(sendingPCE.getSuccess()) || (path == null)) { - configurationResponseCommon.setAckFinalIndicator("Yes") - .setRequestId(input.getServiceHandlerHeader().getRequestId()).setResponseCode(responseCode) - .setResponseMessage(message); - output.setConfigurationResponseCommon(configurationResponseCommon.build()); - sendNotifications(ServicePathNotificationTypes.PathComputationRequest, input.getServiceName(), - RpcStatusEx.Failed, "Path not calculated", null); - return output.build(); + sendNotifications( + ServicePathNotificationTypes.PathComputationRequest, + input.getServiceName(), + RpcStatusEx.Failed, + "Path not calculated", + null); + return output + .setConfigurationResponseCommon( + configurationResponseCommon + .setAckFinalIndicator("Yes") + .setRequestId(input.getServiceHandlerHeader().getRequestId()) + .setResponseCode(responseCode) + .setResponseMessage(message) + .build()) + .build(); } // Path calculator returned Success - configurationResponseCommon.setAckFinalIndicator("Yes") - .setRequestId(input.getServiceHandlerHeader().getRequestId()).setResponseCode(responseCode) - .setResponseMessage(message); - PathDescription pathDescription = new org.opendaylight.yang.gen.v1.http.org.opendaylight - .transportpce.pce.rev200128.service.path.rpc.result.PathDescriptionBuilder() - .setAToZDirection(path.getAToZDirection()).setZToADirection(path.getZToADirection()) - .build(); - sendNotifications(ServicePathNotificationTypes.PathComputationRequest, input.getServiceName(), - RpcStatusEx.Successful, message, pathDescription); - org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.response - .parameters.sp.response.parameters.PathDescription pathDescription1 = new org.opendaylight.yang.gen - .v1.http.org.transportpce.b.c._interface.service.types.rev200128.response.parameters.sp - .response.parameters.PathDescriptionBuilder() - .setAToZDirection(path.getAToZDirection()).setZToADirection(path.getZToADirection()) - .build(); - ResponseParametersBuilder rpb = new ResponseParametersBuilder().setPathDescription(pathDescription1); - output.setConfigurationResponseCommon(configurationResponseCommon.build()) - .setResponseParameters(rpb.build()); - + PathDescription pathDescription = + new PathDescriptionBuilder() + .setAToZDirection(path.getAToZDirection()) + .setZToADirection(path.getZToADirection()) + .build(); + sendNotifications( + ServicePathNotificationTypes.PathComputationRequest, + input.getServiceName(), + RpcStatusEx.Successful, + message, + pathDescription); + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118 + .response.parameters.sp.response.parameters.PathDescription pathDescription1 = + new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118 + .response.parameters.sp.response.parameters.PathDescriptionBuilder() + .setAToZDirection(path.getAToZDirection()) + .setZToADirection(path.getZToADirection()) + .build(); + output + .setConfigurationResponseCommon( + configurationResponseCommon + .setAckFinalIndicator("Yes") + .setRequestId(input.getServiceHandlerHeader().getRequestId()) + .setResponseCode(responseCode) + .setResponseMessage(message) + .build()) + .setResponseParameters( + new ResponseParametersBuilder().setPathDescription(pathDescription1).build()); //debug prints AToZDirection atoz = pathDescription.getAToZDirection(); if ((atoz != null) && (atoz.getAToZ() != null)) { LOG.debug("Impl AtoZ Notification: [{}] elements in description", atoz.getAToZ().size()); - for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210 + for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501 .path.description.atoz.direction.AToZKey key : atoz.getAToZ().keySet()) { LOG.debug("Impl AtoZ Notification: [{}] {}", key, atoz.getAToZ().get(key)); } @@ -222,7 +267,7 @@ public class PathComputationServiceImpl implements PathComputationService { ZToADirection ztoa = pathDescription.getZToADirection(); if ((ztoa != null) && (ztoa.getZToA() != null)) { LOG.debug("Impl ZtoA Notification: [{}] elements in description", ztoa.getZToA().size()); - for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210 + for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501 .path.description.ztoa.direction.ZToAKey key : ztoa.getZToA().keySet()) { LOG.debug("Impl ZtoA Notification: [{}] {}", key, ztoa.getZToA().get(key)); } @@ -232,45 +277,113 @@ public class PathComputationServiceImpl implements PathComputationService { }); } - public GnpyResponse generateGnpyResponse(Response responseGnpy, String pathDir) { - ResponseType respType = null; - boolean feasible = true; - if (responseGnpy != null) { - if (responseGnpy.getResponseType() instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result - .response.response.type.NoPathCase) { - LOG.info("GNPy : path is not feasible"); - org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result.response.response.type.NoPathCase - noPathGnpy = (org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result.response.response.type - .NoPathCase) responseGnpy.getResponseType(); - NoPathCase noPathCase = new NoPathCaseBuilder().setNoPath(noPathGnpy.getNoPath()).build(); - respType = noPathCase; - feasible = false; - } else if (responseGnpy.getResponseType() instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result - .response.response.type.PathCase) { - LOG.info("GNPy : path is feasible"); - org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result.response.response.type.PathCase pathCase = - (org.opendaylight.yang.gen.v1.gnpy.path.rev200909.result.response.response.type.PathCase) - responseGnpy.getResponseType(); - List pathMetricList = - new ArrayList<>(pathCase.getPathProperties().getPathMetric().values()); - List gnpyPathMetricList = new ArrayList<>(); - for (org.opendaylight.yang.gen.v1.gnpy.path.rev200909.generic.path.properties.path.properties.PathMetric - pathMetricGnpy : pathMetricList) { - PathMetric pathMetric = new PathMetricBuilder().setMetricType(pathMetricGnpy.getMetricType()) - .setAccumulativeValue(pathMetricGnpy.getAccumulativeValue()).build(); - gnpyPathMetricList.add(pathMetric); - } - PathProperties pathProperties = new PathPropertiesBuilder() - .setPathMetric(gnpyPathMetricList.stream() - .collect(Collectors.toMap(PathMetric::key, pathMetric -> pathMetric))) + @Override + public ListenableFuture pathComputationRerouteRequest( + PathComputationRerouteRequestInput input) { + return executor.submit(() -> { + PathComputationRerouteRequestOutputBuilder output = new PathComputationRerouteRequestOutputBuilder(); + ConfigurationResponseCommonBuilder configurationResponseCommon = new ConfigurationResponseCommonBuilder() + .setRequestId("none"); + PceComplianceCheckResult check = PceComplianceCheck.check(input); + if (!check.hasPassed()) { + LOG.error("Path not calculated, path computation reroute request not compliant : {}", + check.getMessage()); + configurationResponseCommon + .setAckFinalIndicator("Yes") + .setResponseCode("Path not calculated") + .setResponseMessage(check.getMessage()); + return output + .setConfigurationResponseCommon(configurationResponseCommon.build()) .build(); - PathCase gnpyPathCase = new PathCaseBuilder().setPathProperties(pathProperties).build(); - respType = gnpyPathCase; - feasible = true; } + PathComputationRequestInput pathComputationInput = new PathComputationRequestInputBuilder() + .setServiceName("no_name") + .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("none").build()) + .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build()) + .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build()) + .setHardConstraints(input.getHardConstraints()) + .setPceRoutingMetric(input.getPceRoutingMetric()) + .setResourceReserve(false) + .setSoftConstraints(input.getSoftConstraints()) + .setRoutingMetric(input.getRoutingMetric()) + .build(); + PceSendingPceRPCs sendingPCE = new PceSendingPceRPCs(pathComputationInput, networkTransactionService, + gnpyConsumer, portMapping, input.getEndpoints()); + sendingPCE.pathComputation(); + String message = sendingPCE.getMessage(); + String responseCode = sendingPCE.getResponseCode(); + LOG.info("PCE response: {} {}", message, responseCode); + return output.setConfigurationResponseCommon( + configurationResponseCommon + .setAckFinalIndicator("Yes") + .setResponseCode(responseCode) + .setResponseMessage(message) + .build()) + .build(); + }); + } + + public GnpyResponse generateGnpyResponse(Response responseGnpy, String pathDir) { + if (responseGnpy == null) { + return new GnpyResponseBuilder() + .setPathDir(pathDir) + .setResponseType(null) + .setFeasibility(true) + .build(); + } + if (responseGnpy.getResponseType() + instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase) { + LOG.info("GNPy : path is not feasible"); + org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase + noPathGnpy = + (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase) + responseGnpy.getResponseType(); + return new GnpyResponseBuilder() + .setPathDir(pathDir) + .setResponseType( + new NoPathCaseBuilder() + .setNoPath(noPathGnpy.getNoPath()) + .build()) + .setFeasibility(false) + .build(); + } + if (responseGnpy.getResponseType() + instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase) { + LOG.info("GNPy : path is feasible"); + org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase + pathCase = + (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase) + responseGnpy.getResponseType(); + List + pathMetricList = + new ArrayList<>(pathCase.getPathProperties().getPathMetric().values()); + List gnpyPathMetricList = new ArrayList<>(); + for (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetric + pathMetricGnpy : pathMetricList) { + gnpyPathMetricList.add( + new PathMetricBuilder() + .setMetricType(pathMetricGnpy.getMetricType()) + .setAccumulativeValue(pathMetricGnpy.getAccumulativeValue()) + .build()); + } + return new GnpyResponseBuilder() + .setPathDir(pathDir) + .setResponseType( + new PathCaseBuilder() + .setPathProperties( + new PathPropertiesBuilder() + .setPathMetric(gnpyPathMetricList.stream() + .collect(Collectors.toMap(PathMetric::key, pathMetric -> pathMetric))) + .build()) + .build()) + .setFeasibility(true) + .build(); } - return new GnpyResponseBuilder().setPathDir(pathDir).setResponseType(respType).setFeasibility(feasible).build(); + return new GnpyResponseBuilder() + .setPathDir(pathDir) + .setResponseType(null) + .setFeasibility(true) + .build(); } }