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=a30c7d2378cffc7656ea27af9c952b044cbecdea;hb=refs%2Fchanges%2F46%2F100646%2F27;hp=b79bcb518ca988ab810a36416586a8638fc43f32;hpb=39b006abcabecfe5177181eed53ede1abb760f28;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 b79bcb518..a30c7d237 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,19 +8,31 @@ 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; import org.opendaylight.transportpce.common.OperationResult; +import org.opendaylight.transportpce.common.StringConstants; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelService; 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.renderer.rev201125.RendererRpcResultSp; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.TransportpceRendererListener; +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.state.types.rev181130.State; -import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.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.rev211210.service.list.Services; +import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +44,7 @@ import org.slf4j.LoggerFactory; */ public class RendererListenerImpl implements TransportpceRendererListener { + private static final String PUBLISHER = "RendererListener"; private static final Logger LOG = LoggerFactory.getLogger(RendererListenerImpl.class); private RendererRpcResultSp serviceRpcResultSp; private ServiceDataStoreOperations serviceDataStoreOperations; @@ -39,13 +52,16 @@ public class RendererListenerImpl implements TransportpceRendererListener { private PCEServiceWrapper pceServiceWrapper; private Boolean tempService; private NotificationPublishService notificationPublishService; + private final NetworkModelService networkModelService; + public RendererListenerImpl(PathComputationService pathComputationService, - NotificationPublishService notificationPublishService) { + NotificationPublishService notificationPublishService, NetworkModelService networkModelService) { this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService); setServiceInput(null); setTempService(false); this.notificationPublishService = notificationPublishService; + this.networkModelService = networkModelService; } @Override @@ -60,11 +76,11 @@ public class RendererListenerImpl implements TransportpceRendererListener { notification); switch (notifType) { /* service-implementation-request. */ - case 3 : + case 3: onServiceImplementationResult(notification); break; /* service-delete. */ - case 4 : + case 4: onServiceDeleteResult(notification); break; default: @@ -79,23 +95,36 @@ public class RendererListenerImpl implements TransportpceRendererListener { private void onServiceDeleteResult(RendererRpcResultSp notification) { switch (serviceRpcResultSp.getStatus()) { case Successful: - LOG.info("Service '{}' deleted !", notification.getServiceName()); + updateOtnTopology(notification, true); break; case Failed: LOG.error("Renderer service delete failed !"); + Services service = serviceDataStoreOperations.getService(input.getServiceName()).get(); + sendNbiNotification(new PublishNotificationProcessServiceBuilder() + .setServiceName(service.getServiceName()) + .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build()) + .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build()) + .setCommonId(service.getCommonId()) + .setConnectionType(service.getConnectionType()) + .setResponseFailed("Renderer service delete failed !") + .setMessage("ServiceDelete request failed ...") + .setOperationalState(service.getOperationalState()) + .setPublisherName(PUBLISHER) + .build()); return; - case Pending: - LOG.warn("Renderer service delete returned a Penging RpcStatusEx code!"); + case Pending: + LOG.warn("Renderer service delete returned a Pending RpcStatusEx code!"); return; default: LOG.error("Renderer service delete returned an unknown RpcStatusEx code!"); return; } + LOG.info("Service '{}' deleted !", notification.getServiceName()); if (this.input == null) { LOG.error("ServiceInput parameter is null !"); return; } - LOG.info("sending PCE cancel resource reserve for '{}'", this.input.getServiceName()); + LOG.info("sending PCE cancel resource reserve for '{}'", this.input.getServiceName()); this.pceServiceWrapper.cancelPCEResource(this.input.getServiceName(), ServiceNotificationTypes.ServiceDeleteResult); sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceDeleteResult); @@ -113,7 +142,7 @@ public class RendererListenerImpl implements TransportpceRendererListener { case Failed: onFailedServiceImplementation(notification.getServiceName()); break; - case Pending: + case Pending: LOG.warn("Service Implementation still pending according to RpcStatusEx"); break; default: @@ -132,23 +161,41 @@ public class RendererListenerImpl implements TransportpceRendererListener { LOG.debug("serviceDataStoreOperations is null"); return; } - OperationResult operationResult = null; + + updateOtnTopology(notification, false); + + 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( serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService); - if (!operationResult.isSuccess()) { - LOG.warn("Temp Service status not updated in datastore !"); - } + serviceTemp = "Temp "; } else { operationResult = this.serviceDataStoreOperations.modifyService( - serviceRpcResultSp.getServiceName(), - State.InService, - AdminStates.InService); - if (!operationResult.isSuccess()) { - LOG.warn("Service status not updated in datastore !"); - } else { + serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService); + } + if (operationResult.isSuccess()) { + sendNbiNotification(nbiNotificationBuilder + .setResponseFailed("") + .setMessage("Service implemented !") + .setOperationalState(State.InService) + .build()); + if (!tempService) { sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceCreateResult); } + } 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(State.OutOfService) + .build()); } } @@ -171,7 +218,7 @@ public class RendererListenerImpl implements TransportpceRendererListener { notificationPublishService.putNotification( serviceHandlerNotification); } catch (InterruptedException e) { - LOG.warn("Something went wrong while sending notification for sevice {}", + LOG.warn("Something went wrong while sending notification for service {}", serviceRpcResultSp.getServiceName(), e); Thread.currentThread().interrupt(); } @@ -183,23 +230,33 @@ public class RendererListenerImpl implements TransportpceRendererListener { */ private void onFailedServiceImplementation(String serviceName) { LOG.error("Renderer implementation failed !"); + Services service = serviceDataStoreOperations.getService(input.getServiceName()).get(); + sendNbiNotification(new PublishNotificationProcessServiceBuilder() + .setServiceName(service.getServiceName()) + .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build()) + .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build()) + .setCommonId(service.getCommonId()) + .setConnectionType(service.getConnectionType()) + .setResponseFailed("Renderer implementation failed !") + .setMessage("ServiceCreate request failed ...") + .setOperationalState(service.getOperationalState()) + .setPublisherName(PUBLISHER) + .build()); OperationResult deleteServicePathOperationResult = this.serviceDataStoreOperations.deleteServicePath(serviceName); if (!deleteServicePathOperationResult.isSuccess()) { LOG.warn("Service path was not removed from datastore!"); } + OperationResult deleteServiceOperationResult; + String serviceType = ""; if (tempService) { - OperationResult deleteServiceOperationResult = - this.serviceDataStoreOperations.deleteTempService(serviceName); - if (!deleteServiceOperationResult.isSuccess()) { - LOG.warn("Temp Service was not removed from datastore!"); - } + deleteServiceOperationResult = this.serviceDataStoreOperations.deleteTempService(serviceName); + serviceType = "Temp "; } else { - OperationResult deleteServiceOperationResult = - this.serviceDataStoreOperations.deleteService(serviceName); - if (!deleteServiceOperationResult.isSuccess()) { - LOG.warn("Service was not removed from datastore!"); - } + deleteServiceOperationResult = this.serviceDataStoreOperations.deleteService(serviceName); + } + if (deleteServiceOperationResult.isSuccess()) { + LOG.warn("{}Service was not removed from datastore!", serviceType); } } @@ -207,19 +264,11 @@ public class RendererListenerImpl implements TransportpceRendererListener { value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "false positives, not strings but real object references comparisons") private Boolean compareServiceRpcResultSp(RendererRpcResultSp notification) { - if (serviceRpcResultSp == null) { - return false; - } - if (serviceRpcResultSp.getNotificationType() != notification.getNotificationType()) { - return false; - } - if (serviceRpcResultSp.getServiceName() != notification.getServiceName()) { - return false; - } - if (serviceRpcResultSp.getStatus() != notification.getStatus()) { - return false; - } - if (serviceRpcResultSp.getStatusMessage() != notification.getStatusMessage()) { + if (serviceRpcResultSp == null + || serviceRpcResultSp.getNotificationType() != notification.getNotificationType() + || serviceRpcResultSp.getServiceName() != notification.getServiceName() + || serviceRpcResultSp.getStatus() != notification.getStatus() + || serviceRpcResultSp.getStatusMessage() != notification.getStatusMessage()) { return false; } return true; @@ -236,4 +285,79 @@ public class RendererListenerImpl implements TransportpceRendererListener { public void setTempService(Boolean tempService) { this.tempService = tempService; } + + /** + * Send notification to NBI notification in order to publish message. + * @param service PublishNotificationService + */ + private void sendNbiNotification(PublishNotificationProcessService service) { + try { + notificationPublishService.putNotification(service); + } catch (InterruptedException e) { + LOG.warn("Cannot send notification to nbi", e); + Thread.currentThread().interrupt(); + } + } + + + private void updateOtnTopology(RendererRpcResultSp notification, boolean isDeletion) { + Link link = notification.getLink(); + 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"); + this.networkModelService.deleteOtnLinks(link, supportedLinkIds, otnLinkTypeMap.get(serviceType)); + } else { + LOG.info("updating otn-topology adding links"); + this.networkModelService.createOtnLinks(link, supportedLinkIds, otnLinkTypeMap.get(serviceType)); + } + break; + case StringConstants.SERVICE_TYPE_1GE: + case StringConstants.SERVICE_TYPE_10GE: + case StringConstants.SERVICE_TYPE_100GE_M: + Short tribPort = Short.valueOf(notification.getAToZDirection().getMinTribSlot().getValue() + .split("\\.")[0]); + Short minTribSlot = Short.valueOf(notification.getAToZDirection().getMinTribSlot().getValue() + .split("\\.")[1]); + Short maxTribSlot = Short.valueOf(notification.getAToZDirection().getMaxTribSlot().getValue() + .split("\\.")[1]); + LOG.info("updating otn-topology node tps -tps and tpn pools"); + this.networkModelService.updateOtnLinks(link, supportedLinkIds, + notification.getAToZDirection().getRate(), tribPort, minTribSlot, maxTribSlot, isDeletion); + break; + case StringConstants.SERVICE_TYPE_100GE_S: + this.networkModelService.updateOtnLinks(supportedLinkIds, isDeletion); + break; + default: + LOG.warn("service-type {} not managed yet", serviceType); + break; + } + } + }