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
10 * http://www.apache.org/licenses/LICENSE-2.0
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
16 * ============LICENSE_END==========================================================================
17 ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.Date;
23 import java.util.List;
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;
55 * Event service, writing all events into the database into the appropriate
60 public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider {
61 private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
63 private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter();
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
74 public HtDatabaseEventsService(HtDatabaseClient client) throws Exception {
76 LOG.info("Create {} start", HtDatabaseEventsService.class);
79 // Create control structure
82 eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog,
83 EventlogEntity.class, EventlogBuilder.class);
85 eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment,
86 InventoryEntity.class, InventoryBuilder.class);
88 eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent,
89 FaultcurrentEntity.class, FaultcurrentBuilder.class);
91 eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog,
92 FaultlogEntity.class, FaultlogBuilder.class);
94 eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog,
95 ConnectionlogEntity.class, ConnectionlogBuilder.class);
97 networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection,
98 NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class)
99 .setEsIdAttributeName("_id");
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);
105 LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,
106 client != null ? "sucessfully" : "not");
113 public void writeConnectionLog(ConnectionlogEntity event) {
114 if (assertIfClientNull(event)) {
117 LOG.debug("Write event: {}", event);
118 eventRWConnectionLogDB.write(event, null);
123 public void writeEventLog(EventlogEntity event) {
124 if (assertIfClientNull("No client to write {}", event)) {
128 LOG.debug("Write event: {}", event.toString());
129 eventRWEventLogDevicemanager.write(event, null);
136 public void writeFaultLog(FaultlogEntity fault) {
137 if (assertIfClientNull(fault)) {
141 LOG.debug("Write fault to faultlog: {}", fault.toString());
142 eventRWFaultLogDB.write(fault,null);
148 public void updateFaultCurrent(FaultcurrentEntity fault) {
149 if (assertIfClientNull(fault)) {
153 if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
154 if (FaultEntityManager.isNoAlarmIndication(fault)) {
155 LOG.debug("Remove from currentFaults: {}", fault.toString());
156 eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault));
158 LOG.debug("Write to currentFaults: {}", fault.toString());
159 eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault));
162 LOG.debug("Ingnore for currentFaults: {}", fault.toString());
167 * Remove all entries for one node
169 * @param nodeName contains the mountpointname
170 * @return number of deleted entries
173 public int clearFaultsCurrentOfNode(String nodeName) {
174 if (assertIfClientNullForNodeName(nodeName)) {
178 LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
179 return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName));
183 * Remove all entries for one node
185 * @param nodeName contains the mountpointname
186 * @param objectId of element to be deleted
187 * @return number of deleted entries
190 public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
191 if (assertIfClientNullForNodeName(nodeName)) {
195 LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
196 return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
200 * Deliver list with all mountpoint/node-names in the database.
202 * @return List of all mountpoint/node-names the had active alarms.
205 public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
206 if (assertIfClientNull("No DB, can not delete for all nodes", null)) {
207 return new ArrayList<>();
210 LOG.debug("Remove from currentFaults faults for all node");
211 List<String> nodeNames = new ArrayList<>();
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);
223 // -- Inventory and equipment current
226 * write internal equipment to database
227 * @param internalEquipment with mandatory fields.
230 public void writeInventory(Inventory internalEquipment) {
232 if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
235 eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId()+"/"+internalEquipment.getUuid());
243 * @param networkElementConnectionEntitiy to wirte to DB
244 * @param nodeId Id for this DB element
247 public void updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
248 this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId);
252 * Update after new mountpoint registration
253 * @param networkElementConnectionEntitiy data
254 * @param nodeId of device (mountpoint name)
257 public void updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
258 this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, Arrays.asList("is-required", "username", "password"));
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());
269 public void removeNetworkConnection(String nodeId) {
271 NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
272 if (e != null && (isRequired = e.isIsRequired()) != null) {
274 LOG.debug("updating connection status for {} of required ne to disconnected",nodeId);
275 this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
277 LOG.debug("remove networkelement-connection for {} entry because of non-required",nodeId);
278 this.networkelementConnectionDB.remove(nodeId);
282 LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",nodeId);
289 public int doIndexClean(Date olderAreOutdated) {
291 String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
294 QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
295 removed += eventRWEventLogDevicemanager.remove(queryEventBase);
297 QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
298 removed += eventRWFaultLogDB.remove(queryFaultLog);
303 public int getNumberOfOldObjects(Date olderAreOutdated) {
305 String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
306 int numberOfElements = 0;
308 QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
309 numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal();
311 QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
312 numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal();
314 return numberOfElements;
320 * Verify status of client
321 * @param event that is printed with message
322 * @return true if client is null
324 private boolean assertIfClientNull(Object event) {
325 return assertIfClientNull("No DB, can not write: {}", event);
328 private boolean assertIfClientNullForNodeName(Object object) {
329 return assertIfClientNull("No DB, can not handle node: {}", object);
332 * Verify status of client
333 * @param message to print including {} for object printout.
334 * @return true if client is null
336 private boolean assertIfClientNull(String message, Object object) {
337 if (client == null) {
338 LOG.debug(message, object);
347 private static class EsEventBase {
349 * Query to get older Elements
350 * @param netconfTimeStamp to identify older Elements
351 * @return QueryBuilder for older elements related to timestamp
353 private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
354 return new RangeQueryBuilder("event.timeStamp").lte(netconfTimeStamp);
357 private static class EsFaultLogDevicemanager {
360 * @param netconfTimeStamp to identify query elements older than this timestamp.
361 * @return QueryBuilder for related elements
363 public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
364 return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
367 public static class EsFaultCurrent {
369 * @param nodeName name of the node
370 * @return query builder
372 public static QueryBuilder getQueryForOneNode( String nodeName) {
373 return QueryBuilders.matchQuery("node-id", nodeName);
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));
384 public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
385 return this.networkelementConnectionDB.doReadAll().getHits();