50b0215d6d9280efb21b5ee6b2a9711a4f45ca19
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk feature sdnr wt
4  *  ================================================================================
5  * Copyright (C) 2019 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 package org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping;
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Optional;
26 import org.eclipse.jdt.annotation.NonNull;
27 import org.eclipse.jdt.annotation.Nullable;
28 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitor;
30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.ODLEventListenerHandler;
31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl;
32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
33 import org.opendaylight.mdsal.binding.api.MountPoint;
34 import org.opendaylight.mdsal.binding.api.MountPointService;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 public class ResyncNetworkElementHouskeepingService implements ResyncNetworkElementsListener {
48
49     private static final Logger LOG = LoggerFactory.getLogger(ResyncNetworkElementHouskeepingService.class);
50
51     private static final InstanceIdentifier<Topology> NETCONF_TOPO_IID =
52             InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
53                     new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName())));
54
55     // Services to use
56     private final MountPointService mountPointService;
57     private final ODLEventListenerHandler odlEventListenerHandler;
58     private final DataProvider databaseClientEvents;
59     private final DeviceMonitor deviceMonitor;
60     private final DeviceManagerImpl deviceManager;
61
62     /** Thread is started to du the clean up action **/
63     private Thread threadDoClearCurrentFaultByNodename;
64     /** Indicate number of refresh activities for log **/
65     private int refreshCounter = 0;
66
67     /**
68      * @param deviceManager to provide devices information
69      * @param mountPointService service
70      * @param odlEventListenerHandler handler for events
71      * @param databaseClientEvents database to clean
72      * @param deviceMonitor devicemonitor
73      */
74     public ResyncNetworkElementHouskeepingService(DeviceManagerImpl deviceManager, MountPointService mountPointService,
75             ODLEventListenerHandler odlEventListenerHandler, DataProvider databaseClientEvents,
76             DeviceMonitor deviceMonitor) {
77         super();
78         this.deviceManager = deviceManager;
79         this.mountPointService = mountPointService;
80         this.odlEventListenerHandler = odlEventListenerHandler;
81         this.databaseClientEvents = databaseClientEvents;
82         this.deviceMonitor = deviceMonitor;
83     }
84
85     /**
86      * Async RPC Interface implementation
87      */
88     @Override
89     public @NonNull List<String> doClearCurrentFaultByNodename(@Nullable List<String> nodeNames)
90             throws IllegalStateException {
91
92         if (this.databaseClientEvents == null) {
93             throw new IllegalStateException("dbEvents service not instantiated");
94         }
95
96         if (threadDoClearCurrentFaultByNodename != null && threadDoClearCurrentFaultByNodename.isAlive()) {
97             throw new IllegalStateException("A clear task is already active");
98         } else {
99             List<String> nodeNamesInput;
100
101             // Create list of mountpoints if input is empty, using the content in ES
102             if (nodeNames == null || nodeNames.size() <= 0) {
103                 nodeNamesInput = this.databaseClientEvents.getAllNodesWithCurrentAlarms();
104             } else {
105                 nodeNamesInput = nodeNames;
106             }
107
108             // Filter all mountpoints from input that were found and are known to this Cluster-node instance of
109             // DeviceManager
110             final List<String> nodeNamesHandled = new ArrayList<>();
111             for (String mountpointName : nodeNamesInput) {
112                 LOG.info("Work with mountpoint {}", mountpointName);
113
114                 if (odlEventListenerHandler != null && mountpointName.equals(odlEventListenerHandler.getOwnKeyName())) {
115
116                     // SDN Controller related alarms
117                     // -- can not be recreated on all nodes in connected state
118                     // -- would result in a DCAE/AAI Notification
119                     // Conclusion for 1810 Delivery ... not covered by RPC function (See issue #43)
120                     LOG.info("Ignore SDN Controller related alarms for {}", mountpointName);
121                     // this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName);
122                     // nodeNamesHandled.add(mountpointName);
123
124                 } else {
125
126                     if (mountPointService != null) {
127                         InstanceIdentifier<Node> instanceIdentifier =
128                                 NETCONF_TOPO_IID.child(Node.class, new NodeKey(new NodeId(mountpointName)));
129                         Optional<MountPoint> optionalMountPoint = mountPointService.getMountPoint(instanceIdentifier);
130
131                         if (!optionalMountPoint.isPresent()) {
132                             LOG.info("Remove Alarms for unknown mountpoint {}", mountpointName);
133                             this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName);
134                             nodeNamesHandled.add(mountpointName);
135                         } else {
136                             if (deviceManager.getConnectedNeByMountpoint(mountpointName) != null) {
137                                 LOG.info("At node known mountpoint {}", mountpointName);
138                                 nodeNamesHandled.add(mountpointName);
139                             } else {
140                                 LOG.info("At node unknown mountpoint {}", mountpointName);
141                             }
142                         }
143                     }
144                 }
145             }
146
147             // Force a sync
148             deviceMonitor.refreshAlarmsInDb();
149
150             threadDoClearCurrentFaultByNodename = new Thread(() -> {
151                 refreshCounter++;
152                 LOG.info("Start refresh mountpoint task {}", refreshCounter);
153                 // for(String nodeName:nodeNamesOutput) {
154                 for (String nodeName : nodeNamesHandled) {
155                     NetworkElement ne = deviceManager.getConnectedNeByMountpoint(nodeName);
156                     if (ne != null) {
157                         LOG.info("Refresh mountpoint {}", nodeName);
158                         ne.warmstart();
159                     } else {
160                         LOG.info("Unhandled mountpoint {}", nodeName);
161                     }
162                 }
163                 LOG.info("End refresh mountpoint task {}", refreshCounter);
164             });
165             threadDoClearCurrentFaultByNodename.start();
166             return nodeNamesHandled;
167         }
168     };
169
170 }