24c5ec3b89dce0077dbb9e7ee8702f10726a949a
[oam/oam-controller.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  */
22 /*
23  * ============LICENSE_START========================================================================
24  * ONAP : ccsdk feature sdnr wt
25  * =================================================================================================
26  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
27  * =================================================================================================
28  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
29  * in compliance with the License. You may obtain a copy of the License at
30  *
31  * http://www.apache.org/licenses/LICENSE-2.0
32  *
33  * Unless required by applicable law or agreed to in writing, software distributed under the License
34  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
35  * or implied. See the License for the specific language governing permissions and limitations under
36  * the License.
37  * ============LICENSE_END==========================================================================
38  */
39 package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl;
40
41 import java.util.Collections;
42 import java.util.List;
43 import java.util.concurrent.CopyOnWriteArrayList;
44 import org.eclipse.jdt.annotation.NonNull;
45 import org.eclipse.jdt.annotation.Nullable;
46 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
47 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
48 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider;
49 import org.onap.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl.AaiProviderClient;
50 import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeForwarderImpl;
51 import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeProviderClient;
52 import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitor;
53 import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitorImpl;
54 import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.DeviceManagerDatabaseNotificationService;
55 import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.ODLEventListenerHandler;
56 import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.RpcPushNotificationsHandler;
57 import org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping.ConnectionStatusHousekeepingService;
58 import org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping.ResyncNetworkElementHouskeepingService;
59 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientImpl;
60 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientInternal;
61 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl.MaintenanceServiceImpl;
62 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.DevicemanagerNature;
63 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.FactoryRegistration;
64 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory;
65 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory2;
66 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
67 import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.PerformanceManagerImpl;
68 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.AaiService;
69 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
70 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.EquipmentService;
71 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.EventHandlingService;
72 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
73 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.MaintenanceService;
74 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NetconfNetworkElementService;
75 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationService;
76 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.PerformanceManager;
77 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
78 import org.onap.ccsdk.features.sdnr.wt.devicemanager.toggleAlarmFilter.DevicemanagerNotificationDelayService;
79 import org.onap.ccsdk.features.sdnr.wt.devicemanager.vescollectorconnector.impl.VESCollectorServiceImpl;
80 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateService;
81 import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService;
82 import org.opendaylight.mdsal.binding.api.DataBroker;
83 import org.opendaylight.mdsal.binding.api.MountPointService;
84 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
85 import org.opendaylight.mdsal.binding.api.RpcProviderService;
86 import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider;
87 import org.slf4j.Logger;
88 import org.slf4j.LoggerFactory;
89
90 /**
91  * Devicemanager - Handles startup and closedown of network element handlers for netconf session - Provide common
92  * services for network element specific components
93  */
94 public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceManagerServiceProvider, AutoCloseable {
95
96     private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerImpl.class);
97     private static final String APPLICATION_NAME = "DeviceManager";
98     private static final String MYDBKEYNAMEBASE = "SDN-Controller";
99     private static final String CONFIGURATIONFILE = "etc/devicemanager.properties";
100     public static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
101
102     @SuppressWarnings("unused")
103     private static final String STARTUPLOG_FILENAME = "etc/devicemanager.startup.log";
104
105     // MDSAL Services
106     private DataBroker dataBroker;
107     private MountPointService mountPointService;
108     private RpcProviderService rpcProviderRegistry;
109     private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
110     private WebsocketManagerService websocketmanagerService;
111     private IEntityDataProvider iEntityDataProvider;
112
113     // Devicemanager common services for network element handler
114     private WebSocketServiceClientInternal webSocketService;
115     private ODLEventListenerHandler odlEventListenerHandler; //EventHandlingService
116     private DeviceManagerApiServiceImpl rpcApiService;
117     private PerformanceManagerImpl performanceManager;
118     private DcaeProviderClient dcaeProviderClient;
119     private AaiProviderClient aaiProviderClient;
120     private DcaeForwarderImpl aotsDcaeForwarder;
121     private DeviceMonitor deviceMonitor;
122     private MaintenanceServiceImpl maintenanceService;
123     private DevicemanagerNotificationDelayService notificationDelayService;
124     private ResyncNetworkElementHouskeepingService resyncNetworkElementHouskeepingService;
125     private ConnectionStatusHousekeepingService housekeepingService;
126     private NetconfNodeStateService netconfNodeStateService;
127     private DataProvider dataProvider;
128     private VESCollectorServiceImpl vesCollectorServiceImpl;
129
130     // Handler
131     private DeviceManagerNetconfConnectHandler deviceManagerNetconfConnectHandler;
132
133     // Attributes
134     private final List<NetworkElementFactory> factoryList;
135
136     private DeviceManagerDatabaseNotificationService deviceManagerDatabaseAndNotificationService;
137
138     ConfigurationFileRepresentation config;
139     private Boolean devicemanagerInitializationOk;
140
141     // Blueprint 1
142     public DeviceManagerImpl() {
143         LOG.info("Creating provider for {}", APPLICATION_NAME);
144         this.devicemanagerInitializationOk = false;
145         this.factoryList = new CopyOnWriteArrayList<>();
146
147         this.dataBroker = null;
148         this.mountPointService = null;
149         this.rpcProviderRegistry = null;
150         this.clusterSingletonServiceProvider = null;
151         this.websocketmanagerService = null;
152         this.iEntityDataProvider = null;
153
154         this.webSocketService = null;
155     }
156
157     public void setDataBroker(DataBroker dataBroker) {
158         this.dataBroker = dataBroker;
159     }
160
161     public void setRpcProviderRegistry(RpcProviderService rpcProviderRegistry) {
162         this.rpcProviderRegistry = rpcProviderRegistry;
163     }
164
165     public void setNotificationPublishService(NotificationPublishService notificationPublishService) {}
166
167     public void setMountPointService(MountPointService mountPointService) {
168         this.mountPointService = mountPointService;
169     }
170
171     public void setClusterSingletonService(ClusterSingletonServiceProvider clusterSingletonService) {
172         this.clusterSingletonServiceProvider = clusterSingletonService;
173     }
174
175     public void setNetconfNodeStateService(NetconfNodeStateService netconfNodeStateService) {
176         this.netconfNodeStateService = netconfNodeStateService;
177     }
178
179     public void setWebsocketmanagerService(WebsocketManagerService websocketmanagerService) {
180         this.websocketmanagerService = websocketmanagerService;
181     }
182
183     public void setEntityDataProvider(IEntityDataProvider iEntityDataProvider) {
184         this.iEntityDataProvider = iEntityDataProvider;
185     }
186
187     public void init() {
188
189         LOG.info("Session Initiated start {}", APPLICATION_NAME);
190
191         this.dataProvider = iEntityDataProvider.getDataProvider();
192
193         // Get configuration
194         this.config = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
195
196         this.notificationDelayService = new DevicemanagerNotificationDelayService(config);
197
198         // start service for device maintenance service
199         this.maintenanceService = new MaintenanceServiceImpl(iEntityDataProvider.getHtDatabaseMaintenance());
200
201         // Websockets
202         this.webSocketService = new WebSocketServiceClientImpl(websocketmanagerService);
203
204         // DCAE
205         this.dcaeProviderClient = new DcaeProviderClient(config,"", this);
206
207         this.aaiProviderClient = new AaiProviderClient(config, this);
208
209         this.vesCollectorServiceImpl = new VESCollectorServiceImpl(config);
210         // EM
211         String myDbKeyNameExtended = MYDBKEYNAMEBASE + "-";
212
213         this.aotsDcaeForwarder = new DcaeForwarderImpl(null, dcaeProviderClient, maintenanceService);
214
215         this.deviceManagerDatabaseAndNotificationService = new DeviceManagerDatabaseNotificationService(dataProvider,
216                 maintenanceService, webSocketService, notificationDelayService, aotsDcaeForwarder);
217
218         RpcPushNotificationsHandler rpcPushNotificationsHandler =
219                 new RpcPushNotificationsHandler(webSocketService, dataProvider, aotsDcaeForwarder);
220         this.odlEventListenerHandler = new ODLEventListenerHandler(myDbKeyNameExtended, webSocketService, dataProvider,
221                 aotsDcaeForwarder, dataBroker);
222         this.housekeepingService = new ConnectionStatusHousekeepingService(config, clusterSingletonServiceProvider,
223                 this.dataBroker, dataProvider);
224         // PM
225         this.performanceManager = new PerformanceManagerImpl(60, this, dataProvider, config);
226         // DM
227         // DeviceMonitor has to be available before netconfSubscriptionManager is
228         // configured
229         LOG.debug("start DeviceMonitor Service");
230         this.deviceMonitor = new DeviceMonitorImpl(dataBroker, odlEventListenerHandler, config);
231
232         // ResyncNetworkElementHouskeepingService
233         this.resyncNetworkElementHouskeepingService = new ResyncNetworkElementHouskeepingService(this,
234                 mountPointService, odlEventListenerHandler, dataProvider, deviceMonitor);
235
236         // RPC Service for specific services
237         // Start RPC Service
238         LOG.debug("start rpc service");
239         this.rpcApiService = new DeviceManagerApiServiceImpl(rpcProviderRegistry, maintenanceService,
240                 resyncNetworkElementHouskeepingService, rpcPushNotificationsHandler);
241
242         // netconfSubscriptionManager should be the last one because this is a callback
243
244         // service
245         LOG.debug("start NetconfSubscriptionManager Service");
246         this.deviceManagerNetconfConnectHandler = new DeviceManagerNetconfConnectHandler(netconfNodeStateService,
247                 clusterSingletonServiceProvider, odlEventListenerHandler, deviceMonitor, this, factoryList);
248
249         writeToEventLog(APPLICATION_NAME, "startup", "done");
250         this.devicemanagerInitializationOk = true;
251
252         LOG.info("Session Initiated end. Initialization done {}", devicemanagerInitializationOk);
253     }
254
255     @Override
256     public void close() {
257         LOG.info("DeviceManagerImpl closing ...");
258         close(performanceManager);
259         close(dcaeProviderClient);
260         close(aotsDcaeForwarder);
261         close(aaiProviderClient);
262         close(deviceMonitor);
263         close(maintenanceService);
264         close(rpcApiService);
265         close(notificationDelayService);
266         close(housekeepingService);
267         close(deviceManagerNetconfConnectHandler);
268         close(vesCollectorServiceImpl);
269         LOG.info("DeviceManagerImpl closing done");
270     }
271
272     @Override
273     synchronized public @NonNull <L extends NetworkElementFactory> FactoryRegistration<L> registerBindingNetworkElementFactory(
274             @NonNull final L factory) {
275         LOG.debug("Factory registration {}", factory.getClass().getName());
276
277         factoryList.add(factory);
278         Collections.sort(factoryList, (a,b) -> DevicemanagerNature.compareTo(a, b) );
279         factory.init(getServiceProvider());
280         return new FactoryRegistration<L>() {
281
282             @Override
283             public @NonNull L getInstance() {
284                 return factory;
285             }
286
287             @Override
288             public void close() {
289                 factoryList.remove(factory);
290             }
291
292         };
293     }
294
295     private DevicemanagerNature getNature(NetworkElementFactory a) {
296         return (a instanceof NetworkElementFactory2) ? ((NetworkElementFactory2)a).getDevicemanagerNature()
297                 : DevicemanagerNature.NETWORKELEMENT_FACTORY_DEFAULT;
298     }
299
300     @Override
301     public @NonNull DataProvider getDataProvider() {
302         return this.dataProvider;
303     }
304
305     @SuppressWarnings("null")
306     @Override
307     public @NonNull NotificationService getNotificationService() {
308         return this.deviceManagerDatabaseAndNotificationService;
309     }
310
311     @SuppressWarnings("null")
312     @Override
313     public @NonNull FaultService getFaultService() {
314         return this.deviceManagerDatabaseAndNotificationService;
315     }
316
317     @SuppressWarnings("null")
318     @Override
319     public @NonNull EquipmentService getEquipmentService() {
320         return this.deviceManagerDatabaseAndNotificationService;
321     }
322
323     @SuppressWarnings("null")
324     @Override
325     public @NonNull AaiService getAaiService() {
326         return this.aaiProviderClient;
327     }
328
329     @SuppressWarnings("null")
330     @Override
331     public @NonNull MaintenanceService getMaintenanceService() {
332         return this.maintenanceService;
333     }
334
335     @SuppressWarnings("null")
336     @Override
337     public @NonNull PerformanceManager getPerformanceManagerService() {
338         return this.performanceManager;
339     }
340
341     @SuppressWarnings("null")
342     @Override
343     public @NonNull EventHandlingService getEventHandlingService() {
344         return this.odlEventListenerHandler;
345     }
346
347     @SuppressWarnings("null")
348     @Override
349     public @NonNull ConfigurationFileRepresentation getConfigurationFileRepresentation() {
350         return this.config;
351     }
352
353     // Deviceinitialization
354
355     /**
356      * Used to close all Services, that should support AutoCloseable Pattern
357      *
358      * @param toCloseList
359      */
360     private void close(AutoCloseable... toCloseList) {
361         for (AutoCloseable element : toCloseList) {
362             if (element != null) {
363                 try {
364                     element.close();
365                 } catch (Exception e) {
366                     LOG.warn("Problem during close {}", e);
367                 }
368             }
369         }
370     }
371
372     /*-------------------------------------------------------------------------------------------
373      * Functions
374      */
375     public DataProvider getDatabaseClientEvents() {
376         return dataProvider;
377     }
378
379     @Override
380     public DeviceManagerServiceProvider getServiceProvider() {
381         return this;
382     }
383
384     /**
385      * Indication if init() of devicemanager successfully done.
386      *
387      * @return true if init() was sucessfull. False if not done or not successfull.
388      */
389     public boolean isDevicemanagerInitializationOk() {
390         return this.devicemanagerInitializationOk;
391     }
392
393     /**
394      * Get NE object. Used by DCAE Service
395      *
396      * @param mountpoint mount point name
397      * @return null or NE specific data
398      */
399     public @Nullable NetworkElement getConnectedNeByMountpoint(String mountpoint) {
400
401         return this.deviceManagerNetconfConnectHandler.getConnectedNeByMountpoint(mountpoint);
402
403     }
404
405     @Override
406     public void writeToEventLog(String objectId, String msg, String value) {
407         this.odlEventListenerHandler.writeEventLog(objectId, msg, value);
408     }
409
410     @Override
411     public @NonNull VESCollectorService getVESCollectorService() {
412         return this.vesCollectorServiceImpl;
413     }
414
415     @Override
416     public WebsocketManagerService getWebsocketService() {
417         return this.websocketmanagerService;
418     }
419
420
421 }