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