Refactor OLM timers management
[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> publisherTopicList = Arrays.asList("PceListener", "ServiceHandlerOperations",
126             "ServiceHandler", "RendererListener");
127     private final List<String> publisherTopicAlarmList = Arrays.asList("ServiceListener");
128
129     public TransportPCEImpl(LightyServices lightyServices, boolean activateNbiNotification,
130                             String olmtimer1, String olmtimer2) {
131         LOG.info("Initializing transaction providers ...");
132         deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(),
133                 MAX_DURATION_TO_SUBMIT_TRANSACTION);
134         RequestProcessor requestProcessor = new RequestProcessor(lightyServices.getBindingDataBroker());
135         networkTransaction = new NetworkTransactionImpl(requestProcessor);
136
137         LOG.info("Creating network-model beans ...");
138         R2RLinkDiscovery linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getBindingDataBroker(),
139                 deviceTransactionManager, networkTransaction);
140         TransportpceNetworkutilsService networkutilsServiceImpl = new NetworkUtilsImpl(
141                 lightyServices.getBindingDataBroker());
142         MappingUtils mappingUtils = new MappingUtilsImpl(lightyServices.getBindingDataBroker());
143         OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils);
144         PortMapping portMapping = initPortMapping(lightyServices, openRoadmInterfaces);
145         NetworkModelService networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl,
146                 portMapping, lightyServices.getBindingNotificationPublishService());
147         FrequenciesService networkModelWavelengthService =
148                 new FrequenciesServiceImpl(lightyServices.getBindingDataBroker());
149         NetConfTopologyListener netConfTopologyListener = new NetConfTopologyListener(networkModelService,
150                 lightyServices.getBindingDataBroker(), deviceTransactionManager, portMapping);
151         PortMappingListener portMappingListener = new PortMappingListener(networkModelService);
152         networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(),
153                 lightyServices.getRpcProviderService(), networkutilsServiceImpl, netConfTopologyListener,
154                 lightyServices.getNotificationService(), networkModelWavelengthService, portMappingListener);
155
156         LOG.info("Creating PCE beans ...");
157         // TODO: pass those parameters through command line
158         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://127.0.0.1:8008",
159                 "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer());
160         PathComputationService pathComputationService = new PathComputationServiceImpl(
161                 networkTransaction,
162                 lightyServices.getBindingNotificationPublishService(),
163                 gnpyConsumer,
164                 portMapping
165                 );
166         pceProvider = new PceProvider(lightyServices.getRpcProviderService(), pathComputationService);
167
168         LOG.info("Creating OLM beans ...");
169         CrossConnect crossConnect = initCrossConnect(mappingUtils);
170         PowerMgmt powerMgmt = new PowerMgmtImpl(lightyServices.getBindingDataBroker(), openRoadmInterfaces,
171                 crossConnect, deviceTransactionManager, olmtimer1, olmtimer2);
172         OlmPowerService olmPowerService = new OlmPowerServiceImpl(lightyServices.getBindingDataBroker(), powerMgmt,
173                 deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
174         olmProvider = new OlmProvider(lightyServices.getRpcProviderService(), olmPowerService);
175         TransportpceOlmService olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
176
177         LOG.info("Creating renderer beans ...");
178         OpenRoadmInterfaceFactory openRoadmInterfaceFactory = initOpenRoadmFactory(mappingUtils, openRoadmInterfaces,
179                 portMapping);
180         DeviceRendererService deviceRendererService = new DeviceRendererServiceImpl(
181                 lightyServices.getBindingDataBroker(), deviceTransactionManager, openRoadmInterfaceFactory,
182                 openRoadmInterfaces, crossConnect, portMapping, networkModelService);
183         OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(openRoadmInterfaceFactory,
184                 crossConnect, openRoadmInterfaces, deviceTransactionManager, networkModelService);
185         rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService,
186                 otnDeviceRendererService, portMapping);
187
188         LOG.info("Creating service-handler beans ...");
189         RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService,
190                 otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(),
191                 lightyServices.getBindingNotificationPublishService(), portMapping);
192         ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(
193                 lightyServices.getBindingDataBroker());
194         RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService,
195             lightyServices.getBindingNotificationPublishService(), networkModelService);
196         PceListenerImpl pceListenerImpl = new PceListenerImpl(rendererServiceOperations, pathComputationService,
197             lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
198         ServiceListener serviceListener = new ServiceListener(lightyServices.getBindingDataBroker(),
199                 lightyServices.getBindingNotificationPublishService());
200         NetworkModelListenerImpl networkModelListenerImpl = new NetworkModelListenerImpl(
201                 lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
202         ServicehandlerImpl servicehandler = new ServicehandlerImpl(lightyServices.getBindingDataBroker(),
203             pathComputationService, rendererServiceOperations, lightyServices.getBindingNotificationPublishService(),
204             pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, serviceDataStoreOperations, "N/A");
205         servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(),
206                 lightyServices.getRpcProviderService(), lightyServices.getNotificationService(),
207                 serviceDataStoreOperations, pceListenerImpl, serviceListener, rendererListenerImpl,
208                 networkModelListenerImpl, servicehandler);
209
210         LOG.info("Creating tapi beans ...");
211         R2RTapiLinkDiscovery tapilinkDiscoveryImpl = new R2RTapiLinkDiscovery(lightyServices.getBindingDataBroker(),
212             deviceTransactionManager);
213         TapiRendererListenerImpl tapiRendererListenerImpl = new TapiRendererListenerImpl(lightyServices
214                 .getBindingDataBroker());
215         TapiPceListenerImpl tapiPceListenerImpl = new TapiPceListenerImpl(lightyServices.getBindingDataBroker());
216         TapiServiceHandlerListenerImpl tapiServiceHandlerListener = new TapiServiceHandlerListenerImpl(lightyServices
217                 .getBindingDataBroker());
218         TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl = new TapiNetworkUtilsImpl(
219                 networkTransaction);
220         TapiNetworkModelService tapiNetworkModelService = new TapiNetworkModelServiceImpl(
221             tapilinkDiscoveryImpl, networkTransaction);
222         TapiNetconfTopologyListener tapiNetConfTopologyListener =
223                 new TapiNetconfTopologyListener(tapiNetworkModelService);
224         TapiPortMappingListener tapiPortMappingListener =
225             new TapiPortMappingListener(tapiNetworkModelService);
226
227         tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
228                 tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, tapiPceListenerImpl,
229                 tapiRendererListenerImpl, tapiServiceHandlerListener, lightyServices.getNotificationService());
230         if (activateNbiNotification) {
231             LOG.info("Creating nbi-notifications beans ...");
232             nbiNotificationsProvider = new NbiNotificationsProvider(
233                     publisherTopicList, publisherTopicAlarmList, null, null, lightyServices.getRpcProviderService(),
234                     lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer());
235         }
236     }
237
238     @Override
239     protected boolean initProcedure() {
240         LOG.info("Initializing PCE provider ...");
241         pceProvider.init();
242         LOG.info("Initializing network-model provider ...");
243         networkModelProvider.init();
244         LOG.info("Initializing OLM provider ...");
245         olmProvider.init();
246         LOG.info("Initializing renderer provider ...");
247         rendererProvider.init();
248         LOG.info("Initializing service-handler provider ...");
249         servicehandlerProvider.init();
250         LOG.info("Initializing tapi provider ...");
251         tapiProvider.init();
252         if (nbiNotificationsProvider != null) {
253             LOG.info("Initializing nbi-notifications provider ...");
254             nbiNotificationsProvider.init();
255         }
256         LOG.info("Init done.");
257         return true;
258     }
259
260     @Override
261     protected boolean stopProcedure() {
262         nbiNotificationsProvider.close();
263         LOG.info("Shutting down nbi-notifications provider ...");
264         tapiProvider.close();
265         LOG.info("Shutting down service-handler provider ...");
266         servicehandlerProvider.close();
267         LOG.info("Shutting down renderer provider ...");
268         rendererProvider.close();
269         LOG.info("Shutting down OLM provider ...");
270         olmProvider.close();
271         LOG.info("Shutting down network-model provider ...");
272         networkModelProvider.close();
273         LOG.info("Shutting down PCE provider ...");
274         pceProvider.close();
275         LOG.info("Shutting down transaction providers ...");
276         networkTransaction.close();
277         deviceTransactionManager.preDestroy();
278         LOG.info("Shutdown done.");
279         return true;
280     }
281
282     private TapiProvider initTapi(LightyServices lightyServices, OrgOpenroadmServiceService servicehandler,
283                                   NetworkTransactionService networkTransactionService,
284                                   ServiceDataStoreOperations serviceDataStoreOperations,
285                                   TapiNetconfTopologyListener tapiNetConfTopologyListener,
286                                   TapiPortMappingListener tapiPortMappingListener,
287                                   TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
288                                   TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
289                                   TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
290                                   NotificationService notificationService) {
291         return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
292             servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
293             tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
294             rendererListenerImpl, serviceHandlerListenerImpl, notificationService);
295     }
296
297     private RendererProvider initRenderer(LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc,
298             DeviceRendererService deviceRendererService, OtnDeviceRendererService otnDeviceRendererService,
299             PortMapping portMapping) {
300         DeviceRendererRPCImpl deviceRendererRPC = new DeviceRendererRPCImpl(deviceRendererService,
301                 otnDeviceRendererService);
302         RendererServiceOperationsImpl rendererServiceOperations = new RendererServiceOperationsImpl(
303                 deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc,
304                 lightyServices.getBindingDataBroker(), lightyServices.getBindingNotificationPublishService(),
305                 portMapping);
306         return new RendererProvider(lightyServices.getRpcProviderService(), deviceRendererRPC,
307                 rendererServiceOperations);
308     }
309
310     private OpenRoadmInterfaceFactory initOpenRoadmFactory(MappingUtils mappingUtils,
311             OpenRoadmInterfaces openRoadmInterfaces, PortMapping portMapping) {
312         OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping, openRoadmInterfaces);
313         OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces);
314         OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
315         OpenRoadmOtnInterface221 openRoadmOtnInterface221 = new OpenRoadmOtnInterface221(portMapping,
316                 openRoadmInterfaces);
317         OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
318             openRoadmInterfaces);
319         return new OpenRoadmInterfaceFactory(mappingUtils, openRoadmInterface121, openRoadmInterface221,
320             openRoadmInterface710, openRoadmOtnInterface221, openRoadmOtnInterface710);
321     }
322
323     private PortMapping initPortMapping(LightyServices lightyServices, OpenRoadmInterfaces openRoadmInterfaces) {
324         PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(lightyServices.getBindingDataBroker(),
325             deviceTransactionManager, openRoadmInterfaces);
326         PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(lightyServices.getBindingDataBroker(),
327                 deviceTransactionManager, openRoadmInterfaces);
328         PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(lightyServices.getBindingDataBroker(),
329                 deviceTransactionManager, openRoadmInterfaces);
330         return new PortMappingImpl(lightyServices.getBindingDataBroker(), portMappingVersion710,
331             portMappingVersion221, portMappingVersion121);
332     }
333
334     private OpenRoadmInterfaces initOpenRoadmInterfaces(MappingUtils mappingUtils) {
335         OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(
336                 deviceTransactionManager);
337         OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(
338                 deviceTransactionManager);
339         OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(
340             deviceTransactionManager);
341         return new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121,
342                 openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
343     }
344
345     private CrossConnect initCrossConnect(MappingUtils mappingUtils) {
346         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
347         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
348         CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
349         return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
350             crossConnectImpl710);
351     }
352 }