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