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