2  * ============LICENSE_START=======================================================
 
   3  * ONAP : ccsdk feature sdnr wt
 
   4  *  ================================================================================
 
   5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
 
   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
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping;
 
  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;
 
  47 public class ResyncNetworkElementHouskeepingService implements ResyncNetworkElementsListener {
 
  49     private static final Logger LOG = LoggerFactory.getLogger(ResyncNetworkElementHouskeepingService.class);
 
  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())));
 
  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;
 
  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;
 
  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
 
  74     public ResyncNetworkElementHouskeepingService(DeviceManagerImpl deviceManager, MountPointService mountPointService,
 
  75             ODLEventListenerHandler odlEventListenerHandler, DataProvider databaseClientEvents,
 
  76             DeviceMonitor deviceMonitor) {
 
  78         this.deviceManager = deviceManager;
 
  79         this.mountPointService = mountPointService;
 
  80         this.odlEventListenerHandler = odlEventListenerHandler;
 
  81         this.databaseClientEvents = databaseClientEvents;
 
  82         this.deviceMonitor = deviceMonitor;
 
  86      * Async RPC Interface implementation
 
  89     public @NonNull List<String> doClearCurrentFaultByNodename(@Nullable List<String> nodeNames)
 
  90             throws IllegalStateException {
 
  92         if (this.databaseClientEvents == null) {
 
  93             throw new IllegalStateException("dbEvents service not instantiated");
 
  96         if (threadDoClearCurrentFaultByNodename != null && threadDoClearCurrentFaultByNodename.isAlive()) {
 
  97             throw new IllegalStateException("A clear task is already active");
 
  99             List<String> nodeNamesInput;
 
 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();
 
 105                 nodeNamesInput = nodeNames;
 
 108             // Filter all mountpoints from input that were found and are known to this Cluster-node instance of
 
 110             final List<String> nodeNamesHandled = new ArrayList<>();
 
 111             for (String mountpointName : nodeNamesInput) {
 
 112                 LOG.info("Work with mountpoint {}", mountpointName);
 
 114                 if (odlEventListenerHandler != null && mountpointName.equals(odlEventListenerHandler.getOwnKeyName())) {
 
 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);
 
 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);
 
 131                         if (!optionalMountPoint.isPresent()) {
 
 132                             LOG.info("Remove Alarms for unknown mountpoint {}", mountpointName);
 
 133                             this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName);
 
 134                             nodeNamesHandled.add(mountpointName);
 
 136                             if (deviceManager.getNeByMountpoint(mountpointName) != null) {
 
 137                                 LOG.info("At node known mountpoint {}", mountpointName);
 
 138                                 nodeNamesHandled.add(mountpointName);
 
 140                                 LOG.info("At node unknown mountpoint {}", mountpointName);
 
 148             deviceMonitor.refreshAlarmsInDb();
 
 150             threadDoClearCurrentFaultByNodename = new Thread(() -> {
 
 152                 LOG.info("Start refresh mountpoint task {}", refreshCounter);
 
 153                 // for(String nodeName:nodeNamesOutput) {
 
 154                 for (String nodeName : nodeNamesHandled) {
 
 155                     NetworkElement ne = deviceManager.getNeByMountpoint(nodeName);
 
 157                         LOG.info("Refresh mountpoint {}", nodeName);
 
 160                         LOG.info("Unhandled mountpoint {}", nodeName);
 
 163                 LOG.info("End refresh mountpoint task {}", refreshCounter);
 
 165             threadDoClearCurrentFaultByNodename.start();
 
 166             return nodeNamesHandled;