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