From 39b006abcabecfe5177181eed53ede1abb760f28 Mon Sep 17 00:00:00 2001 From: manuedelf Date: Thu, 3 Dec 2020 19:07:08 +0100 Subject: [PATCH] Minimal refactor of renderer to prepare flexgrid - Move NetworkModelWavelengthService to networkmodel as topology update must be done by this module. - NetworkModelWavelengthService is now invoked by a notification sent by service handler instead of being directly called by renderer - Update constructors when NetworkModelWavelengthService is no more used. - Remove no more used methods from RenderServiceOperations and its implementation. - Update RenderListenerImpl from service handler to send notification for network model. - Add a service listener to networkmodel to update frequencies map in topology. - Minimal update to unit test after moving class - Move MountPointStub from renderer to test-common - Update blueprint files of render, service handler and network model JIRA: TRNSPRTPCE-230 Signed-off-by: manuedelf Change-Id: I9dda66a301d92b74795ee5f239699bc2d11e9a8e --- .../tpce/module/TransportPCEImpl.java | 35 ++--- .../networkmodel/NetworkModelProvider.java | 16 +- .../listeners/ServiceHandlerListener.java | 82 +++++++++++ .../NetworkModelWavelengthService.java | 31 ++++ .../NetworkModelWavelengthServiceImpl.java | 71 +++++---- .../blueprint/networkmodel-blueprint.xml | 9 ++ .../NetConfTopologyListenerTest.java | 4 +- .../NetworkModelProviderTest.java | 9 +- ...NetworkModelWaveLengthServiceFreeTest.java | 24 +-- .../NetworkModelWaveLengthServiceUseTest.java | 24 +-- .../stub/MountPointServiceStub.java | 38 ----- .../networkmodel/stub/MountPointStub.java | 68 --------- .../util}/WaveLengthServiceUtils.java | 50 +++---- .../util/test/PathDescriptionUtils.java | 115 +++++++++++++++ .../NetworkModelWavelengthService.java | 30 ---- .../OtnDeviceRendererServiceImpl.java | 5 +- .../RendererServiceOperations.java | 7 - .../RendererServiceOperationsImpl.java | 137 ++++++++++-------- .../OSGI-INF/blueprint/renderer-blueprint.xml | 8 - ...ceRendererServiceImplCreateOtsOmsTest.java | 2 +- ...ndererServiceOperationsImplDeleteTest.java | 11 +- .../RendererServiceOperationsImplTest.java | 11 +- .../renderer/utils/MountPointUtils.java | 2 +- .../impl/ServicehandlerImpl.java | 4 +- .../impl/ServicehandlerProvider.java | 7 +- .../listeners/RendererListenerImpl.java | 95 ++++++++---- .../service/ServiceHandlerOperationsImpl.java | 6 +- .../blueprint/servicehandler-blueprint.xml | 5 - .../impl/ServicehandlerImplTest.java | 42 +++--- .../impl/ServicehandlerProviderTest.java | 7 +- .../test}/stub/MountPointServiceStub.java | 2 +- .../test}/stub/MountPointStub.java | 2 +- 32 files changed, 549 insertions(+), 410 deletions(-) create mode 100644 networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java create mode 100644 networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java rename {renderer/src/main/java/org/opendaylight/transportpce/renderer => networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service}/NetworkModelWavelengthServiceImpl.java (92%) rename {renderer/src/test/java/org/opendaylight/transportpce/renderer => networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service}/NetworkModelWaveLengthServiceFreeTest.java (96%) rename {renderer/src/test/java/org/opendaylight/transportpce/renderer => networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service}/NetworkModelWaveLengthServiceUseTest.java (96%) delete mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java delete mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java rename {renderer/src/test/java/org/opendaylight/transportpce/renderer/utils => networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util}/WaveLengthServiceUtils.java (81%) create mode 100644 networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/PathDescriptionUtils.java delete mode 100644 renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthService.java rename {renderer/src/test/java/org/opendaylight/transportpce/renderer => test-common/src/main/java/org/opendaylight/transportpce/test}/stub/MountPointServiceStub.java (95%) rename {renderer/src/test/java/org/opendaylight/transportpce/renderer => test-common/src/main/java/org/opendaylight/transportpce/test}/stub/MountPointStub.java (96%) diff --git a/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java b/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java index efa1ef2e2..8dc1881cc 100644 --- a/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java +++ b/lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java @@ -37,6 +37,8 @@ import org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl; import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery; import org.opendaylight.transportpce.networkmodel.service.NetworkModelService; import org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelWavelengthService; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelWavelengthServiceImpl; import org.opendaylight.transportpce.olm.OlmPowerServiceRpcImpl; import org.opendaylight.transportpce.olm.OlmProvider; import org.opendaylight.transportpce.olm.power.PowerMgmt; @@ -46,8 +48,6 @@ import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl; import org.opendaylight.transportpce.pce.impl.PceProvider; import org.opendaylight.transportpce.pce.service.PathComputationService; import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthServiceImpl; import org.opendaylight.transportpce.renderer.RendererProvider; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221; @@ -123,10 +123,13 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP PortMapping portMapping = initPortMapping(lightyServices, openRoadmInterfaces); NetworkModelService networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl, portMapping); + NetworkModelWavelengthService networkModelWavelengthService = + new NetworkModelWavelengthServiceImpl(lightyServices.getBindingDataBroker()); NetConfTopologyListener netConfTopologyListener = new NetConfTopologyListener(networkModelService, lightyServices.getBindingDataBroker(), deviceTransactionManager); networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(), - lightyServices.getRpcProviderService(), networkutilsServiceImpl, netConfTopologyListener); + lightyServices.getRpcProviderService(), networkutilsServiceImpl, netConfTopologyListener, + lightyServices.getNotificationService(), networkModelWavelengthService); LOG.info("Creating OLM beans ..."); CrossConnect crossConnect = initCrossConnect(mappingUtils); @@ -145,21 +148,17 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP openRoadmInterfaces, crossConnect, portMapping, networkModelService); OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(openRoadmInterfaceFactory, crossConnect, openRoadmInterfaces, deviceTransactionManager, networkModelService); - NetworkModelWavelengthService networkModelWavelengthService = new NetworkModelWavelengthServiceImpl( - lightyServices.getBindingDataBroker()); - rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, networkModelWavelengthService, - deviceRendererService, otnDeviceRendererService); + rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService, + otnDeviceRendererService); LOG.info("Creating service-handler beans ..."); RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(), - networkModelWavelengthService, lightyServices.getBindingNotificationPublishService()); + lightyServices.getBindingNotificationPublishService()); servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(), lightyServices.getNotificationService(), pathComputationService, - rendererServiceOperations, networkModelWavelengthService, - lightyServices.getBindingNotificationPublishService()); - tapiProvider = initTapi(lightyServices, rendererServiceOperations, networkModelWavelengthService, - pathComputationService); + rendererServiceOperations, lightyServices.getBindingNotificationPublishService()); + tapiProvider = initTapi(lightyServices, rendererServiceOperations, pathComputationService); } @Override @@ -205,11 +204,9 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP * * @param lightyServices LightyServices * @param rendererServiceOperations RendererServiceOperations - * @param networkModelWavelengthService NetworkModelWavelengthService * @return TapiProvider instance */ private TapiProvider initTapi(LightyServices lightyServices, RendererServiceOperations rendererServiceOperations, - NetworkModelWavelengthService networkModelWavelengthService, PathComputationService pathComputationService) { RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService, lightyServices.getBindingNotificationPublishService()); @@ -219,8 +216,7 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations); ServiceHandlerOperations serviceHandlerOperations = new ServiceHandlerOperationsImpl( lightyServices.getBindingDataBroker(), pathComputationService, rendererServiceOperations, - lightyServices.getBindingNotificationPublishService(), pceListenerImpl, rendererListenerImpl, - networkModelWavelengthService); + lightyServices.getBindingNotificationPublishService(), pceListenerImpl, rendererListenerImpl); return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(), serviceHandlerOperations, new TapiListener()); } @@ -230,20 +226,17 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP * * @param lightyServices LightyServices * @param olmPowerServiceRpc TransportpceOlmService - * @param networkModelWavelengthService NetworkModelWavelengthService * @param deviceRendererService DeviceRendererService * @param otnDeviceRendererService OtnDeviceRendererService * @return RendererProvider instance */ private RendererProvider initRenderer(LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc, - NetworkModelWavelengthService networkModelWavelengthService, DeviceRendererService deviceRendererService, - OtnDeviceRendererService otnDeviceRendererService) { + DeviceRendererService deviceRendererService, OtnDeviceRendererService otnDeviceRendererService) { DeviceRendererRPCImpl deviceRendererRPC = new DeviceRendererRPCImpl(deviceRendererService, otnDeviceRendererService); RendererServiceOperationsImpl rendererServiceOperations = new RendererServiceOperationsImpl( deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc, - lightyServices.getBindingDataBroker(), networkModelWavelengthService, - lightyServices.getBindingNotificationPublishService()); + lightyServices.getBindingDataBroker(), lightyServices.getBindingNotificationPublishService()); return new RendererProvider(lightyServices.getRpcProviderService(), deviceRendererRPC, rendererServiceOperations); } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkModelProvider.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkModelProvider.java index 669be1bec..23c8a8df1 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkModelProvider.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkModelProvider.java @@ -9,13 +9,17 @@ package org.opendaylight.transportpce.networkmodel; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; +import org.opendaylight.mdsal.binding.api.NotificationService; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.InstanceIdentifiers; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.networkmodel.listeners.ServiceHandlerListener; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelWavelengthService; import org.opendaylight.transportpce.networkmodel.util.TpceNetwork; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.ObjectRegistration; @@ -33,15 +37,21 @@ public class NetworkModelProvider { private ListenerRegistration dataTreeChangeListenerRegistration; private ObjectRegistration networkutilsServiceRpcRegistration; private TpceNetwork tpceNetwork; + private ListenerRegistration serviceHandlerListenerRegistration; + private NotificationService notificationService; + private NetworkModelWavelengthService networkModelWavelengthService; public NetworkModelProvider(NetworkTransactionService networkTransactionService, final DataBroker dataBroker, final RpcProviderService rpcProviderService, final TransportpceNetworkutilsService networkutilsService, - final NetConfTopologyListener topologyListener) { + final NetConfTopologyListener topologyListener, NotificationService notificationService, + NetworkModelWavelengthService networkModelWavelengthService) { this.dataBroker = dataBroker; this.rpcProviderService = rpcProviderService; this.networkutilsService = networkutilsService; this.topologyListener = topologyListener; this.tpceNetwork = new TpceNetwork(networkTransactionService); + this.notificationService = notificationService; + this.networkModelWavelengthService = networkModelWavelengthService; } /** @@ -58,6 +68,9 @@ public class NetworkModelProvider { InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), topologyListener); networkutilsServiceRpcRegistration = rpcProviderService.registerRpcImplementation(TransportpceNetworkutilsService.class, networkutilsService); + TransportpceServicehandlerListener serviceHandlerListner = + new ServiceHandlerListener(networkModelWavelengthService); + serviceHandlerListenerRegistration = notificationService.registerNotificationListener(serviceHandlerListner); } /** @@ -71,5 +84,6 @@ public class NetworkModelProvider { if (networkutilsServiceRpcRegistration != null) { networkutilsServiceRpcRegistration.close(); } + serviceHandlerListenerRegistration.close(); } } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java new file mode 100644 index 000000000..a193e3dfd --- /dev/null +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java @@ -0,0 +1,82 @@ +/* + * Copyright © 2020 Orange, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel.listeners; + +import org.opendaylight.transportpce.networkmodel.service.NetworkModelWavelengthService; +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.TransportpceServicehandlerListener; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ServiceNotificationTypes; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.RpcStatusEx; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ServiceHandlerListener implements TransportpceServicehandlerListener { + private static final Logger LOG = LoggerFactory.getLogger(ServiceHandlerListener.class); + private final NetworkModelWavelengthService service; + + public ServiceHandlerListener(NetworkModelWavelengthService service) { + LOG.info("Init service handler listener for network"); + this.service = service; + } + + @Override + public void onServiceRpcResultSh(ServiceRpcResultSh notification) { + if (notification.getStatus() != RpcStatusEx.Successful) { + LOG.info("RpcStatusEx of notification not equals successful. Nothing to do for notification {}", + notification); + return; + } + ServiceNotificationTypes notificationType = notification.getNotificationType(); + if (notificationType == null) { + LOG.warn("No information about the type of the notification for {}", notification); + return; + } + switch (notificationType) { + case ServiceCreateResult: + case ServiceReconfigureResult: + case ServiceRestorationResult: + LOG.info("Service creation or reconfiguration or restoration notification received {}", notification); + onServiceCreation(notification); + break; + case ServiceDeleteResult: + LOG.info("Service delete notification received {}", notification); + onServiceDeletion(notification); + break; + default: + LOG.warn("This type of notification is not managed at this time {} for notification {}", + notificationType, notification); + break; + + } + } + + /** + * Allocate wavelength in topology. + * @param notification ServiceRpcResultSh + */ + private void onServiceCreation(ServiceRpcResultSh notification) { + if (notification.getAToZDirection() != null || notification.getZToADirection() != null) { + LOG.info("Update topology with used frequency by service {}", notification.getServiceName()); + service.useWavelengths(notification.getAToZDirection(), notification.getZToADirection()); + } + } + + /** + * Release wavelength in topology. + * @param notification ServiceRpcResultSh + */ + private void onServiceDeletion(ServiceRpcResultSh notification) { + if (notification.getAToZDirection() != null || notification.getZToADirection() != null) { + LOG.info("Update topology with no more used frequency by deleted service {}", + notification.getServiceName()); + service.freeWavelengths(notification.getAToZDirection(), notification.getZToADirection()); + } + } + +} diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java new file mode 100644 index 000000000..3fdb4efb8 --- /dev/null +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthService.java @@ -0,0 +1,31 @@ +/* + * Copyright © 2017 AT&T and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.transportpce.networkmodel.service; + +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.AToZDirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ZToADirection; + +public interface NetworkModelWavelengthService { + + /** + * Remove wavelength from available and add it to used wavelength list. + * + * @param atoZDirection AToZDirection: a to z path + * @param ztoADirection ZToADirection: z to a path + */ + void useWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection); + + /** + * Remove wavelength from used and add it to available wavelength list. + * + * @param atoZDirection AToZDirection: a to z path + * @param ztoADirection ZToADirection: z to a path + */ + void freeWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection); + +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthServiceImpl.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java similarity index 92% rename from renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthServiceImpl.java rename to networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java index 2ca59167f..80c2604dd 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthServiceImpl.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWavelengthServiceImpl.java @@ -5,7 +5,7 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer; +package org.opendaylight.transportpce.networkmodel.service; import java.math.BigDecimal; import java.util.Collection; @@ -64,7 +64,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.a import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.available.freq.map.AvailFreqMapsKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.port.connection.attributes.Wavelength; import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.port.connection.attributes.WavelengthBuilder; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.PathDescription; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.AToZDirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ZToADirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.atoz.direction.AToZ; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ztoa.direction.ZToA; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.pce.resource.resource.resource.TerminationPoint; @@ -92,35 +93,49 @@ public class NetworkModelWavelengthServiceImpl implements NetworkModelWavelength } @Override - public void useWavelengths(PathDescription pathDescription) { - List atozTpIds = getAToZTpList(pathDescription); - atozTpIds.removeIf(Objects::isNull); - deleteAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - pathDescription.getAToZDirection().getAToZWavelengthNumber().toJava()); - List ztoaTpIds = getZToATpList(pathDescription); - ztoaTpIds.removeIf(Objects::isNull); - deleteAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - pathDescription.getZToADirection().getZToAWavelengthNumber().toJava()); - addUsedWL(pathDescription.getAToZDirection().getAToZWavelengthNumber().toJava(), atozTpIds); - addUsedWL(pathDescription.getZToADirection().getZToAWavelengthNumber().toJava(), ztoaTpIds); + public void useWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection) { + if (atoZDirection != null && atoZDirection.getAToZWavelengthNumber() != null) { + LOG.info("Update wavelength for a to z direction {}", atoZDirection); + List atozTpIds = getAToZTpList(atoZDirection); + atozTpIds.removeIf(Objects::isNull); + deleteAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + atoZDirection.getAToZWavelengthNumber().toJava()); + addUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds); + } + if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) { + LOG.info("Update wavelength for z to a direction {}", ztoADirection); + List ztoaTpIds = getZToATpList(ztoADirection); + ztoaTpIds.removeIf(Objects::isNull); + deleteAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + ztoADirection.getZToAWavelengthNumber().toJava()); + + addUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds); + } } + @Override - public void freeWavelengths(PathDescription pathDescription) { - List atozTpIds = getAToZTpList(pathDescription); - List ztoaTpIds = getZToATpList(pathDescription); - atozTpIds.removeIf(Objects::isNull); - ztoaTpIds.removeIf(Objects::isNull); - deleteUsedWL(pathDescription.getAToZDirection().getAToZWavelengthNumber().toJava(), atozTpIds); - deleteUsedWL(pathDescription.getZToADirection().getZToAWavelengthNumber().toJava(), ztoaTpIds); - addAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - pathDescription.getAToZDirection().getAToZWavelengthNumber().toJava()); - addAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), - pathDescription.getZToADirection().getZToAWavelengthNumber().toJava()); + public void freeWavelengths(AToZDirection atoZDirection, ZToADirection ztoADirection) { + if (atoZDirection != null && atoZDirection.getAToZWavelengthNumber() != null) { + LOG.info("Free wavelength for a to z direction {}", atoZDirection); + List atozTpIds = getAToZTpList(atoZDirection); + atozTpIds.removeIf(Objects::isNull); + deleteUsedWL(atoZDirection.getAToZWavelengthNumber().toJava(), atozTpIds); + addAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + atoZDirection.getAToZWavelengthNumber().toJava()); + } + if (ztoADirection != null && ztoADirection.getZToAWavelengthNumber() != null) { + LOG.info("Free wavelength for z to a direction {}", ztoADirection); + List ztoaTpIds = getZToATpList(ztoADirection); + ztoaTpIds.removeIf(Objects::isNull); + deleteUsedWL(ztoADirection.getZToAWavelengthNumber().toJava(), ztoaTpIds); + addAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()), + ztoADirection.getZToAWavelengthNumber().toJava()); + } } - private List getAToZTpList(PathDescription pathDescription) { - Collection atozList = pathDescription.getAToZDirection().nonnullAToZ().values(); + private List getAToZTpList(AToZDirection atoZDirection) { + Collection atozList = atoZDirection.nonnullAToZ().values(); return atozList.stream() .filter(aToZ -> { if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) { @@ -139,8 +154,8 @@ public class NetworkModelWavelengthServiceImpl implements NetworkModelWavelength }).collect(Collectors.toList()); } - private List getZToATpList(PathDescription pathDescription) { - Collection ztoaList = pathDescription.getZToADirection().nonnullZToA().values(); + private List getZToATpList(ZToADirection ztoADirection) { + Collection ztoaList = ztoADirection.nonnullZToA().values(); return ztoaList.stream() .filter(zToA -> { if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) { diff --git a/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml b/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml index 4f310e4cd..79605958d 100644 --- a/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml +++ b/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml @@ -12,6 +12,7 @@ + @@ -26,6 +27,8 @@ + + @@ -44,6 +47,12 @@ + + + + + + diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java index 6d8a0fd12..60bf1e2e3 100644 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java @@ -43,9 +43,9 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710; import org.opendaylight.transportpce.networkmodel.service.NetworkModelService; -import org.opendaylight.transportpce.networkmodel.stub.MountPointServiceStub; -import org.opendaylight.transportpce.networkmodel.stub.MountPointStub; import org.opendaylight.transportpce.test.DataStoreContextImpl; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkModelProviderTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkModelProviderTest.java index c5028b67e..ba0b84ffb 100644 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkModelProviderTest.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkModelProviderTest.java @@ -19,9 +19,11 @@ import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import org.opendaylight.mdsal.binding.api.NotificationService; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.transportpce.common.network.NetworkTransactionService; +import org.opendaylight.transportpce.networkmodel.service.NetworkModelWavelengthService; import org.opendaylight.transportpce.test.AbstractTest; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService; @@ -35,12 +37,17 @@ public class NetworkModelProviderTest extends AbstractTest { TransportpceNetworkutilsService networkutilsService; @Mock NetConfTopologyListener topologyListener; + @Mock + private NotificationService notificationService; + @Mock + private NetworkModelWavelengthService networkModelWavelengthService; @Test public void networkmodelProviderInitTest() { NetworkModelProvider provider = new NetworkModelProvider(networkTransactionService, getDataBroker(), - rpcProviderService, networkutilsService, topologyListener); + rpcProviderService, networkutilsService, topologyListener, notificationService, + networkModelWavelengthService); Answer> answer = new Answer>() { @Override diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceFreeTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java similarity index 96% rename from renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceFreeTest.java rename to networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java index c65257c44..16bc04106 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceFreeTest.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceFreeTest.java @@ -5,7 +5,7 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer; +package org.opendaylight.transportpce.networkmodel.service; import java.math.BigDecimal; import java.util.ArrayList; @@ -27,11 +27,11 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl; import org.opendaylight.transportpce.common.fixedflex.FixedFlexImpl; import org.opendaylight.transportpce.common.fixedflex.FixedGridConstant; import org.opendaylight.transportpce.common.fixedflex.GridConstant; -import org.opendaylight.transportpce.renderer.stub.MountPointServiceStub; -import org.opendaylight.transportpce.renderer.stub.MountPointStub; -import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils; -import org.opendaylight.transportpce.renderer.utils.WaveLengthServiceUtils; +import org.opendaylight.transportpce.networkmodel.util.WaveLengthServiceUtils; +import org.opendaylight.transportpce.networkmodel.util.test.PathDescriptionUtils; import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyGHz; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyTHz; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1; @@ -89,7 +89,7 @@ public class NetworkModelWaveLengthServiceFreeTest extends AbstractTest { List parameters = new ArrayList<>(); PathDescription pathDescription = - ServiceDeleteDataUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); + PathDescriptionUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); FixedFlexImpl fixedFlex = new FixedFlexImpl(); fixedFlex = fixedFlex.getFixedFlexWaveMapping(WAVE_LENGTH); @@ -182,9 +182,9 @@ public class NetworkModelWaveLengthServiceFreeTest extends AbstractTest { @Before public void setMountPoint() { - MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(this.getDataBroker())); + MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(getDataBroker())); this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000); - networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(this.getDataBroker()); + networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); } @Test @@ -192,12 +192,12 @@ public class NetworkModelWaveLengthServiceFreeTest extends AbstractTest { WaveLengthServiceUtils.putTerminationPoint1ToDatastore("node1" + StringConstants.TTP_TOKEN, StringConstants.TTP_TOKEN, this.terminationPoint1, this.deviceTransactionManager); WaveLengthServiceUtils.putTerminationPoint2ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminationPoint2, this.deviceTransactionManager); + StringConstants.TTP_TOKEN, this.terminationPoint2); WaveLengthServiceUtils.putNode1ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node1, this.deviceTransactionManager); - WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2, - this.deviceTransactionManager); - this.networkModelWavelengthService.freeWavelengths(this.pathDescription); + WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2); + this.networkModelWavelengthService.freeWavelengths(this.pathDescription.getAToZDirection(), + this.pathDescription.getZToADirection()); Node1 updatedNode1 = WaveLengthServiceUtils.getNode1FromDatastore("node1" + StringConstants.TTP_TOKEN, this.deviceTransactionManager); org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 updatedNode2 = diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceUseTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java similarity index 96% rename from renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceUseTest.java rename to networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java index dad4b2cd7..0b7e2bae3 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/NetworkModelWaveLengthServiceUseTest.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelWaveLengthServiceUseTest.java @@ -5,7 +5,7 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer; +package org.opendaylight.transportpce.networkmodel.service; import java.math.BigDecimal; import java.util.ArrayList; @@ -26,11 +26,11 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl; import org.opendaylight.transportpce.common.fixedflex.FixedGridConstant; import org.opendaylight.transportpce.common.fixedflex.GridConstant; -import org.opendaylight.transportpce.renderer.stub.MountPointServiceStub; -import org.opendaylight.transportpce.renderer.stub.MountPointStub; -import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils; -import org.opendaylight.transportpce.renderer.utils.WaveLengthServiceUtils; +import org.opendaylight.transportpce.networkmodel.util.WaveLengthServiceUtils; +import org.opendaylight.transportpce.networkmodel.util.test.PathDescriptionUtils; import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyGHz; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyTHz; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1; @@ -70,9 +70,9 @@ public class NetworkModelWaveLengthServiceUseTest extends AbstractTest { @Before public void setMountPoint() { - MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(this.getDataBroker())); + MountPointServiceStub mountPointService = new MountPointServiceStub(new MountPointStub(getDataBroker())); this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000); - networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(this.getDataBroker()); + networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); } public NetworkModelWaveLengthServiceUseTest(PathDescription pathDescription, TerminationPoint1 terminationPoint1, @@ -91,7 +91,7 @@ public class NetworkModelWaveLengthServiceUseTest extends AbstractTest { List parameters = new ArrayList<>(); PathDescription pathDescription = - ServiceDeleteDataUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); + PathDescriptionUtils.createTransactionPathDescription(StringConstants.TTP_TOKEN); TerminationPoint1Builder terminationPoint1Builder = new TerminationPoint1Builder() .setCtpAttributes((new CtpAttributesBuilder()).setAvailFreqMaps(Map.of()).build()) @@ -154,12 +154,12 @@ public class NetworkModelWaveLengthServiceUseTest extends AbstractTest { WaveLengthServiceUtils.putTerminationPoint1ToDatastore("node1" + StringConstants.TTP_TOKEN, StringConstants.TTP_TOKEN, this.terminationPoint1, this.deviceTransactionManager); WaveLengthServiceUtils.putTerminationPoint2ToDatastore("node1" + StringConstants.TTP_TOKEN, - StringConstants.TTP_TOKEN, this.terminatPoint2, this.deviceTransactionManager); + StringConstants.TTP_TOKEN, this.terminatPoint2); WaveLengthServiceUtils.putNode1ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node1, this.deviceTransactionManager); - WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2, - this.deviceTransactionManager); - this.networkModelWavelengthService.useWavelengths(this.pathDescription); + WaveLengthServiceUtils.putNode2ToDatastore("node1" + StringConstants.TTP_TOKEN, this.node2); + this.networkModelWavelengthService.useWavelengths(this.pathDescription.getAToZDirection(), + this.pathDescription.getZToADirection()); Node1 updatedNode1 = WaveLengthServiceUtils.getNode1FromDatastore("node1" + StringConstants.TTP_TOKEN, this.deviceTransactionManager); org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 updatedNode2 = diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java deleted file mode 100644 index 0f754eb90..000000000 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointServiceStub.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.transportpce.networkmodel.stub; - -import java.util.Optional; -import org.opendaylight.mdsal.binding.api.MountPoint; -import org.opendaylight.mdsal.binding.api.MountPointService; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -public class MountPointServiceStub implements MountPointService { - - MountPoint returnedMountPoint; - - public MountPointServiceStub(MountPoint usedMountPoint) { - this.returnedMountPoint = usedMountPoint; - } - - @Override - public Optional getMountPoint(InstanceIdentifier mountPoint) { - if (returnedMountPoint == null) { - return Optional.empty(); - } - return Optional.of(returnedMountPoint); - } - - @Override - public ListenerRegistration registerListener(InstanceIdentifier path, - T listener) { - return null; - } -} diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java deleted file mode 100644 index aeb263a7e..000000000 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/stub/MountPointStub.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.transportpce.networkmodel.stub; - -import java.util.Optional; -import javax.annotation.Nonnull; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.binding.api.BindingService; -import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.MountPoint; -import org.opendaylight.mdsal.binding.api.NotificationService; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.NotificationListener; - - -public class MountPointStub implements MountPoint { - - private DataBroker dataBroker; - - private RpcConsumerRegistry rpcConsumerRegistry; - - - private NotificationService notificationService = new NotificationService() { - @Override - public @NonNull ListenerRegistration - registerNotificationListener(@NonNull T listener) { - return null; - } - }; - - public MountPointStub(DataBroker dataBroker) { - this.dataBroker = dataBroker; - } - - public void setRpcConsumerRegistry( - RpcConsumerRegistry rpcConsumerRegistry) { - this.rpcConsumerRegistry = rpcConsumerRegistry; - } - - @Override - @SuppressWarnings("unchecked") - public Optional getService(Class service) { - if (service.isInstance(dataBroker)) { - return Optional.ofNullable((T) dataBroker); - } - if (service.isInstance(rpcConsumerRegistry)) { - return Optional.ofNullable((T) rpcConsumerRegistry); - } - if (service.isInstance(notificationService)) { - return Optional.ofNullable((T) notificationService); - } - return Optional.empty(); - } - - @Nonnull - @Override - public InstanceIdentifier getIdentifier() { - throw new UnsupportedOperationException(); - } -} diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/WaveLengthServiceUtils.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java similarity index 81% rename from renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/WaveLengthServiceUtils.java rename to networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java index e04cb25c7..6f68269a0 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/WaveLengthServiceUtils.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/WaveLengthServiceUtils.java @@ -6,12 +6,14 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer.utils; +package org.opendaylight.transportpce.networkmodel.util; import java.util.concurrent.ExecutionException; +import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; +import org.opendaylight.transportpce.test.AbstractTest; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; @@ -25,7 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; -public final class WaveLengthServiceUtils { +public final class WaveLengthServiceUtils extends AbstractTest { private WaveLengthServiceUtils() { @@ -66,28 +68,28 @@ public final class WaveLengthServiceUtils { } public static void putTerminationPoint1ToDatastore(String nodeId, String tpId, TerminationPoint1 terminationPoint1, - DeviceTransactionManager deviceTransactionManager) - throws ExecutionException, InterruptedException { - TransactionUtils - .writeTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, + DeviceTransactionManager deviceTransactionManager) throws ExecutionException, InterruptedException { + WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.CONFIGURATION, createTerminationPoint1IIDBuilder(nodeId, tpId).build(), terminationPoint1); + writeTransaction.commit(); } public static void putTerminationPoint2ToDatastore(String nodeId, String tpId, org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 - terminationPoint1, DeviceTransactionManager deviceTransactionManager) + terminationPoint1) throws ExecutionException, InterruptedException { - TransactionUtils - .writeTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, + WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.CONFIGURATION, createTerminationPoint2IIDBuilder(nodeId, tpId).build(), terminationPoint1); + writeTransaction.commit(); } public static TerminationPoint1 getTerminationPoint1FromDatastore(String nodeId, String tpId, DeviceTransactionManager deviceTransactionManager) throws ExecutionException, InterruptedException { InstanceIdentifier tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build(); - return (TerminationPoint1) TransactionUtils - .readTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, tpIID); + return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, tpIID).get().get(); } public static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 @@ -96,9 +98,7 @@ public final class WaveLengthServiceUtils { throws ExecutionException, InterruptedException { InstanceIdentifier tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build(); - return (org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1) - TransactionUtils - .readTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, tpIID); + return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, tpIID).get().get(); } private static InstanceIdentifier createNode1IID(String nodeId) { @@ -128,27 +128,26 @@ public final class WaveLengthServiceUtils { DeviceTransactionManager deviceTransactionManager) throws ExecutionException, InterruptedException { InstanceIdentifier nodeIID = createNode1IID(nodeId); - TransactionUtils - .writeTransaction(deviceTransactionManager, nodeId, - LogicalDatastoreType.CONFIGURATION, nodeIID, node1); + WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.CONFIGURATION,nodeIID, node1); + writeTransaction.commit(); } public static void putNode2ToDatastore(String nodeId, - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node1, - DeviceTransactionManager deviceTransactionManager) + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 node1) throws ExecutionException, InterruptedException { InstanceIdentifier nodeIID = createNode2IID(nodeId); - TransactionUtils - .writeTransaction(deviceTransactionManager, nodeId, - LogicalDatastoreType.CONFIGURATION, nodeIID, node1); + WriteTransaction writeTransaction = getDataBroker().newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.CONFIGURATION, + nodeIID, node1); + writeTransaction.commit(); } public static Node1 getNode1FromDatastore(String nodeId, DeviceTransactionManager deviceTransactionManager) throws ExecutionException, InterruptedException { InstanceIdentifier nodeIID = createNode1IID(nodeId); - return (Node1) TransactionUtils - .readTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, nodeIID); + return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, nodeIID).get().get(); } public static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 @@ -156,7 +155,6 @@ public final class WaveLengthServiceUtils { throws ExecutionException, InterruptedException { InstanceIdentifier nodeIID = createNode2IID(nodeId); - return (org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1) TransactionUtils - .readTransaction(deviceTransactionManager, nodeId, LogicalDatastoreType.CONFIGURATION, nodeIID); + return getDataBroker().newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION, nodeIID).get().get(); } } diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/PathDescriptionUtils.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/PathDescriptionUtils.java new file mode 100644 index 000000000..539a00546 --- /dev/null +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/PathDescriptionUtils.java @@ -0,0 +1,115 @@ +/* + * Copyright © 2018 Orange Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.transportpce.networkmodel.util.test; + +import java.util.HashMap; +import java.util.Map; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.port.PortBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.AToZDirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.AToZDirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ZToADirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ZToADirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.atoz.direction.AToZ; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.atoz.direction.AToZBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.atoz.direction.AToZKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ztoa.direction.ZToA; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ztoa.direction.ZToABuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.path.description.ztoa.direction.ZToAKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.pce.resource.ResourceBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.pce.resource.resource.resource.TerminationPoint; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.pce.resource.resource.resource.TerminationPointBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.endpoint.sp.RxDirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.endpoint.sp.TxDirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescription; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescriptionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.ServiceAEndBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.ServiceZEndBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; + +public final class PathDescriptionUtils { + + private PathDescriptionUtils() { + + } + + public static PathDescription createTransactionPathDescription(String tpId) { + Map atoZMap = new HashMap<>(); + TerminationPointBuilder terminationPointBuilder = new TerminationPointBuilder(); + TerminationPoint terminationPoint = terminationPointBuilder.setTpNodeId("node2" + tpId) + .setTpId(tpId).build(); + TerminationPoint terminationPoint2 = terminationPointBuilder.setTpNodeId("node1" + tpId) + .setTpId(tpId).build(); + AToZ atoZ = new AToZBuilder().setId("1").withKey(new AToZKey("1")).setResource(new ResourceBuilder() + .setResource(terminationPoint).build()).build(); + AToZ atoZ2 = new AToZBuilder().setId("2").withKey(new AToZKey("2")).setResource(new ResourceBuilder() + .setResource(terminationPoint2).build()).build(); + atoZMap.put(atoZ.key(),atoZ); + atoZMap.put(atoZ2.key(),atoZ2); + AToZDirection atozDirection = new AToZDirectionBuilder() + .setRate(Uint32.valueOf(20)) + .setAToZWavelengthNumber(Uint32.valueOf(20)) + .setAToZ(atoZMap) + .setModulationFormat("OC") + .build(); + Map ztoAMap = new HashMap<>(); + ZToA ztoA = new ZToABuilder().setId("1").withKey(new ZToAKey("1")).setResource(new ResourceBuilder() + .setResource(terminationPoint).build()).build(); + ZToA ztoA2 = new ZToABuilder().setId("2").withKey(new ZToAKey("2")).setResource(new ResourceBuilder() + .setResource(terminationPoint).build()).build(); + ztoAMap.put(ztoA.key(),ztoA); + ztoAMap.put(ztoA2.key(),ztoA2); + ZToADirection ztoaDirection = new ZToADirectionBuilder() + .setRate(Uint32.valueOf(20)) + .setZToAWavelengthNumber(Uint32.valueOf(20)) + .setZToA(ztoAMap) + .setModulationFormat("OC") + .build(); + PathDescriptionBuilder pathDescriptionBuilder = new PathDescriptionBuilder(); + pathDescriptionBuilder.setAToZDirection(atozDirection); + pathDescriptionBuilder.setZToADirection(ztoaDirection); + return pathDescriptionBuilder.build(); + } + + public static ServiceAEndBuilder getServiceAEndBuild() { + return new ServiceAEndBuilder() + .setClli("clli").setServiceFormat(ServiceFormat.OC) + .setServiceRate(Uint32.valueOf(1)).setNodeId("XPONDER-1-2") + .setTxDirection( + new TxDirectionBuilder() + .setPort(new PortBuilder().setPortDeviceName("device name").setPortName("port name") + .setPortRack("port rack").setPortShelf("port shelf").setPortSlot("port slot") + .setPortSubSlot("port subslot").setPortType("port type").build()) + .build()) + .setRxDirection( + new RxDirectionBuilder() + .setPort(new PortBuilder().setPortDeviceName("device name").setPortName("port name") + .setPortRack("port rack").setPortShelf("port shelf").setPortSlot("port slot") + .setPortSubSlot("port subslot").setPortType("port type").build()) + .build()); + } + + public static ServiceZEndBuilder getServiceZEndBuild() { + return new ServiceZEndBuilder() + .setClli("clli").setServiceFormat(ServiceFormat.OC) + .setServiceRate(Uint32.valueOf(1)).setNodeId("XPONDER-2-3") + .setTxDirection( + new TxDirectionBuilder() + .setPort(new PortBuilder().setPortDeviceName("device name").setPortName("port name") + .setPortRack("port rack").setPortShelf("port shelf").setPortSlot("port slot") + .setPortSubSlot("port subslot").setPortType("port type").build()) + .build()) + .setRxDirection( + new RxDirectionBuilder() + .setPort(new PortBuilder().setPortDeviceName("device name").setPortName("port name") + .setPortRack("port rack").setPortShelf("port shelf").setPortSlot("port slot") + .setPortSubSlot("port subslot").setPortType("port type").build()) + .build()); + } +} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthService.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthService.java deleted file mode 100644 index ffe974ded..000000000 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/NetworkModelWavelengthService.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © 2017 AT&T and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.transportpce.renderer; - -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.PathDescription; - -public interface NetworkModelWavelengthService { - - /** - * Remove wavelength from available and add it to used wavelength list. - * - * @param pathDescription - * path description containing a-to-z and z-to-a path - */ - void useWavelengths(PathDescription pathDescription); - - /** - * Remove wavelength from used and add it to available wavelength list. - * - * @param pathDescription - * path description containing a-to-z and z-to-a path - */ - void freeWavelengths(PathDescription pathDescription); - -} diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java index 8febfdc3d..e92222df8 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java @@ -376,7 +376,10 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService { private void createODU4TtpInterface(OtnServicePathInput input, List nodeInterfaces, CopyOnWriteArrayList otnNodesProvisioned) throws OpenRoadmInterfaceException { - + if (input.getNodes() == null) { + return; + } + LOG.info("Creation of ODU4 tp interface {}", input); for (int i = 0; i < input.getNodes().size(); i++) { Nodes node = input.getNodes().get(i); String supportingOtuInterface = node.getNetworkTp() + "-OTU"; diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperations.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperations.java index bc4730a0d..924a0268e 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperations.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperations.java @@ -8,13 +8,11 @@ package org.opendaylight.transportpce.renderer.provisiondevice; import com.google.common.util.concurrent.ListenableFuture; -import org.opendaylight.transportpce.common.OperationResult; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceImplementationRequestInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceImplementationRequestOutput; import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.PathDescription; public interface RendererServiceOperations { @@ -22,9 +20,4 @@ public interface RendererServiceOperations { ListenableFuture serviceImplementation(ServiceImplementationRequestInput input); ListenableFuture serviceDelete(ServiceDeleteInput input, Services service); - - OperationResult reserveResource(PathDescription pathDescription); - - OperationResult freeResource(PathDescription pathDescription); - } diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java index a3c3e390a..ef53fe70b 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java @@ -24,12 +24,10 @@ import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.transportpce.common.OperationResult; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.common.StringConstants; import org.opendaylight.transportpce.common.Timeouts; import org.opendaylight.transportpce.renderer.ModelMappingUtils; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; import org.opendaylight.transportpce.renderer.ServicePathInputData; import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServicePathDirection; import org.opendaylight.transportpce.renderer.provisiondevice.tasks.DeviceRenderingRollbackTask; @@ -69,6 +67,7 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200615.olm.get.pm.input.ResourceIdentifierBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200615.olm.renderer.input.Nodes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; @@ -96,37 +95,18 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations private final DataBroker dataBroker; private final NotificationPublishService notificationPublishService; private ListeningExecutorService executor; - private NetworkModelWavelengthService networkModelWavelengthService; - private RendererRpcResultSp notification = null; public RendererServiceOperationsImpl(DeviceRendererService deviceRenderer, OtnDeviceRendererService otnDeviceRenderer, TransportpceOlmService olmService, - DataBroker dataBroker, NetworkModelWavelengthService networkModelWavelengthService, - NotificationPublishService notificationPublishService) { + DataBroker dataBroker, NotificationPublishService notificationPublishService) { this.deviceRenderer = deviceRenderer; this.otnDeviceRenderer = otnDeviceRenderer; this.olmService = olmService; this.dataBroker = dataBroker; - this.networkModelWavelengthService = networkModelWavelengthService; this.notificationPublishService = notificationPublishService; this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUMBER_OF_THREADS)); } - private void sendNotifications(ServicePathNotificationTypes servicePathNotificationTypes, String serviceName, - RpcStatusEx rpcStatusEx, String message) { - this.notification = new RendererRpcResultSpBuilder() - .setNotificationType(servicePathNotificationTypes) - .setServiceName(serviceName) - .setStatus(rpcStatusEx) - .setStatusMessage(message) - .build(); - try { - notificationPublishService.putNotification(this.notification); - } catch (InterruptedException e) { - LOG.info("notification offer rejected: ", e); - } - } - @Override public ListenableFuture serviceImplementation(ServiceImplementationRequestInput input) { @@ -178,8 +158,6 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations OPERATION_FAILED); } LOG.info("OTN rendering result size {}", otnRenderingResults.size()); - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, - input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); } break; case Infrastructure: @@ -224,45 +202,21 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations OPERATION_FAILED); } LOG.info("OTN rendering result size {}", otnRenderingResults.size()); - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, - input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); } break; default: LOG.warn("Unsupported connection type {}", input.getConnectionType()); } + sendNotificationsWithPathDescription( + ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL, + input.getPathDescription()); return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_OK, OPERATION_SUCCESSFUL); } }); } - @Override - @SuppressWarnings("checkstyle:IllegalCatch") - public OperationResult reserveResource(PathDescription pathDescription) { - - try { - LOG.info("Reserving resources in network model"); - networkModelWavelengthService.useWavelengths(pathDescription); - } catch (Exception e) { - LOG.warn("Reserving resources in network model failed"); - return OperationResult.failed("Resources reserve failed in network model"); - } - return OperationResult.ok("Resources reserved successfully in network model"); - } - - @Override - @SuppressWarnings("checkstyle:IllegalCatch") - public OperationResult freeResource(PathDescription pathDescription) { - - try { - networkModelWavelengthService.freeWavelengths(pathDescription); - } catch (Exception e) { - return OperationResult.failed("Resources reserve failed in network model"); - } - return OperationResult.ok("Resources reserved successfully in network model"); - } - @Override public ListenableFuture serviceDelete(ServiceDeleteInput input, Services service) { String serviceName = input.getServiceName(); @@ -626,10 +580,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations "Service activation test failed."); return false; } - // If Service activation is success update Network ModelMappingUtils - networkModelWavelengthService.useWavelengths(input.getPathDescription()); - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, - input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); + sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL, input.getPathDescription()); return true; } @@ -675,9 +627,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations "Deleting service path via renderer"); deviceRenderer.deleteServicePath(servicePathInputDataAtoZ.getServicePathInput()); deviceRenderer.deleteServicePath(servicePathInputDataZtoA.getServicePathInput()); - networkModelWavelengthService.freeWavelengths(pathDescription); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Successful, - OPERATION_SUCCESSFUL); + sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceDelete, + serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL,pathDescription); return true; } @@ -700,12 +651,76 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations "Deleting otn-service path via renderer"); OtnServicePathOutput result = otnDeviceRenderer.deleteOtnServicePath(ospi); if (result.isSuccess()) { - sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Successful, - OPERATION_SUCCESSFUL); + sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceDelete, + serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL, pathDescription); return true; } else { return false; } } + /** + * Send renderer notification. + * @param servicePathNotificationTypes ServicePathNotificationTypes + * @param serviceName String + * @param rpcStatusEx RpcStatusEx + * @param message String + */ + private void sendNotifications(ServicePathNotificationTypes servicePathNotificationTypes, String serviceName, + RpcStatusEx rpcStatusEx, String message) { + Notification notification = buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message, + null); + send(notification); + } + + /** + * Send renderer notification with path description information. + * @param servicePathNotificationTypes ServicePathNotificationTypes + * @param serviceName String + * @param rpcStatusEx RpcStatusEx + * @param message String + * @param pathDescription PathDescription + */ + private void sendNotificationsWithPathDescription(ServicePathNotificationTypes servicePathNotificationTypes, + String serviceName, RpcStatusEx rpcStatusEx, String message, PathDescription pathDescription) { + Notification notification = buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message, + pathDescription); + send(notification); + } + + /** + * Build notification containing path description information. + * @param servicePathNotificationTypes ServicePathNotificationTypes + * @param serviceName String + * @param rpcStatusEx RpcStatusEx + * @param message String + * @param pathDescription PathDescription + * @return notification with RendererRpcResultSp type. + */ + private RendererRpcResultSp buildNotification(ServicePathNotificationTypes servicePathNotificationTypes, + String serviceName, RpcStatusEx rpcStatusEx, String message, PathDescription pathDescription) { + RendererRpcResultSpBuilder builder = new RendererRpcResultSpBuilder() + .setNotificationType(servicePathNotificationTypes).setServiceName(serviceName).setStatus(rpcStatusEx) + .setStatusMessage(message); + if (pathDescription != null) { + builder.setAToZDirection(pathDescription.getAToZDirection()) + .setZToADirection(pathDescription.getZToADirection()); + } + return builder.build(); + } + + /** + * Send renderer notification. + * @param notification Notification + */ + private void send(Notification notification) { + try { + LOG.info("Sending notification {}", notification); + notificationPublishService.putNotification(notification); + } catch (InterruptedException e) { + LOG.info("notification offer rejected: ", e); + Thread.currentThread().interrupt(); + } + } + } diff --git a/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml b/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml index 0196d9400..d994e85ac 100644 --- a/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml +++ b/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml @@ -78,17 +78,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html - - - - - @@ -103,8 +97,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html interface="org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService" /> - diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java index 465a8c03a..0f2217d58 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java +++ b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java @@ -45,10 +45,10 @@ import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterf import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221; -import org.opendaylight.transportpce.renderer.stub.MountPointServiceStub; import org.opendaylight.transportpce.renderer.utils.CreateOtsOmsDataUtils; import org.opendaylight.transportpce.renderer.utils.MountPointUtils; import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.CreateOtsOmsInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.CreateOtsOmsOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.Network; diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java index 1a40f2615..1a6a0367f 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java +++ b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java @@ -46,19 +46,17 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthServiceImpl; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221; -import org.opendaylight.transportpce.renderer.stub.MountPointServiceStub; -import org.opendaylight.transportpce.renderer.stub.MountPointStub; import org.opendaylight.transportpce.renderer.stub.OlmServiceStub; import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock; import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils; import org.opendaylight.transportpce.renderer.utils.TransactionUtils; import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownOutputBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.TransportpceOlmService; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteInputBuilder; @@ -88,7 +86,6 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest { private DeviceRendererService deviceRenderer; private PortMapping portMapping; private CrossConnect crossConnect; - private NetworkModelWavelengthService networkModelWavelengthService; private TransportpceOlmService olmService; private MappingUtils mappingUtils; private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121; @@ -149,11 +146,9 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest { this.olmService = Mockito.spy(this.olmService); ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUMBER_OF_THREADS)); - this.networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); NotificationPublishService notificationPublishService = new NotificationPublishServiceMock(); this.rendererServiceOperations = new RendererServiceOperationsImpl(this.deviceRenderer, - this.otnDeviceRendererService, olmService, getDataBroker(), this.networkModelWavelengthService, - notificationPublishService); + this.otnDeviceRendererService, olmService, getDataBroker(), notificationPublishService); } diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java index a364ed6c8..7f984bb81 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java +++ b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java @@ -42,19 +42,17 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221; import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthServiceImpl; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory; import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221; -import org.opendaylight.transportpce.renderer.stub.MountPointServiceStub; -import org.opendaylight.transportpce.renderer.stub.MountPointStub; import org.opendaylight.transportpce.renderer.stub.OlmServiceStub; import org.opendaylight.transportpce.renderer.utils.MountPointUtils; import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock; import org.opendaylight.transportpce.renderer.utils.ServiceDataUtils; import org.opendaylight.transportpce.test.AbstractTest; +import org.opendaylight.transportpce.test.stub.MountPointServiceStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.ServicePathOutputBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmInputBuilder; @@ -83,7 +81,6 @@ public class RendererServiceOperationsImplTest extends AbstractTest { private OpenRoadmInterfaceFactory openRoadmInterfaceFactory; private CrossConnect crossConnect; private TransportpceOlmService olmService; - private NetworkModelWavelengthService networkModelWavelengthService; private MappingUtils mappingUtils; private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121; private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221; @@ -130,7 +127,6 @@ public class RendererServiceOperationsImplTest extends AbstractTest { public void setUp() throws OpenRoadmInterfaceException { setMountPoint(new MountPointStub(getDataBroker())); this.olmService = new OlmServiceStub(); - this.networkModelWavelengthService = new NetworkModelWavelengthServiceImpl(getDataBroker()); this.deviceRenderer = new DeviceRendererServiceImpl(this.getDataBroker(), this.deviceTransactionManager, openRoadmInterfaceFactory, openRoadmInterfaces, crossConnect, portMapping, null); this.otnDeviceRendererService = new OtnDeviceRendererServiceImpl(openRoadmInterfaceFactory, this.crossConnect, @@ -141,8 +137,7 @@ public class RendererServiceOperationsImplTest extends AbstractTest { this.olmService = Mockito.spy(this.olmService); this.deviceRenderer = Mockito.spy(this.deviceRenderer); this.rendererServiceOperations = new RendererServiceOperationsImpl(this.deviceRenderer, - this.otnDeviceRendererService, this.olmService, getDataBroker(), this.networkModelWavelengthService, - notificationPublishService); + this.otnDeviceRendererService, this.olmService, getDataBroker(), notificationPublishService); ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success") .setSuccess(true); diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/MountPointUtils.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/MountPointUtils.java index 1a7b24fe0..4d12e4b69 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/MountPointUtils.java +++ b/renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/MountPointUtils.java @@ -16,7 +16,7 @@ import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; -import org.opendaylight.transportpce.renderer.stub.MountPointStub; +import org.opendaylight.transportpce.test.stub.MountPointStub; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.Network; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.Nodes; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.NodesKey; diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java index f2ec980a2..c07bf0cd2 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java @@ -17,7 +17,6 @@ import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.transportpce.common.OperationResult; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.pce.service.PathComputationService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations; import org.opendaylight.transportpce.servicehandler.DowngradeConstraints; import org.opendaylight.transportpce.servicehandler.ModelMappingUtils; @@ -111,8 +110,7 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService { public ServicehandlerImpl(DataBroker databroker, PathComputationService pathComputationService, RendererServiceOperations rendererServiceOperations, NotificationPublishService notificationPublishService, - PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl, - NetworkModelWavelengthService networkModelWavelengthService) { + PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl) { this.db = databroker; this.serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(this.db); this.serviceDataStoreOperations.initialize(); diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java index 33c268cf5..ec1e2f556 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java @@ -13,7 +13,6 @@ import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.NotificationService; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.transportpce.pce.service.PathComputationService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations; import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl; import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl; @@ -38,7 +37,6 @@ public class ServicehandlerProvider { private final DataBroker dataBroker; private final RpcProviderService rpcService; private final NotificationService notificationService; - private final NetworkModelWavelengthService networkModelWavelengthService; private final NotificationPublishService notificationPublishService; private ListenerRegistration pcelistenerRegistration; private ListenerRegistration rendererlistenerRegistration; @@ -49,14 +47,12 @@ public class ServicehandlerProvider { public ServicehandlerProvider(final DataBroker dataBroker, RpcProviderService rpcProviderService, NotificationService notificationService, PathComputationService pathComputationService, RendererServiceOperations rendererServiceOperations, - NetworkModelWavelengthService networkModelWavelengthService, NotificationPublishService notificationPublishService) { this.dataBroker = dataBroker; this.rpcService = rpcProviderService; this.notificationService = notificationService; this.pathComputationService = pathComputationService; this.rendererServiceOperations = rendererServiceOperations; - this.networkModelWavelengthService = networkModelWavelengthService; this.notificationPublishService = notificationPublishService; } @@ -72,8 +68,7 @@ public class ServicehandlerProvider { pcelistenerRegistration = notificationService.registerNotificationListener(pceListenerImpl); rendererlistenerRegistration = notificationService.registerNotificationListener(rendererListenerImpl); final ServicehandlerImpl servicehandler = new ServicehandlerImpl(dataBroker, pathComputationService, - rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl, - networkModelWavelengthService); + rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl); rpcRegistration = rpcService.registerRpcImplementation(OrgOpenroadmServiceService.class, servicehandler); } 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 e1dc134f3..b79bcb518 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 @@ -16,10 +16,11 @@ 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.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.transportpce.b.c._interface.service.types.rev200128.RpcStatusEx; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,12 +38,14 @@ public class RendererListenerImpl implements TransportpceRendererListener { private ServiceInput input; private PCEServiceWrapper pceServiceWrapper; private Boolean tempService; + private NotificationPublishService notificationPublishService; public RendererListenerImpl(PathComputationService pathComputationService, NotificationPublishService notificationPublishService) { this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService); setServiceInput(null); setTempService(false); + this.notificationPublishService = notificationPublishService; } @Override @@ -52,18 +55,17 @@ public class RendererListenerImpl implements TransportpceRendererListener { return; } serviceRpcResultSp = notification; - String serviceName = serviceRpcResultSp.getServiceName(); int notifType = serviceRpcResultSp.getNotificationType().getIntValue(); LOG.info("Renderer '{}' Notification received : {}", serviceRpcResultSp.getNotificationType().getName(), notification); switch (notifType) { /* service-implementation-request. */ case 3 : - onServiceImplementationResult(serviceName); + onServiceImplementationResult(notification); break; /* service-delete. */ case 4 : - onServiceDeleteResult(serviceName); + onServiceDeleteResult(notification); break; default: break; @@ -72,20 +74,23 @@ public class RendererListenerImpl implements TransportpceRendererListener { /** * Process service delete result for serviceName. - * @param serviceName String + * @param notification RendererRpcResultSp */ - private void onServiceDeleteResult(String serviceName) { - if (serviceRpcResultSp.getStatus() == RpcStatusEx.Failed) { - LOG.error("Renderer service delete failed !"); - return; - } else if (serviceRpcResultSp.getStatus() == RpcStatusEx.Pending) { - LOG.warn("Renderer service delete returned a Penging RpcStatusEx code!"); - return; - } else if (serviceRpcResultSp.getStatus() != RpcStatusEx.Successful) { - LOG.error("Renderer service delete returned an unknown RpcStatusEx code!"); - return; + private void onServiceDeleteResult(RendererRpcResultSp notification) { + switch (serviceRpcResultSp.getStatus()) { + case Successful: + LOG.info("Service '{}' deleted !", notification.getServiceName()); + break; + case Failed: + LOG.error("Renderer service delete failed !"); + return; + case Pending: + LOG.warn("Renderer service delete returned a Penging RpcStatusEx code!"); + return; + default: + LOG.error("Renderer service delete returned an unknown RpcStatusEx code!"); + return; } - LOG.info("Service '{}' deleted !", serviceName); if (this.input == null) { LOG.error("ServiceInput parameter is null !"); return; @@ -93,30 +98,35 @@ public class RendererListenerImpl implements TransportpceRendererListener { LOG.info("sending PCE cancel resource reserve for '{}'", this.input.getServiceName()); this.pceServiceWrapper.cancelPCEResource(this.input.getServiceName(), ServiceNotificationTypes.ServiceDeleteResult); + sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceDeleteResult); } /** * Process service implementation result for serviceName. - * @param serviceName String - * @param serviceName String + * @param notification RendererRpcResultSp */ - private void onServiceImplementationResult(String serviceName) { - if (serviceRpcResultSp.getStatus() == RpcStatusEx.Successful) { - onSuccededServiceImplementation(); - } else if (serviceRpcResultSp.getStatus() == RpcStatusEx.Failed) { - onFailedServiceImplementation(serviceName); - } else if (serviceRpcResultSp.getStatus() == RpcStatusEx.Pending) { - LOG.warn("Service Implementation still pending according to RpcStatusEx"); - } else { - LOG.warn("Service Implementation has an unknown RpcStatusEx code"); + private void onServiceImplementationResult(RendererRpcResultSp notification) { + switch (serviceRpcResultSp.getStatus()) { + case Successful: + onSuccededServiceImplementation(notification); + break; + case Failed: + onFailedServiceImplementation(notification.getServiceName()); + break; + case Pending: + LOG.warn("Service Implementation still pending according to RpcStatusEx"); + break; + default: + LOG.warn("Service Implementation has an unknown RpcStatusEx code"); + break; } - } /** * Process succeeded service implementation for service. + * @param notification RendererRpcResultSp */ - private void onSuccededServiceImplementation() { + private void onSuccededServiceImplementation(RendererRpcResultSp notification) { LOG.info("Service implemented !"); if (serviceDataStoreOperations == null) { LOG.debug("serviceDataStoreOperations is null"); @@ -136,10 +146,37 @@ public class RendererListenerImpl implements TransportpceRendererListener { AdminStates.InService); if (!operationResult.isSuccess()) { LOG.warn("Service status not updated in datastore !"); + } else { + sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceCreateResult); } } } + /** + * Create and send service handler notification. + * @param notification RendererRpcResultSp + * @param type ServiceNotificationTypes + */ + private void sendServiceHandlerNotification(RendererRpcResultSp notification, ServiceNotificationTypes type) { + try { + ServiceRpcResultSh serviceHandlerNotification = new ServiceRpcResultShBuilder() + .setAToZDirection(notification.getAToZDirection()) + .setZToADirection(notification.getZToADirection()) + .setServiceName(notification.getServiceName()) + .setStatus(notification.getStatus()) + .setStatusMessage(notification.getStatusMessage()) + .setNotificationType(type) + .build(); + LOG.debug("Service update in datastore OK, sending notification {}", serviceHandlerNotification); + notificationPublishService.putNotification( + serviceHandlerNotification); + } catch (InterruptedException e) { + LOG.warn("Something went wrong while sending notification for sevice {}", + serviceRpcResultSp.getServiceName(), e); + Thread.currentThread().interrupt(); + } + } + /** * Process failed service implementation for serviceName. * @param serviceName String diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceHandlerOperationsImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceHandlerOperationsImpl.java index 913a1772f..bb3f257a3 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceHandlerOperationsImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceHandlerOperationsImpl.java @@ -12,7 +12,6 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.transportpce.pce.service.PathComputationService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations; import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl; import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl; @@ -33,10 +32,9 @@ public class ServiceHandlerOperationsImpl implements ServiceHandlerOperations { public ServiceHandlerOperationsImpl(DataBroker databroker, PathComputationService pathComputationService, RendererServiceOperations rendererServiceOperations, NotificationPublishService notificationPublishService, - PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl, - NetworkModelWavelengthService networkModelWavelengthService) { + PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl) { this.serviceHandler = new ServicehandlerImpl(databroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl,networkModelWavelengthService); + notificationPublishService, pceListenerImpl, rendererListenerImpl); } @Override diff --git a/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml b/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml index 1ae071877..da36c098e 100644 --- a/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml +++ b/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml @@ -31,9 +31,6 @@ Author: Martial Coulibaly on behalf of Orange - - @@ -55,7 +52,6 @@ Author: Martial Coulibaly on behalf of Orange - @@ -69,7 +65,6 @@ Author: Martial Coulibaly on behalf of Orange - > result = servicehandlerImpl.serviceCreate(new ServiceCreateInputBuilder().build()); result.addListener(new Runnable() { @@ -120,7 +120,7 @@ public class ServicehandlerImplTest extends AbstractTest { Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceCreate(input); result.addListener(new Runnable() { @Override @@ -141,7 +141,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void deleteServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceDelete(new ServiceDeleteInputBuilder() .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder().setServiceName("").build()).build()); @@ -165,7 +165,7 @@ public class ServicehandlerImplTest extends AbstractTest { ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput(); ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceDelete(input); result.addListener(new Runnable() { @Override @@ -188,7 +188,7 @@ public class ServicehandlerImplTest extends AbstractTest { Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any())); ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput(); serviceDataStoreOperations.createService(createInput); @@ -214,7 +214,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void serviceFeasibilityCheckShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceFeasibilityCheck(new ServiceFeasibilityCheckInputBuilder().build()); result.addListener(new Runnable() { @@ -239,7 +239,7 @@ public class ServicehandlerImplTest extends AbstractTest { Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceFeasibilityCheck(input); result.addListener(new Runnable() { @@ -261,7 +261,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void serviceReconfigureShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceReconfigure(new ServiceReconfigureInputBuilder().setServiceName("").build()); result.addListener(new Runnable() { @@ -287,7 +287,7 @@ public class ServicehandlerImplTest extends AbstractTest { //action -> service reconfigure ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceReconfigure(input); result.addListener(new Runnable() { @@ -316,7 +316,7 @@ public class ServicehandlerImplTest extends AbstractTest { //create service to reconfigure ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput(); serviceDataStoreOperations.createService(createInput); @@ -344,7 +344,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void serviceReRestorationShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceRestoration(new ServiceRestorationInputBuilder().setServiceName("").build()); result.addListener(new Runnable() { @@ -370,7 +370,7 @@ public class ServicehandlerImplTest extends AbstractTest { //action -> service restore ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceRestoration(input); result.addListener(new Runnable() { @@ -399,7 +399,7 @@ public class ServicehandlerImplTest extends AbstractTest { //create service to restore ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput(); serviceDataStoreOperations.createService(createInput); @@ -427,7 +427,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void serviceRerouteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceReroute(new ServiceRerouteInputBuilder().setServiceName("").build()); result.addListener(new Runnable() { @@ -452,7 +452,7 @@ public class ServicehandlerImplTest extends AbstractTest { //action -> service reconfigure ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.serviceReroute(input); result.addListener(new Runnable() { @@ -481,7 +481,7 @@ public class ServicehandlerImplTest extends AbstractTest { //create service to be rerouted later ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput(); serviceDataStoreOperations.createService(createInput); @@ -509,7 +509,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void tempServiceDeleteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.tempServiceDelete(new TempServiceDeleteInputBuilder() .setCommonId("").build()); @@ -536,7 +536,7 @@ public class ServicehandlerImplTest extends AbstractTest { TempServiceDeleteInput input = ServiceDataUtils.buildTempServiceDeleteInput(); ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.tempServiceDelete(input); result.addListener(new Runnable() { @Override @@ -561,7 +561,7 @@ public class ServicehandlerImplTest extends AbstractTest { //create temp service to delete in the temp delete action ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); serviceDataStoreOperations.createTempService(createInput); @@ -588,7 +588,7 @@ public class ServicehandlerImplTest extends AbstractTest { public void tempServiceCreateShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.tempServiceCreate(new TempServiceCreateInputBuilder().build()); result.addListener(new Runnable() { @@ -615,7 +615,7 @@ public class ServicehandlerImplTest extends AbstractTest { ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); + notificationPublishService, pceListenerImpl, rendererListenerImpl); ListenableFuture> result = servicehandlerImpl.tempServiceCreate(input); result.addListener(new Runnable() { diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java index 4c3b66b84..923944b65 100644 --- a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java +++ b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java @@ -18,7 +18,6 @@ import org.mockito.MockitoAnnotations; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.transportpce.pce.service.PathComputationService; -import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService; import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations; import org.opendaylight.transportpce.test.AbstractTest; @@ -36,9 +35,6 @@ public class ServicehandlerProviderTest extends AbstractTest { @Mock RpcProviderService rpcProviderRegistry; - @Mock - NetworkModelWavelengthService networkModelWavelengthService; - @Before public void init() { MockitoAnnotations.initMocks(this); @@ -50,8 +46,7 @@ public class ServicehandlerProviderTest extends AbstractTest { ServicehandlerProvider provider = new ServicehandlerProvider( getDataBroker(), rpcProviderRegistry, getNotificationService() , pathComputationService, - rendererServiceOperations, networkModelWavelengthService, - notificationPublishService); + rendererServiceOperations, notificationPublishService); provider.init(); diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointServiceStub.java b/test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointServiceStub.java similarity index 95% rename from renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointServiceStub.java rename to test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointServiceStub.java index fb75517b5..edd5f76b4 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointServiceStub.java +++ b/test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointServiceStub.java @@ -6,7 +6,7 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer.stub; +package org.opendaylight.transportpce.test.stub; import java.util.Optional; import org.opendaylight.mdsal.binding.api.MountPoint; diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointStub.java b/test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointStub.java similarity index 96% rename from renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointStub.java rename to test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointStub.java index e4c82b98c..362a40b63 100644 --- a/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/MountPointStub.java +++ b/test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointStub.java @@ -6,7 +6,7 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.transportpce.renderer.stub; +package org.opendaylight.transportpce.test.stub; import java.util.Optional; import javax.annotation.Nonnull; -- 2.36.6