Refactor NBINotifications and serviceHandlerImpl
[transportpce.git] / lighty / src / main / java / io / lighty / controllers / tpce / module / TransportPCEImpl.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies s.r.o. All Rights Reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at https://www.eclipse.org/legal/epl-v10.html
7  */
8 package io.lighty.controllers.tpce.module;
9
10 import io.lighty.core.controller.api.AbstractLightyModule;
11 import io.lighty.core.controller.api.LightyServices;
12 import java.util.Arrays;
13 import java.util.List;
14 import org.opendaylight.mdsal.binding.api.NotificationService;
15 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
16 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
17 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
18 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
19 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
20 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
21 import org.opendaylight.transportpce.common.mapping.MappingUtils;
22 import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
23 import org.opendaylight.transportpce.common.mapping.PortMapping;
24 import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
25 import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
26 import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
27 import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
28 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
29 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
30 import org.opendaylight.transportpce.common.network.RequestProcessor;
31 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
32 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
33 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
34 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
35 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
36 import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
37 import org.opendaylight.transportpce.networkmodel.NetConfTopologyListener;
38 import org.opendaylight.transportpce.networkmodel.NetworkModelProvider;
39 import org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl;
40 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
41 import org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener;
42 import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
43 import org.opendaylight.transportpce.networkmodel.service.FrequenciesServiceImpl;
44 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
45 import org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl;
46 import org.opendaylight.transportpce.olm.OlmPowerServiceRpcImpl;
47 import org.opendaylight.transportpce.olm.OlmProvider;
48 import org.opendaylight.transportpce.olm.power.PowerMgmt;
49 import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
50 import org.opendaylight.transportpce.olm.service.OlmPowerService;
51 import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl;
52 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
53 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
54 import org.opendaylight.transportpce.pce.impl.PceProvider;
55 import org.opendaylight.transportpce.pce.service.PathComputationService;
56 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
57 import org.opendaylight.transportpce.renderer.RendererProvider;
58 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121;
59 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221;
60 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
61 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
62 // Adding OTN interface
63 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
64 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
65 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
66 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl;
67 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
68 // Add OTN
69 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererServiceImpl;
70 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
71 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperationsImpl;
72 import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
73 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
74 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerProvider;
75 import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
76 import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
77 import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
78 import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
79 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
80 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
81 import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
82 import org.opendaylight.transportpce.tapi.impl.TapiProvider;
83 import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
84 import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
85 import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
86 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
87 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
88 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelServiceImpl;
89 import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
90 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
91 import org.opendaylight.transportpce.tapi.utils.TapiListener;
92 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService;
93 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
94 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
95 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.OrgOpenroadmServiceService;
96 import org.slf4j.Logger;
97 import org.slf4j.LoggerFactory;
98
99
100 public class TransportPCEImpl extends AbstractLightyModule implements TransportPCE {
101     private static final Logger LOG = LoggerFactory.getLogger(TransportPCEImpl.class);
102     private static final long MAX_DURATION_TO_SUBMIT_TRANSACTION = 1500;
103     // transaction beans
104     // cannot use interface for DeviceTransactionManagerImpl
105     // because implementation has additional public methods ...
106     private final DeviceTransactionManagerImpl deviceTransactionManager;
107     private final NetworkTransactionService networkTransaction;
108     // pce beans
109     private final PceProvider pceProvider;
110     // network model beans
111     private final NetworkModelProvider networkModelProvider;
112     // OLM beans
113     private final OlmProvider olmProvider;
114     // renderer beans
115     private final RendererProvider rendererProvider;
116     // T-api
117     private final TapiProvider tapiProvider;
118     // service-handler beans
119     private final ServicehandlerProvider servicehandlerProvider;
120     // nbi-notifications beans
121     private NbiNotificationsProvider nbiNotificationsProvider;
122     /**
123      * List of publisher topics.
124      */
125     private final List<String> publisherServiceList = Arrays.asList("PceListener", "ServiceHandlerOperations",
126             "ServiceHandler", "RendererListener");
127     private final List<String> publisherAlarmList = Arrays.asList("ServiceListener");
128
129     public TransportPCEImpl(LightyServices lightyServices, boolean activateNbiNotification) {
130         LOG.info("Initializing transaction providers ...");
131         deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(),
132                 MAX_DURATION_TO_SUBMIT_TRANSACTION);
133         RequestProcessor requestProcessor = new RequestProcessor(lightyServices.getBindingDataBroker());
134         networkTransaction = new NetworkTransactionImpl(requestProcessor);
135
136         LOG.info("Creating network-model beans ...");
137         R2RLinkDiscovery linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getBindingDataBroker(),
138                 deviceTransactionManager, networkTransaction);
139         TransportpceNetworkutilsService networkutilsServiceImpl = new NetworkUtilsImpl(
140                 lightyServices.getBindingDataBroker());
141         MappingUtils mappingUtils = new MappingUtilsImpl(lightyServices.getBindingDataBroker());
142         OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils);
143         PortMapping portMapping = initPortMapping(lightyServices, openRoadmInterfaces);
144         NetworkModelService networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl,
145                 portMapping, lightyServices.getBindingNotificationPublishService());
146         FrequenciesService networkModelWavelengthService =
147                 new FrequenciesServiceImpl(lightyServices.getBindingDataBroker());
148         NetConfTopologyListener netConfTopologyListener = new NetConfTopologyListener(networkModelService,
149                 lightyServices.getBindingDataBroker(), deviceTransactionManager, portMapping);
150         PortMappingListener portMappingListener = new PortMappingListener(networkModelService);
151         networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(),
152                 lightyServices.getRpcProviderService(), networkutilsServiceImpl, netConfTopologyListener,
153                 lightyServices.getNotificationService(), networkModelWavelengthService, portMappingListener);
154
155         LOG.info("Creating PCE beans ...");
156         // TODO: pass those parameters through command line
157         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://127.0.0.1:8008",
158                 "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer());
159         PathComputationService pathComputationService = new PathComputationServiceImpl(
160                 networkTransaction,
161                 lightyServices.getBindingNotificationPublishService(),
162                 gnpyConsumer,
163                 portMapping
164                 );
165         pceProvider = new PceProvider(lightyServices.getRpcProviderService(), pathComputationService);
166
167         LOG.info("Creating OLM beans ...");
168         CrossConnect crossConnect = initCrossConnect(mappingUtils);
169         PowerMgmt powerMgmt = new PowerMgmtImpl(lightyServices.getBindingDataBroker(), openRoadmInterfaces,
170                 crossConnect, deviceTransactionManager);
171         OlmPowerService olmPowerService = new OlmPowerServiceImpl(lightyServices.getBindingDataBroker(), powerMgmt,
172                 deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
173         olmProvider = new OlmProvider(lightyServices.getRpcProviderService(), olmPowerService);
174         TransportpceOlmService olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
175
176         LOG.info("Creating renderer beans ...");
177         OpenRoadmInterfaceFactory openRoadmInterfaceFactory = initOpenRoadmFactory(mappingUtils, openRoadmInterfaces,
178                 portMapping);
179         DeviceRendererService deviceRendererService = new DeviceRendererServiceImpl(
180                 lightyServices.getBindingDataBroker(), deviceTransactionManager, openRoadmInterfaceFactory,
181                 openRoadmInterfaces, crossConnect, portMapping, networkModelService);
182         OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(openRoadmInterfaceFactory,
183                 crossConnect, openRoadmInterfaces, deviceTransactionManager, networkModelService);
184         rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService,
185                 otnDeviceRendererService, portMapping);
186
187         LOG.info("Creating service-handler beans ...");
188         RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService,
189                 otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(),
190                 lightyServices.getBindingNotificationPublishService(), portMapping);
191         ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(
192                 lightyServices.getBindingDataBroker());
193         RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService,
194             lightyServices.getBindingNotificationPublishService(), networkModelService);
195         PceListenerImpl pceListenerImpl = new PceListenerImpl(rendererServiceOperations, pathComputationService,
196             lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
197         ServiceListener serviceListener = new ServiceListener(lightyServices.getBindingDataBroker(),
198                 lightyServices.getBindingNotificationPublishService());
199         NetworkModelListenerImpl networkModelListenerImpl = new NetworkModelListenerImpl(
200                 lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
201         ServicehandlerImpl servicehandler = new ServicehandlerImpl(lightyServices.getBindingDataBroker(),
202             pathComputationService, rendererServiceOperations, lightyServices.getBindingNotificationPublishService(),
203             pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, serviceDataStoreOperations);
204         servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(),
205                 lightyServices.getRpcProviderService(), lightyServices.getNotificationService(),
206                 serviceDataStoreOperations, pceListenerImpl, serviceListener, rendererListenerImpl,
207                 networkModelListenerImpl, servicehandler);
208
209         LOG.info("Creating tapi beans ...");
210         R2RTapiLinkDiscovery tapilinkDiscoveryImpl = new R2RTapiLinkDiscovery(lightyServices.getBindingDataBroker(),
211             deviceTransactionManager);
212         TapiRendererListenerImpl tapiRendererListenerImpl = new TapiRendererListenerImpl(lightyServices
213                 .getBindingDataBroker());
214         TapiPceListenerImpl tapiPceListenerImpl = new TapiPceListenerImpl(lightyServices.getBindingDataBroker());
215         TapiServiceHandlerListenerImpl tapiServiceHandlerListener = new TapiServiceHandlerListenerImpl(lightyServices
216                 .getBindingDataBroker());
217         TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl = new TapiNetworkUtilsImpl(
218                 networkTransaction);
219         TapiNetworkModelService tapiNetworkModelService = new TapiNetworkModelServiceImpl(
220             tapilinkDiscoveryImpl, networkTransaction);
221         TapiNetconfTopologyListener tapiNetConfTopologyListener =
222                 new TapiNetconfTopologyListener(tapiNetworkModelService);
223         TapiPortMappingListener tapiPortMappingListener =
224             new TapiPortMappingListener(tapiNetworkModelService);
225
226         tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
227                 tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, tapiPceListenerImpl,
228                 tapiRendererListenerImpl, tapiServiceHandlerListener, lightyServices.getNotificationService());
229         if (activateNbiNotification) {
230             LOG.info("Creating nbi-notifications beans ...");
231             nbiNotificationsProvider = new NbiNotificationsProvider(
232                     publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
233                     lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer());
234         }
235     }
236
237     @Override
238     protected boolean initProcedure() {
239         LOG.info("Initializing PCE provider ...");
240         pceProvider.init();
241         LOG.info("Initializing network-model provider ...");
242         networkModelProvider.init();
243         LOG.info("Initializing OLM provider ...");
244         olmProvider.init();
245         LOG.info("Initializing renderer provider ...");
246         rendererProvider.init();
247         LOG.info("Initializing service-handler provider ...");
248         servicehandlerProvider.init();
249         LOG.info("Initializing tapi provider ...");
250         tapiProvider.init();
251         if (nbiNotificationsProvider != null) {
252             LOG.info("Initializing nbi-notifications provider ...");
253             nbiNotificationsProvider.init();
254         }
255         LOG.info("Init done.");
256         return true;
257     }
258
259     @Override
260     protected boolean stopProcedure() {
261         nbiNotificationsProvider.close();
262         LOG.info("Shutting down nbi-notifications provider ...");
263         tapiProvider.close();
264         LOG.info("Shutting down service-handler provider ...");
265         servicehandlerProvider.close();
266         LOG.info("Shutting down renderer provider ...");
267         rendererProvider.close();
268         LOG.info("Shutting down OLM provider ...");
269         olmProvider.close();
270         LOG.info("Shutting down network-model provider ...");
271         networkModelProvider.close();
272         LOG.info("Shutting down PCE provider ...");
273         pceProvider.close();
274         LOG.info("Shutting down transaction providers ...");
275         networkTransaction.close();
276         deviceTransactionManager.preDestroy();
277         LOG.info("Shutdown done.");
278         return true;
279     }
280
281     private TapiProvider initTapi(LightyServices lightyServices, OrgOpenroadmServiceService servicehandler,
282                                   NetworkTransactionService networkTransactionService,
283                                   ServiceDataStoreOperations serviceDataStoreOperations,
284                                   TapiNetconfTopologyListener tapiNetConfTopologyListener,
285                                   TapiPortMappingListener tapiPortMappingListener,
286                                   TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
287                                   TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
288                                   TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
289                                   NotificationService notificationService) {
290         return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
291             servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
292             tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
293             rendererListenerImpl, serviceHandlerListenerImpl, notificationService);
294     }
295
296     private RendererProvider initRenderer(LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc,
297             DeviceRendererService deviceRendererService, OtnDeviceRendererService otnDeviceRendererService,
298             PortMapping portMapping) {
299         DeviceRendererRPCImpl deviceRendererRPC = new DeviceRendererRPCImpl(deviceRendererService,
300                 otnDeviceRendererService);
301         RendererServiceOperationsImpl rendererServiceOperations = new RendererServiceOperationsImpl(
302                 deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc,
303                 lightyServices.getBindingDataBroker(), lightyServices.getBindingNotificationPublishService(),
304                 portMapping);
305         return new RendererProvider(lightyServices.getRpcProviderService(), deviceRendererRPC,
306                 rendererServiceOperations);
307     }
308
309     private OpenRoadmInterfaceFactory initOpenRoadmFactory(MappingUtils mappingUtils,
310             OpenRoadmInterfaces openRoadmInterfaces, PortMapping portMapping) {
311         OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping, openRoadmInterfaces);
312         OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces);
313         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
314         OpenRoadmOtnInterface221 openRoadmOtnInterface221 = new OpenRoadmOtnInterface221(portMapping,
315                 openRoadmInterfaces);
316         OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
317             openRoadmInterfaces);
318         return new OpenRoadmInterfaceFactory(mappingUtils, openRoadmInterface121, openRoadmInterface221,
319             openRoadmInterface710, openRoadmOtnInterface221, openRoadmOtnInterface710);
320     }
321
322     private PortMapping initPortMapping(LightyServices lightyServices, OpenRoadmInterfaces openRoadmInterfaces) {
323         PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(lightyServices.getBindingDataBroker(),
324             deviceTransactionManager, openRoadmInterfaces);
325         PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(lightyServices.getBindingDataBroker(),
326                 deviceTransactionManager, openRoadmInterfaces);
327         PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(lightyServices.getBindingDataBroker(),
328                 deviceTransactionManager, openRoadmInterfaces);
329         return new PortMappingImpl(lightyServices.getBindingDataBroker(), portMappingVersion710,
330             portMappingVersion221, portMappingVersion121);
331     }
332
333     private OpenRoadmInterfaces initOpenRoadmInterfaces(MappingUtils mappingUtils) {
334         OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(
335                 deviceTransactionManager);
336         OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(
337                 deviceTransactionManager);
338         OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(
339             deviceTransactionManager);
340         return new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121,
341                 openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
342     }
343
344     private CrossConnect initCrossConnect(MappingUtils mappingUtils) {
345         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
346         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
347         CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
348         return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
349             crossConnectImpl710);
350     }
351 }