9ee5b91c0a45f6fc8a9fafb4f52cbc10edb1b385
[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.TapiListener;
90 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
91 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
92 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
93 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
94 import org.slf4j.Logger;
95 import org.slf4j.LoggerFactory;
96
97
98 public class TransportPCEImpl extends AbstractLightyModule implements TransportPCE {
99     private static final Logger LOG = LoggerFactory.getLogger(TransportPCEImpl.class);
100     private static final long MAX_DURATION_TO_SUBMIT_TRANSACTION = 1500;
101     // transaction beans
102     // cannot use interface for DeviceTransactionManagerImpl
103     // because implementation has additional public methods ...
104     private final DeviceTransactionManagerImpl deviceTransactionManager;
105     private final NetworkTransactionService networkTransaction;
106     // pce beans
107     private final PceProvider pceProvider;
108     // network model beans
109     private final NetworkModelProvider networkModelProvider;
110     // OLM beans
111     private final OlmProvider olmProvider;
112     // renderer beans
113     private final RendererProvider rendererProvider;
114     // service-handler beans
115     private final ServicehandlerProvider servicehandlerProvider;
116     // T-api
117     private TapiProvider tapiProvider;
118     // nbi-notifications beans
119     private NbiNotificationsProvider nbiNotificationsProvider;
120     /**
121      * List of publisher topics.
122      */
123     private final List<String> publisherServiceList = Arrays.asList("PceListener", "ServiceHandlerOperations",
124             "ServiceHandler", "RendererListener");
125     private final List<String> publisherAlarmList = Arrays.asList("ServiceListener");
126
127     public TransportPCEImpl(LightyServices lightyServices, boolean activateNbiNotification, boolean activateTapi,
128                             String olmtimer1, String olmtimer2) {
129         LOG.info("Initializing transaction providers ...");
130         deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(),
131                 MAX_DURATION_TO_SUBMIT_TRANSACTION);
132         networkTransaction = new NetworkTransactionImpl(lightyServices.getBindingDataBroker());
133
134         LOG.info("Creating network-model beans ...");
135         R2RLinkDiscovery linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getBindingDataBroker(),
136                 deviceTransactionManager, networkTransaction);
137         PortMapping portMapping = initPortMapping(lightyServices);
138         NetworkModelService networkModelService = new NetworkModelServiceImpl(lightyServices.getBindingDataBroker(),
139                 deviceTransactionManager, networkTransaction, portMapping,
140                 lightyServices.getBindingNotificationPublishService());
141         FrequenciesService networkModelWavelengthService = new FrequenciesServiceImpl(
142                 lightyServices.getBindingDataBroker());
143         new NetConfTopologyListener(networkModelService,
144                 lightyServices.getBindingDataBroker(), deviceTransactionManager, portMapping);
145         new PortMappingListener(networkModelService);
146         networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(),
147                 lightyServices.getRpcProviderService(), networkModelService, deviceTransactionManager, portMapping,
148                 lightyServices.getNotificationService(), networkModelWavelengthService);
149
150         LOG.info("Creating PCE beans ...");
151         // TODO: pass those parameters through command line
152         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://127.0.0.1:8008",
153                 "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer());
154         PathComputationService pathComputationService = new PathComputationServiceImpl(
155                 networkTransaction,
156                 lightyServices.getBindingNotificationPublishService(),
157                 gnpyConsumer,
158                 portMapping
159                 );
160         pceProvider = new PceProvider(lightyServices.getRpcProviderService(), pathComputationService);
161
162         LOG.info("Creating OLM beans ...");
163         MappingUtils mappingUtils = new MappingUtilsImpl(lightyServices.getBindingDataBroker());
164         CrossConnect crossConnect = initCrossConnect(mappingUtils);
165         OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils, portMapping);
166         PowerMgmt powerMgmt = new PowerMgmtImpl(openRoadmInterfaces, crossConnect, deviceTransactionManager,
167                 portMapping, Long.valueOf(olmtimer1).longValue(), Long.valueOf(olmtimer2).longValue());
168         OlmPowerService olmPowerService = new OlmPowerServiceImpl(lightyServices.getBindingDataBroker(), powerMgmt,
169                 deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
170         TransportpceOlmService olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
171         olmProvider = new OlmProvider(lightyServices.getRpcProviderService(), olmPowerServiceRpc);
172
173         LOG.info("Creating renderer beans ...");
174         initOpenRoadmFactory(mappingUtils, openRoadmInterfaces, portMapping);
175         DeviceRendererService deviceRendererService = new DeviceRendererServiceImpl(
176                 lightyServices.getBindingDataBroker(), deviceTransactionManager, openRoadmInterfaces, crossConnect,
177                 mappingUtils, portMapping);
178         OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(crossConnect,
179                 openRoadmInterfaces, deviceTransactionManager, mappingUtils, portMapping);
180         rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService,
181                 otnDeviceRendererService, portMapping);
182
183         LOG.info("Creating service-handler beans ...");
184         RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService,
185                 otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(),
186                 lightyServices.getBindingNotificationPublishService(), portMapping);
187         ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(
188                 lightyServices.getBindingDataBroker());
189         RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService,
190             lightyServices.getBindingNotificationPublishService(), networkModelService);
191         PceListenerImpl pceListenerImpl = new PceListenerImpl(rendererServiceOperations, pathComputationService,
192             lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
193         NetworkModelListenerImpl networkModelListenerImpl = new NetworkModelListenerImpl(
194                 lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
195         ServicehandlerImpl servicehandler = new ServicehandlerImpl(pathComputationService, rendererServiceOperations,
196                 lightyServices.getBindingNotificationPublishService(), pceListenerImpl, rendererListenerImpl,
197                 networkModelListenerImpl, serviceDataStoreOperations);
198         ServiceListener serviceListener = new ServiceListener(servicehandler, serviceDataStoreOperations,
199                 lightyServices.getBindingNotificationPublishService());
200         servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(),
201                 lightyServices.getRpcProviderService(), lightyServices.getNotificationService(),
202                 serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
203                 lightyServices.getBindingNotificationPublishService(), servicehandler, serviceListener);
204         if (activateTapi) {
205             LOG.info("Creating tapi beans ...");
206             TapiLink tapiLink = new TapiLink(networkTransaction);
207             R2RTapiLinkDiscovery tapilinkDiscoveryImpl = new R2RTapiLinkDiscovery(networkTransaction,
208                     deviceTransactionManager, tapiLink);
209             TapiRendererListenerImpl tapiRendererListenerImpl = new TapiRendererListenerImpl(lightyServices
210                     .getBindingDataBroker(), lightyServices.getBindingNotificationPublishService());
211             TapiPceListenerImpl tapiPceListenerImpl = new TapiPceListenerImpl(lightyServices.getBindingDataBroker());
212             TapiServiceHandlerListenerImpl tapiServiceHandlerListener = new TapiServiceHandlerListenerImpl(
213                     lightyServices.getBindingDataBroker());
214             TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl = new TapiNetworkUtilsImpl(
215                     networkTransaction, tapiLink);
216             TapiNetworkModelService tapiNetworkModelService = new TapiNetworkModelServiceImpl(
217                     tapilinkDiscoveryImpl, networkTransaction, tapiLink,
218                     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 }