Migrate servicehandler module to OSGI DS
[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.openroadminterfaces.OpenRoadmInterfaces;
31 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
32 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
33 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
34 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
35 import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
36 import org.opendaylight.transportpce.networkmodel.NetConfTopologyListener;
37 import org.opendaylight.transportpce.networkmodel.NetworkModelProvider;
38 import org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl;
39 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
40 import org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener;
41 import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
42 import org.opendaylight.transportpce.networkmodel.service.FrequenciesServiceImpl;
43 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
44 import org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl;
45 import org.opendaylight.transportpce.olm.OlmPowerServiceRpcImpl;
46 import org.opendaylight.transportpce.olm.OlmProvider;
47 import org.opendaylight.transportpce.olm.power.PowerMgmt;
48 import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
49 import org.opendaylight.transportpce.olm.service.OlmPowerService;
50 import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl;
51 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
52 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
53 import org.opendaylight.transportpce.pce.impl.PceProvider;
54 import org.opendaylight.transportpce.pce.service.PathComputationService;
55 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
56 import org.opendaylight.transportpce.renderer.RendererProvider;
57 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
58 // Adding OTN interface
59 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
60 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl;
61 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
62 // Add OTN
63 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererServiceImpl;
64 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
65 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperationsImpl;
66 import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
67 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
68 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerProvider;
69 import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
70 import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
71 import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
72 import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
73 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
74 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
75 import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
76 import org.opendaylight.transportpce.tapi.impl.TapiProvider;
77 import org.opendaylight.transportpce.tapi.listeners.TapiNetworkModelListenerImpl;
78 import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
79 import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
80 import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
81 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
82 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
83 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelServiceImpl;
84 import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
85 import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
86 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
87 import org.opendaylight.transportpce.tapi.utils.TapiLink;
88 import org.opendaylight.transportpce.tapi.utils.TapiListener;
89 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
90 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
91 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
92 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
93 import org.slf4j.Logger;
94 import org.slf4j.LoggerFactory;
95
96
97 public class TransportPCEImpl extends AbstractLightyModule implements TransportPCE {
98     private static final Logger LOG = LoggerFactory.getLogger(TransportPCEImpl.class);
99     private static final long MAX_DURATION_TO_SUBMIT_TRANSACTION = 1500;
100     // transaction beans
101     // cannot use interface for DeviceTransactionManagerImpl
102     // because implementation has additional public methods ...
103     private final DeviceTransactionManagerImpl deviceTransactionManager;
104     private final NetworkTransactionService networkTransaction;
105     // pce beans
106     private final PceProvider pceProvider;
107     // network model beans
108     private final NetworkModelProvider networkModelProvider;
109     // OLM beans
110     private final OlmProvider olmProvider;
111     // renderer beans
112     private final RendererProvider rendererProvider;
113     // service-handler beans
114     private final ServicehandlerProvider servicehandlerProvider;
115     // T-api
116     private TapiProvider tapiProvider;
117     // nbi-notifications beans
118     private NbiNotificationsProvider nbiNotificationsProvider;
119     /**
120      * List of publisher topics.
121      */
122     private final List<String> publisherServiceList = Arrays.asList("PceListener", "ServiceHandlerOperations",
123             "ServiceHandler", "RendererListener");
124     private final List<String> publisherAlarmList = Arrays.asList("ServiceListener");
125
126     public TransportPCEImpl(LightyServices lightyServices, boolean activateNbiNotification, boolean activateTapi,
127                             String olmtimer1, String olmtimer2) {
128         LOG.info("Initializing transaction providers ...");
129         deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(),
130                 MAX_DURATION_TO_SUBMIT_TRANSACTION);
131         networkTransaction = new NetworkTransactionImpl(lightyServices.getBindingDataBroker());
132
133         LOG.info("Creating network-model beans ...");
134         R2RLinkDiscovery linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getBindingDataBroker(),
135                 deviceTransactionManager, networkTransaction);
136         PortMapping portMapping = initPortMapping(lightyServices);
137         NetworkModelService networkModelService = new NetworkModelServiceImpl(lightyServices.getBindingDataBroker(),
138                 deviceTransactionManager, networkTransaction, portMapping,
139                 lightyServices.getBindingNotificationPublishService());
140         FrequenciesService networkModelWavelengthService = new FrequenciesServiceImpl(
141                 lightyServices.getBindingDataBroker());
142         new NetConfTopologyListener(networkModelService,
143                 lightyServices.getBindingDataBroker(), deviceTransactionManager, portMapping);
144         new PortMappingListener(networkModelService);
145         networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(),
146                 lightyServices.getRpcProviderService(), networkModelService, deviceTransactionManager, portMapping,
147                 lightyServices.getNotificationService(), networkModelWavelengthService);
148
149         LOG.info("Creating PCE beans ...");
150         // TODO: pass those parameters through command line
151         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://127.0.0.1:8008",
152                 "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer());
153         PathComputationService pathComputationService = new PathComputationServiceImpl(
154                 networkTransaction,
155                 lightyServices.getBindingNotificationPublishService(),
156                 gnpyConsumer,
157                 portMapping
158                 );
159         pceProvider = new PceProvider(lightyServices.getRpcProviderService(), pathComputationService);
160
161         LOG.info("Creating OLM beans ...");
162         MappingUtils mappingUtils = new MappingUtilsImpl(lightyServices.getBindingDataBroker());
163         CrossConnect crossConnect = initCrossConnect(mappingUtils);
164         OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils, portMapping);
165         PowerMgmt powerMgmt = new PowerMgmtImpl(openRoadmInterfaces, crossConnect, deviceTransactionManager,
166                 portMapping, Long.valueOf(olmtimer1).longValue(), Long.valueOf(olmtimer2).longValue());
167         OlmPowerService olmPowerService = new OlmPowerServiceImpl(lightyServices.getBindingDataBroker(), powerMgmt,
168                 deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
169         TransportpceOlmService olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
170         olmProvider = new OlmProvider(lightyServices.getRpcProviderService(), olmPowerServiceRpc);
171
172         LOG.info("Creating renderer beans ...");
173         initOpenRoadmFactory(mappingUtils, openRoadmInterfaces, portMapping);
174         DeviceRendererService deviceRendererService = new DeviceRendererServiceImpl(
175                 lightyServices.getBindingDataBroker(), deviceTransactionManager, openRoadmInterfaces, crossConnect,
176                 mappingUtils, portMapping);
177         OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(crossConnect,
178                 openRoadmInterfaces, deviceTransactionManager, mappingUtils, portMapping);
179         rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService,
180                 otnDeviceRendererService, portMapping);
181
182         LOG.info("Creating service-handler beans ...");
183         RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService,
184                 otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(),
185                 lightyServices.getBindingNotificationPublishService(), portMapping);
186         ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(
187                 lightyServices.getBindingDataBroker());
188         RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService,
189             lightyServices.getBindingNotificationPublishService(), networkModelService);
190         PceListenerImpl pceListenerImpl = new PceListenerImpl(rendererServiceOperations, pathComputationService,
191             lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
192         NetworkModelListenerImpl networkModelListenerImpl = new NetworkModelListenerImpl(
193                 lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
194         ServicehandlerImpl servicehandler = new ServicehandlerImpl(pathComputationService, rendererServiceOperations,
195                 lightyServices.getBindingNotificationPublishService(), pceListenerImpl, rendererListenerImpl,
196                 networkModelListenerImpl, serviceDataStoreOperations);
197         ServiceListener serviceListener = new ServiceListener(servicehandler, serviceDataStoreOperations,
198                 lightyServices.getBindingNotificationPublishService());
199         servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(),
200                 lightyServices.getRpcProviderService(), lightyServices.getNotificationService(),
201                 serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
202                 lightyServices.getBindingNotificationPublishService(), servicehandler, serviceListener);
203         if (activateTapi) {
204             LOG.info("Creating tapi beans ...");
205             TapiLink tapiLink = new TapiLink(networkTransaction);
206             R2RTapiLinkDiscovery tapilinkDiscoveryImpl = new R2RTapiLinkDiscovery(networkTransaction,
207                     deviceTransactionManager, tapiLink);
208             TapiRendererListenerImpl tapiRendererListenerImpl = new TapiRendererListenerImpl(lightyServices
209                     .getBindingDataBroker(), lightyServices.getBindingNotificationPublishService());
210             TapiPceListenerImpl tapiPceListenerImpl = new TapiPceListenerImpl(lightyServices.getBindingDataBroker());
211             TapiServiceHandlerListenerImpl tapiServiceHandlerListener = new TapiServiceHandlerListenerImpl(
212                     lightyServices.getBindingDataBroker());
213             TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl = new TapiNetworkUtilsImpl(
214                     networkTransaction, tapiLink);
215             TapiNetworkModelService tapiNetworkModelService = new TapiNetworkModelServiceImpl(
216                     tapilinkDiscoveryImpl, networkTransaction, tapiLink,
217                     lightyServices.getBindingNotificationPublishService());
218             TapiNetconfTopologyListener tapiNetConfTopologyListener =
219                     new TapiNetconfTopologyListener(tapiNetworkModelService);
220             TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransaction);
221             TapiPortMappingListener tapiPortMappingListener =
222                     new TapiPortMappingListener(tapiNetworkModelService);
223             TapiNetworkModelListenerImpl tapiNetworkModelListenerImpl =
224                     new TapiNetworkModelListenerImpl(networkTransaction,
225                             lightyServices.getBindingNotificationPublishService());
226
227             tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
228                     tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl,
229                     tapiPceListenerImpl, tapiRendererListenerImpl, tapiServiceHandlerListener,
230                     lightyServices.getNotificationService(), orLinkListener, tapiNetworkModelListenerImpl);
231         }
232         if (activateNbiNotification) {
233             LOG.info("Creating nbi-notifications beans ...");
234             nbiNotificationsProvider = new NbiNotificationsProvider(
235                     publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
236                     lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer(),
237                     networkTransaction);
238         }
239     }
240
241     @Override
242     protected boolean initProcedure() {
243         if (tapiProvider != null) {
244             LOG.info("Initializing tapi provider ...");
245             tapiProvider.init();
246         }
247         if (nbiNotificationsProvider != null) {
248             LOG.info("Initializing nbi-notifications provider ...");
249             nbiNotificationsProvider.init();
250         }
251         LOG.info("Init done.");
252         return true;
253     }
254
255     @Override
256     protected boolean stopProcedure() {
257         if (nbiNotificationsProvider != null) {
258             nbiNotificationsProvider.close();
259             LOG.info("Shutting down nbi-notifications provider ...");
260         }
261         if (tapiProvider != null) {
262             tapiProvider.close();
263             LOG.info("Shutting down service-handler provider ...");
264         }
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         deviceTransactionManager.preDestroy();
276         LOG.info("Shutdown done.");
277         return true;
278     }
279
280     private TapiProvider initTapi(LightyServices lightyServices, OrgOpenroadmServiceService servicehandler,
281                                   NetworkTransactionService networkTransactionService,
282                                   ServiceDataStoreOperations serviceDataStoreOperations,
283                                   TapiNetconfTopologyListener tapiNetConfTopologyListener,
284                                   TapiPortMappingListener tapiPortMappingListener,
285                                   TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
286                                   TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
287                                   TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
288                                   NotificationService notificationService, TapiOrLinkListener orLinkListener,
289                                   TapiNetworkModelListenerImpl tapiNetworkModelListenerImpl) {
290         return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
291             servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
292             tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
293             rendererListenerImpl, serviceHandlerListenerImpl, notificationService, orLinkListener,
294             tapiNetworkModelListenerImpl);
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(), deviceRendererService,
307                 otnDeviceRendererService, rendererServiceOperations);
308     }
309
310     private OpenRoadmInterfaceFactory initOpenRoadmFactory(MappingUtils mappingUtils,
311             OpenRoadmInterfaces openRoadmInterfaces, PortMapping portMapping) {
312         return new OpenRoadmInterfaceFactory(mappingUtils, portMapping, openRoadmInterfaces);
313     }
314
315     private PortMapping initPortMapping(LightyServices lightyServices) {
316         PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(lightyServices.getBindingDataBroker(),
317                 deviceTransactionManager);
318         PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(lightyServices.getBindingDataBroker(),
319                 deviceTransactionManager);
320         PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(lightyServices.getBindingDataBroker(),
321                 deviceTransactionManager);
322         return new PortMappingImpl(lightyServices.getBindingDataBroker(), portMappingVersion710,
323             portMappingVersion221, portMappingVersion121);
324     }
325
326     private OpenRoadmInterfaces initOpenRoadmInterfaces(MappingUtils mappingUtils, PortMapping portMapping) {
327         OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(
328                 deviceTransactionManager);
329         OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(
330                 deviceTransactionManager, portMapping);
331         OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(
332                 deviceTransactionManager, portMapping);
333         return new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121,
334                 openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
335
336     }
337
338     private CrossConnect initCrossConnect(MappingUtils mappingUtils) {
339         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
340         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
341         CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
342         return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
343             crossConnectImpl710);
344     }
345 }