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