63d92b64dff12e3297cebb80e2ca164b9217ba42
[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.dataprovider.data;
19
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.Date;
23 import java.util.List;
24
25 import javax.annotation.Nonnull;
26 import org.eclipse.jdt.annotation.NonNull;
27 import org.eclipse.jdt.annotation.Nullable;
28 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
29 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2;
34 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionLogStatus;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogEntity;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogEntity;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentEntity;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogEntity;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.GranularityPeriodType;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Inventory;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryEntity;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionEntity;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PmdataEntity;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PmdataEntityBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInputBuilder;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61 /**
62  * Event service, writing all events into the database into the appropriate
63  * index.
64  *
65  * @author herbert
66  */
67 public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider {
68     private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
69
70     private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();
71
72     private HtDatabaseClient client;
73     private EsDataObjectReaderWriter2<EventlogEntity> eventRWEventLogDevicemanager;
74     private EsDataObjectReaderWriter2<InventoryEntity> eventRWEquipment;
75     private EsDataObjectReaderWriter2<FaultcurrentEntity> eventRWFaultCurrentDB;
76     private EsDataObjectReaderWriter2<FaultlogEntity> eventRWFaultLogDB;
77     private EsDataObjectReaderWriter2<ConnectionlogEntity> eventRWConnectionLogDB;
78     private final EsDataObjectReaderWriter2<NetworkElementConnectionEntity> networkelementConnectionDB;
79     private final EsDataObjectReaderWriter2<PmdataEntity> pmData15mDB;
80     private final EsDataObjectReaderWriter2<PmdataEntity> pmData24hDB;
81
82     @SuppressWarnings("unused")
83     private final ElasticSearchDataProvider dataProvider;
84     // --- Construct and initialize
85
86
87     public HtDatabaseEventsService(HtDatabaseClient client, ElasticSearchDataProvider elasticSearchDataProvider) throws Exception {
88
89         LOG.info("Create {} start", HtDatabaseEventsService.class);
90         this.dataProvider = elasticSearchDataProvider;
91
92         try {
93             // Create control structure
94             this.client = client;
95
96             eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog,
97                     EventlogEntity.class, EventlogBuilder.class);
98
99             eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment,
100                     InventoryEntity.class, InventoryBuilder.class);
101
102             eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent,
103                     FaultcurrentEntity.class, FaultcurrentBuilder.class);
104
105             eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog,
106                     FaultlogEntity.class, FaultlogBuilder.class);
107
108             eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog,
109                     ConnectionlogEntity.class, ConnectionlogBuilder.class);
110
111             networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection,
112                     NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class)
113                     .setEsIdAttributeName("_id");
114
115             pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min,
116                     PmdataEntity.class, PmdataEntityBuilder.class);
117
118             pmData24hDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h,
119                     PmdataEntity.class, PmdataEntityBuilder.class);
120
121         } catch (Exception e) {
122             LOG.error("Can not start database client. Exception: {}", e);
123             throw new Exception("Can not start database client. Exception: {}", e);
124         }
125         LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,
126                 client != null ? "sucessfully" : "not");
127     }
128
129     // --- Function
130
131     // -- Connection log
132     @Override
133     public void writeConnectionLog(ConnectionlogEntity event) {
134         if (assertIfClientNull(event)) {
135             return;
136         }
137         LOG.debug("Write event: {}", event);
138         eventRWConnectionLogDB.write(event, null);
139
140     }
141     // -- Event log
142     @Override
143     public void writeEventLog(EventlogEntity event) {
144         if (assertIfClientNull("No client to write {}", event)) {
145             return;
146         }
147
148         LOG.debug("Write event: {}", event.toString());
149         eventRWEventLogDevicemanager.write(event, null);
150     }
151
152
153     // -- Fault log
154
155     @Override
156     public void writeFaultLog(FaultlogEntity fault) {
157         if (assertIfClientNull(fault)) {
158             return;
159         }
160
161         LOG.debug("Write fault to faultlog: {}", fault.toString());
162         eventRWFaultLogDB.write(fault,null);
163     }
164
165     // -- Fault current
166
167     @Override
168     public void updateFaultCurrent(FaultcurrentEntity fault) {
169         if (assertIfClientNull(fault)) {
170             return;
171         }
172
173         if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
174             if (FaultEntityManager.isNoAlarmIndication(fault)) {
175                 LOG.debug("Remove from currentFaults: {}", fault.toString());
176                 eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault));
177             } else {
178                 LOG.debug("Write to currentFaults: {}", fault.toString());
179                 eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault));
180             }
181         } else {
182             LOG.debug("Ingnore for currentFaults: {}", fault.toString());
183         }
184     }
185
186     /**
187      * Remove all entries for one node
188      *
189      * @param nodeName contains the mountpointname
190      * @return number of deleted entries
191      */
192     @Override
193     public int clearFaultsCurrentOfNode(String nodeName) {
194         if (assertIfClientNullForNodeName(nodeName)) {
195             return -1;
196         }
197
198         LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
199         return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName));
200     }
201
202     /**
203      * Remove all entries for one node
204      *
205      * @param nodeName contains the mountpointname
206      * @param objectId of element to be deleted
207      * @return number of deleted entries
208      */
209     @Override
210     public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
211         if (assertIfClientNullForNodeName(nodeName)) {
212             return -1;
213         }
214
215         LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
216         return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
217     }
218
219     /**
220      * Deliver list with all mountpoint/node-names in the database.
221      *
222      * @return List of all mountpoint/node-names the had active alarms.
223      */
224     @Override
225     public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
226         if (assertIfClientNull("No DB, can not delete for all nodes", null)) {
227             return new ArrayList<>();
228         }
229
230         LOG.debug("Remove from currentFaults faults for all node");
231         List<String> nodeNames = new ArrayList<>();
232
233         for (FaultcurrentEntity fault : eventRWFaultCurrentDB.doReadAll().getHits()) {
234             String nodeName = fault.getNodeId();
235             if (!nodeNames.contains(nodeName)) {
236                 // this.clearFaultsCurrentOfNode(nodeName); -> Function shifted
237                 nodeNames.add(nodeName);
238             }
239         }
240         return nodeNames;
241     }
242
243     // -- Inventory and equipment current
244
245     /**
246      * write internal equipment to database
247      * @param internalEquipment with mandatory fields.
248      */
249     @Override
250     public void writeInventory(Inventory internalEquipment) {
251
252         if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
253             return;
254         }
255         eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId()+"/"+internalEquipment.getUuid());
256     }
257
258
259     // -- Networkelement
260
261     /**
262      *
263      * @param networkElementConnectionEntitiy to wirte to DB
264      * @param nodeId Id for this DB element
265      */
266     @Override
267     public void updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
268         this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId);
269     }
270
271     /**
272      * Update after new mountpoint registration
273      * @param networkElementConnectionEntitiy data
274      * @param nodeId of device (mountpoint name)
275      */
276     @Override
277     public void updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
278         this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, Arrays.asList("is-required", "username", "password"));
279     }
280
281     /* please do not remove */
282     //    public void cleanNetworkElementConnections() {
283     //        this.networkelementConnectionDB.remove(QueryBuilders.matchQuery("is-required", false));
284     //        CreateNetworkElementConnectionInput x = new CreateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build();
285     //        this.networkelementConnectionDB.update(x,QueryBuilders.matchAllQuery());
286     //    }
287
288     @Override
289     public void removeNetworkConnection(String nodeId) {
290         Boolean isRequired;
291         NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
292         if (e != null && (isRequired = e.isIsRequired()) != null) {
293             if (isRequired) {
294                 LOG.debug("updating connection status for {} of required ne to disconnected",nodeId);
295                 this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
296             } else {
297                 LOG.debug("remove networkelement-connection for {} entry because of non-required",nodeId);
298                 this.networkelementConnectionDB.remove(nodeId);
299             }
300         }
301         else {
302             LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",nodeId);
303         }
304     }
305
306     // -- Multiple areas
307
308     @Override
309     public int doIndexClean(Date olderAreOutdated) {
310
311         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
312         int removed = 0;
313
314         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
315         removed += eventRWEventLogDevicemanager.remove(queryEventBase);
316
317         QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
318         removed += eventRWFaultLogDB.remove(queryFaultLog);
319         return removed;
320     }
321
322     @Override
323     public int getNumberOfOldObjects(Date olderAreOutdated) {
324
325         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
326         int numberOfElements = 0;
327
328         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
329         numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal();
330
331         QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
332         numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal();
333
334         return numberOfElements;
335     }
336
337     // -- Helper
338
339     /**
340      * Verify status of client
341      * @param event that is printed with message
342      * @return true if client is null
343      */
344     private boolean assertIfClientNull(Object event) {
345         return assertIfClientNull("No DB, can not write: {}", event);
346     }
347
348     private boolean assertIfClientNullForNodeName(Object object) {
349         return assertIfClientNull("No DB, can not handle node: {}", object);
350     }
351     /**
352      * Verify status of client
353      * @param message to print including {} for object printout.
354      * @return true if client is null
355      */
356     private boolean assertIfClientNull(String message, Object object) {
357         if (client == null) {
358             LOG.debug(message, object);
359             return true;
360         }
361         return false;
362     }
363
364     // ### sub classes
365
366
367     private static class EsEventBase {
368         /**
369          * Query to get older Elements
370          * @param netconfTimeStamp to identify older Elements
371          * @return QueryBuilder for older elements related to timestamp
372          */
373         private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
374             return new RangeQueryBuilder("event.timeStamp").lte(netconfTimeStamp);
375         }
376     }
377     private static class EsFaultLogDevicemanager {
378         /**
379          * Get older Elements
380          * @param netconfTimeStamp to identify query elements older than this timestamp.
381          * @return QueryBuilder for related elements
382          */
383         public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
384             return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
385         }
386      }
387     public static class EsFaultCurrent  {
388         /**
389          * @param nodeName name of the node
390          * @return query builder
391          */
392         public static QueryBuilder getQueryForOneNode( String nodeName) {
393             return QueryBuilders.matchQuery("node-id", nodeName);
394         }
395
396         public static QueryBuilder getQueryForOneNodeAndObjectId( String nodeName, String objectId) {
397             BoolQueryBuilder bq = QueryBuilders.boolQuery();
398             bq.must(QueryBuilders.matchQuery("node-id", nodeName));
399             bq.must(QueryBuilders.matchQuery("object-id", objectId));
400             return bq;
401         }
402     }
403     @Override
404     public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
405         return this.networkelementConnectionDB.doReadAll().getHits();
406     }
407
408     @Override
409     public void doWritePerformanceData(List<PmdataEntity> list) {
410
411         list.forEach(elem -> {
412             GranularityPeriodType granularityPeriod = nnGetGranularityPeriodType(elem.getGranularityPeriod());
413             //_id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00"
414             StringBuffer id = new StringBuffer();
415             DateAndTime date = elem.getTimeStamp();
416             id.append(elem.getNodeName());
417             id.append("/");
418             id.append(elem.getUuidInterface());
419             id.append("/");
420             id.append(date != null ? date.getValue() : "null");
421
422             switch (granularityPeriod) {
423             case Period15Min:
424                 pmData15mDB.write(elem, id.toString());
425                 break;
426             case Period24Hours:
427                 pmData24hDB.write(elem, id.toString());
428                 break;
429             case Unknown:
430             default:
431                 LOG.debug("Unknown granularity {} id {}", granularityPeriod, id);
432                 break;
433             }
434         } );
435
436     }
437
438     @NonNull GranularityPeriodType nnGetGranularityPeriodType(@Nullable GranularityPeriodType granularityPeriod) {
439         return granularityPeriod != null ? granularityPeriod : GranularityPeriodType.Unknown;
440     }
441
442 }