0a38e0f60f416d82ee0e3a1d2b42ac1a5efcebe9
[ccsdk/features.git] /
1 /*******************************************************************************
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service;
19
20 import java.util.ArrayList;
21 import java.util.Date;
22 import java.util.List;
23 import javax.annotation.Nonnull;
24 import org.elasticsearch.index.query.QueryBuilder;
25 import org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice.ArchiveCleanProvider;
26 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter;
27 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract;
28 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode;
29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder;
30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12Equipment;
31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp;
32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsEventBase;
33 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultCurrent;
34 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultLog;
35 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsEquipment;
36 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsToplevelEquipment;
37 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.ExtendedEquipment;
38 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.MwtNotificationBase;
39 import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 /**
44  * Event service, writing all events into the database into the appropriate index.
45  *
46  * @author herbert
47  */
48 public class HtDatabaseEventsService implements ArchiveCleanProvider {
49     private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
50
51     private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter();
52
53     ///** Filename in the resources with maven initialized version information  */
54     //private static final String RESOURCENAME = "version.properties"; // could also be a constant
55     ///** Index name to be used */
56     private static final String INDEX = "sdnevents";
57     private static final String MAPPING = "/elasticsearch/index/sdnevents/sdneventsMapping.json";
58
59     private HtDatabaseClientAbstract client;
60     private HtDataBaseReaderAndWriter<EsEventBase> eventRWEventLog;
61     private HtDataBaseReaderAndWriter<EsFaultCurrent> eventRWFaultCurrent;
62     private HtDataBaseReaderAndWriter<EsFaultLog> eventRWFaultLog;
63     private HtDataBaseReaderAndWriter<EsEquipment> eventRWEquipment;
64     private HtDataBaseReaderAndWriter<EsToplevelEquipment> eventRWToplevelEquipment;
65
66
67     // --- Construct and initialize
68
69     public HtDatabaseEventsService(HtDatabaseNode database) {
70
71         LOG.info("Create {} start", HtDatabaseEventsService.class);
72
73         try {
74             // Create control structure
75             IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setMappingSettingJsonFileName(MAPPING);
76             client = clientBuilder.create(database);
77             clientBuilder.close();
78
79             eventRWEventLog = new HtDataBaseReaderAndWriter<>(client, EsEventBase.ESDATATYPENAME, EsEventBase.class);
80             eventRWFaultLog = new HtDataBaseReaderAndWriter<>(client, EsFaultLog.ESDATATYPENAME, EsFaultLog.class);
81             eventRWFaultCurrent = new HtDataBaseReaderAndWriter<>(client, EsFaultCurrent.ESDATATYPENAME, EsFaultCurrent.class);
82             eventRWToplevelEquipment = new HtDataBaseReaderAndWriter<>(client, EsToplevelEquipment.ESDATATYPENAME, EsToplevelEquipment.class);
83             eventRWEquipment = new HtDataBaseReaderAndWriter<>(client, EsEquipment.ESDATATYPENAME, EsEquipment.class);
84
85
86         } catch (Exception e) {
87             LOG.error("Can not start database client. Exception: {}", e.getMessage());
88         }
89         LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,  client != null ? "sucessfully" : "not" );
90     }
91
92     // --- Function
93
94     public void writeEventLog(MwtNotificationBase event) {
95         if (client == null) {
96             LOG.debug("No DB, can not write: {}",event.toString());
97             return;
98         }
99
100         LOG.debug("Write event: {}",event.toString());
101         EsEventBase eventBase = new EsEventBase();
102         eventBase.setProblem(event);
103         eventRWEventLog.doWrite(eventBase);
104     }
105
106     public void writeFaultLog(ProblemNotificationXml fault) {
107         if (client == null) {
108             LOG.debug("No DB, can not write: {}",fault.toString());
109             return;
110         }
111
112         LOG.debug("Write fault to faultlog: {}",fault.toString());
113         EsFaultLog eventProblem = new EsFaultLog();
114         eventProblem.setProblem(fault);
115         eventRWFaultLog.doWrite(eventProblem);
116     }
117
118     public void updateFaultCurrent(ProblemNotificationXml fault) {
119         if (client == null) {
120             LOG.debug("No DB, can not write: {}",fault.toString());
121             return;
122         }
123
124         if (!fault.isNotManagedAsCurrentProblem()) {
125             EsFaultCurrent eventProblem = new EsFaultCurrent();
126             eventProblem.setProblem(fault);
127
128             if (eventProblem.isNoAlarmIndication()) {
129                 LOG.debug("Remove from currentFaults: {}",fault.toString());
130                 eventRWFaultCurrent.doRemove(eventProblem);
131             } else {
132                 LOG.debug("Write to currentFaults: {}",fault.toString());
133                 eventRWFaultCurrent.doWrite(eventProblem);
134             }
135         } else {
136             LOG.debug("Ingnore for currentFaults: {}",fault.toString());
137         }
138     }
139
140     /**
141      * Remove all entries for one node
142      * @param nodeName contains the mountpointname
143      * @return number of deleted entries
144      */
145     public int clearFaultsCurrentOfNode(String nodeName) {
146         if (client == null) {
147             LOG.debug("No DB, can not delete for node: {}", nodeName);
148             return -1;
149         }
150         LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
151         return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNode(nodeName));
152     }
153
154     /**
155      * Remove all entries for one node
156      * @param nodeName contains the mountpointname
157      * @param objectId of element to be deleted
158      * @return number of deleted entries
159      */
160     public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
161         if (client == null) {
162             LOG.debug("No DB, can not delete for node: {}", nodeName);
163             return -1;
164         }
165         LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
166         return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
167
168     }
169
170     /**
171      * Deliver list with all mountpoint/node-names in the database.
172      * @return List of all mountpoint/node-names the had active alarms.
173      */
174     public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
175         if (client == null) {
176             LOG.debug("No DB, can not delete for all nodes");
177             return new ArrayList<>();
178         }
179         LOG.debug("Remove from currentFaults faults for all node");
180         List<String> nodeNames = new ArrayList<>();
181
182         for (EsFaultCurrent fault : eventRWFaultCurrent.doReadAll()) {
183             String nodeName = fault.getProblem().getNodeName();
184             if (!nodeNames.contains(nodeName)) {
185                 //this.clearFaultsCurrentOfNode(nodeName); -> Function shifted
186                 nodeNames.add(nodeName);
187             }
188         }
189         return nodeNames;
190     }
191
192
193     /**
194      * Write inventory to DB
195      * @param equipment all equipment of network element
196      */
197     public void writeInventory(ONFCoreNetworkElement12Equipment equipment) {
198         if (client == null) {
199             LOG.debug("No DB, can not write for mountpoint: {}",equipment.getMountpoint());
200             return;
201         }
202
203         LOG.debug("Write inventory to database for mountpoint: {}",equipment.getMountpoint());
204
205         EsToplevelEquipment esToplevelEquipment = new EsToplevelEquipment();
206         esToplevelEquipment.set(equipment);
207         eventRWToplevelEquipment.doWrite(esToplevelEquipment);
208
209         List<ExtendedEquipment> equipmentList = equipment.getEquipmentList();
210         EsEquipment esEquipment;
211         for (ExtendedEquipment equipment1 : equipmentList) {
212             esEquipment = new EsEquipment();
213             esEquipment.set(equipment.getMountpoint(), equipment1);
214             eventRWEquipment.doWrite(esEquipment);
215         }
216     }
217
218     @Override
219     public int doIndexClean(Date olderAreOutdated) {
220
221         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
222         int removed = 0;
223
224         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
225         removed += eventRWEventLog.doRemoveByQuery(queryEventBase);
226
227         QueryBuilder queryFaultLog = EsFaultLog.getQueryForTimeStamp(netconfTimeStamp);
228         removed += eventRWFaultLog.doRemoveByQuery(queryFaultLog);
229         return removed;
230     }
231
232     @Override
233     public int getNumberOfOldObjects(Date olderAreOutdated) {
234
235         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
236         int numberOfElements = 0;
237
238         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
239         numberOfElements += eventRWEventLog.doReadAll(queryEventBase).size();
240
241         QueryBuilder queryFaultLog = EsFaultLog.getQueryForTimeStamp(netconfTimeStamp);
242         numberOfElements += eventRWFaultLog.doReadAll(queryFaultLog).size();
243
244         return numberOfElements;
245     }
246
247 }