X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=servicehandler%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fservicehandler%2Flisteners%2FRendererListenerImpl.java;h=1de11948fb34a071101fa130a08754552175a1d9;hb=e992d2f2b981e634e8bb865dbf72fafc06d91c2e;hp=50272fa418c5a6c12f36e4ced50bde6c8d6d23db;hpb=20f7e2f0391dd4cb85fc8a69b9c0fa12d12648fa;p=transportpce.git diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java index 50272fa41..1de11948f 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java @@ -8,6 +8,7 @@ package org.opendaylight.transportpce.servicehandler.listeners; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.util.ArrayList; import java.util.List; import java.util.Map; import org.opendaylight.mdsal.binding.api.NotificationPublishService; @@ -18,20 +19,28 @@ import org.opendaylight.transportpce.pce.service.PathComputationService; import org.opendaylight.transportpce.servicehandler.ServiceInput; import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper; import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ServiceNotificationTypes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services; -import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType; -import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService; -import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder; -import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder; -import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRpcResult; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRpcResultBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.PathComputationResultBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.path.computation.result.AToZBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.path.computation.result.ZToABuilder; +import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessService; +import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessServiceBuilder; +import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceAEndBuilder; +import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceZEndBuilder; +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; @@ -41,7 +50,8 @@ import org.slf4j.LoggerFactory; * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange * */ -public class RendererListenerImpl implements TransportpceRendererListener { +@Component +public class RendererListenerImpl implements TransportpceRendererListener, RendererListener { private static final String PUBLISHER = "RendererListener"; private static final Logger LOG = LoggerFactory.getLogger(RendererListenerImpl.class); @@ -54,8 +64,10 @@ public class RendererListenerImpl implements TransportpceRendererListener { private final NetworkModelService networkModelService; - public RendererListenerImpl(PathComputationService pathComputationService, - NotificationPublishService notificationPublishService, NetworkModelService networkModelService) { + @Activate + public RendererListenerImpl(@Reference PathComputationService pathComputationService, + @Reference NotificationPublishService notificationPublishService, + @Reference NetworkModelService networkModelService) { this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService); setServiceInput(null); setTempService(false); @@ -98,7 +110,7 @@ public class RendererListenerImpl implements TransportpceRendererListener { break; case Failed: LOG.error("Renderer service delete failed !"); - Services service = serviceDataStoreOperations.getService(input.getServiceName()).get(); + Services service = serviceDataStoreOperations.getService(input.getServiceName()).orElseThrow(); sendNbiNotification(new PublishNotificationProcessServiceBuilder() .setServiceName(service.getServiceName()) .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build()) @@ -160,44 +172,61 @@ public class RendererListenerImpl implements TransportpceRendererListener { LOG.debug("serviceDataStoreOperations is null"); return; } - updateOtnTopology(notification, false); - - PublishNotificationProcessServiceBuilder nbiNotificationBuilder = new PublishNotificationProcessServiceBuilder() + PublishNotificationProcessServiceBuilder nbiNotificationBuilder = + new PublishNotificationProcessServiceBuilder() .setServiceName(input.getServiceName()) .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build()) .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build()) .setCommonId(input.getCommonId()).setConnectionType(input.getConnectionType()) .setPublisherName(PUBLISHER); - OperationResult operationResult; String serviceTemp = ""; if (tempService) { - operationResult = this.serviceDataStoreOperations.modifyTempService( + OperationResult operationResult = this.serviceDataStoreOperations.modifyTempService( serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService); serviceTemp = "Temp "; + if (operationResult.isSuccess()) { + sendNbiNotification(nbiNotificationBuilder + .setResponseFailed("") + .setMessage("Temp Service implemented !") + .setOperationalState(State.InService) + .build()); + LOG.debug("For the Temp service, sending notification on service-result-rpc"); + sendServiceRpcResultNotification(notification, ServiceNotificationTypes.ServiceCreateResult); + return; + } } else { - operationResult = this.serviceDataStoreOperations.modifyService( + OperationResult operationResult = this.serviceDataStoreOperations.modifyService( serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService); - } - if (operationResult.isSuccess()) { - sendNbiNotification(nbiNotificationBuilder + // Here the service is implemented and the tempService has to be deleted if present + String commonId = input.getCommonId(); + if (commonId != null) { + if (this.serviceDataStoreOperations.getTempService(commonId).isPresent()) { + LOG.info("Temp-service exists with the common-Id {}", commonId); + // Delete the common-id from this temp-service-list here + OperationResult tempServiceListDelete = serviceDataStoreOperations.deleteTempService(commonId); + //TODO: Also need to delete the service-path from the transportpce-service-path list + this.serviceDataStoreOperations.deleteServicePath(commonId); + LOG.info("Result for temp-service-list with {} is {}", commonId, tempServiceListDelete); + } + } + + if (operationResult.isSuccess()) { + sendNbiNotification(nbiNotificationBuilder .setResponseFailed("") .setMessage("Service implemented !") - .setOperationalState(org.opendaylight.yang.gen.v1.http - .org.openroadm.common.state.types.rev181130.State.InService) + .setOperationalState(State.InService) .build()); - if (!tempService) { sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceCreateResult); + return; } - } else { - LOG.warn("{}Service status not updated in datastore !", serviceTemp); - sendNbiNotification(nbiNotificationBuilder - .setResponseFailed(serviceTemp + "Service status not updated in datastore !") - .setMessage("ServiceCreate request failed ...") - .setOperationalState(org.opendaylight.yang.gen.v1.http - .org.openroadm.common.state.types.rev181130.State.OutOfService) - .build()); } + LOG.warn("{}Service status not updated in datastore !", serviceTemp); + sendNbiNotification(nbiNotificationBuilder + .setResponseFailed(serviceTemp + "Service status not updated in datastore !") + .setMessage("ServiceCreate request failed ...") + .setOperationalState(State.OutOfService) + .build()); } /** @@ -225,13 +254,57 @@ public class RendererListenerImpl implements TransportpceRendererListener { } } + private void sendServiceRpcResultNotification(RendererRpcResultSp notification, ServiceNotificationTypes type) { + try { + ServiceRpcResult serviceRpcResult = new ServiceRpcResultBuilder() + .setServiceName(notification.getServiceName()) + .setNotificationType(type) + .setStatusMessage(notification.getStatusMessage()) + .setCommonId(notification.getCommonId()) + .setPathComputationResult(new PathComputationResultBuilder() + .setAToZ(new AToZBuilder() + .setFrequency(notification + .getAToZDirection() + .getCentralFrequency()) + .setWidth(notification + .getAToZDirection() + .getWidth()) + // TODO: here the optical operational mode should be set + // TODO: also set the GNSR, OSNR, power values + .setOpticalOperationalMode("test") + .build()) + .setZToA(new ZToABuilder() + .setFrequency(notification + .getZToADirection() + .getCentralFrequency()) + .setWidth(notification + .getZToADirection() + .getWidth()) + // TODO: here the optical operational mode should be set + // TODO: also set the GNSR, OSNR, power values + .setOpticalOperationalMode("test") + .build()) + .build()) + .build(); + LOG.info("Sending the notification for service-rpc-result {}", serviceRpcResult); + notificationPublishService.putNotification( + serviceRpcResult); + } catch (InterruptedException e) { + LOG.warn("Something went wrong while sending notification for service {}", + serviceRpcResultSp.getServiceName(), e); + Thread.currentThread().interrupt(); + } + } + + + /** * Process failed service implementation for serviceName. * @param serviceName String */ private void onFailedServiceImplementation(String serviceName) { LOG.error("Renderer implementation failed !"); - Services service = serviceDataStoreOperations.getService(input.getServiceName()).get(); + Services service = serviceDataStoreOperations.getService(input.getServiceName()).orElseThrow(); sendNbiNotification(new PublishNotificationProcessServiceBuilder() .setServiceName(service.getServiceName()) .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build()) @@ -275,14 +348,17 @@ public class RendererListenerImpl implements TransportpceRendererListener { return true; } + @Override public void setServiceInput(ServiceInput serviceInput) { this.input = serviceInput; } + @Override public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) { this.serviceDataStoreOperations = serviceData; } + @Override public void setTempService(Boolean tempService) { this.tempService = tempService; } @@ -303,21 +379,33 @@ public class RendererListenerImpl implements TransportpceRendererListener { private void updateOtnTopology(RendererRpcResultSp notification, boolean isDeletion) { Link link = notification.getLink(); - List supportedLinkIds = notification.getLinkId(); - if (link == null && supportedLinkIds == null) { + if (link == null && notification.getLinkId() == null) { return; } - + List supportedLinkIds = null; + if (notification.getLinkId() != null) { + supportedLinkIds = new ArrayList<>(notification.getLinkId()); + } String serviceType = notification.getServiceType(); switch (serviceType) { case StringConstants.SERVICE_TYPE_OTU4: + case StringConstants.SERVICE_TYPE_OTUC2: + case StringConstants.SERVICE_TYPE_OTUC3: case StringConstants.SERVICE_TYPE_OTUC4: case StringConstants.SERVICE_TYPE_ODU4: + case StringConstants.SERVICE_TYPE_ODUC2: + case StringConstants.SERVICE_TYPE_ODUC3: case StringConstants.SERVICE_TYPE_ODUC4: Map otnLinkTypeMap = Map.of( StringConstants.SERVICE_TYPE_OTU4, OtnLinkType.OTU4, + // TODO: need to change it when OtnLinkType is updated with enum + StringConstants.SERVICE_TYPE_OTUC2, OtnLinkType.OTUC4, + StringConstants.SERVICE_TYPE_OTUC3, OtnLinkType.OTUC4, StringConstants.SERVICE_TYPE_OTUC4, OtnLinkType.OTUC4, StringConstants.SERVICE_TYPE_ODU4, OtnLinkType.ODTU4, + // TODO: need to change it when OtnLinkType is updated with enum + StringConstants.SERVICE_TYPE_ODUC2, OtnLinkType.ODUC4, + StringConstants.SERVICE_TYPE_ODUC3, OtnLinkType.ODUC4, StringConstants.SERVICE_TYPE_ODUC4, OtnLinkType.ODUC4); if (isDeletion) { LOG.info("updating otn-topology removing links");