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