Convert TapiNetworkModelServiceImpl to 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(networkTransaction,
218                     deviceTransactionManager, tapiLink, lightyServices.getBindingNotificationPublishService());
219             TapiNetconfTopologyListener tapiNetConfTopologyListener =
220                     new TapiNetconfTopologyListener(tapiNetworkModelService);
221             TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransaction);
222             TapiPortMappingListener tapiPortMappingListener =
223                     new TapiPortMappingListener(tapiNetworkModelService);
224             TapiNetworkModelListenerImpl tapiNetworkModelListenerImpl =
225                     new TapiNetworkModelListenerImpl(networkTransaction,
226                             lightyServices.getBindingNotificationPublishService());
227
228             tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
229                     tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl,
230                     tapiPceListenerImpl, tapiRendererListenerImpl, tapiServiceHandlerListener,
231                     lightyServices.getNotificationService(), orLinkListener, tapiNetworkModelListenerImpl);
232         }
233         if (activateNbiNotification) {
234             LOG.info("Creating nbi-notifications beans ...");
235             nbiNotificationsProvider = new NbiNotificationsProvider(
236                     publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
237                     lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer(),
238                     networkTransaction);
239         }
240     }
241
242     @Override
243     protected boolean initProcedure() {
244         if (tapiProvider != null) {
245             LOG.info("Initializing tapi provider ...");
246             tapiProvider.init();
247         }
248         if (nbiNotificationsProvider != null) {
249             LOG.info("Initializing nbi-notifications provider ...");
250             nbiNotificationsProvider.init();
251         }
252         LOG.info("Init done.");
253         return true;
254     }
255
256     @Override
257     protected boolean stopProcedure() {
258         if (nbiNotificationsProvider != null) {
259             nbiNotificationsProvider.close();
260             LOG.info("Shutting down nbi-notifications provider ...");
261         }
262         if (tapiProvider != null) {
263             tapiProvider.close();
264             LOG.info("Shutting down service-handler provider ...");
265         }
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         deviceTransactionManager.preDestroy();
277         LOG.info("Shutdown done.");
278         return true;
279     }
280
281     private TapiProvider initTapi(LightyServices lightyServices, OrgOpenroadmServiceService servicehandler,
282                                   NetworkTransactionService networkTransactionService,
283                                   ServiceDataStoreOperations serviceDataStoreOperations,
284                                   TapiNetconfTopologyListener tapiNetConfTopologyListener,
285                                   TapiPortMappingListener tapiPortMappingListener,
286                                   TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
287                                   TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
288                                   TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
289                                   NotificationService notificationService, TapiOrLinkListener orLinkListener,
290                                   TapiNetworkModelListenerImpl tapiNetworkModelListenerImpl) {
291         return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
292             servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
293             tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
294             rendererListenerImpl, serviceHandlerListenerImpl, notificationService, orLinkListener,
295             tapiNetworkModelListenerImpl);
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(), deviceRendererService,
308                 otnDeviceRendererService, deviceRendererRPC,
309                 new TransportPCEServicePathRPCImpl(rendererServiceOperations));
310     }
311
312     private OpenRoadmInterfaceFactory initOpenRoadmFactory(MappingUtils mappingUtils,
313             OpenRoadmInterfaces openRoadmInterfaces, PortMapping portMapping) {
314         return new OpenRoadmInterfaceFactory(mappingUtils, portMapping, openRoadmInterfaces);
315     }
316
317     private PortMapping initPortMapping(LightyServices lightyServices) {
318         PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(lightyServices.getBindingDataBroker(),
319                 deviceTransactionManager);
320         PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(lightyServices.getBindingDataBroker(),
321                 deviceTransactionManager);
322         PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(lightyServices.getBindingDataBroker(),
323                 deviceTransactionManager);
324         return new PortMappingImpl(lightyServices.getBindingDataBroker(), portMappingVersion710,
325             portMappingVersion221, portMappingVersion121);
326     }
327
328     private OpenRoadmInterfaces initOpenRoadmInterfaces(MappingUtils mappingUtils, PortMapping portMapping) {
329         OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(
330                 deviceTransactionManager);
331         OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(
332                 deviceTransactionManager, portMapping);
333         OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(
334                 deviceTransactionManager, portMapping);
335         return new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121,
336                 openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
337
338     }
339
340     private CrossConnect initCrossConnect(MappingUtils mappingUtils) {
341         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
342         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
343         CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
344         return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
345             crossConnectImpl710);
346     }
347 }