2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
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=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Date;
27 import java.util.List;
28 import javax.annotation.Nonnull;
29 import org.eclipse.jdt.annotation.NonNull;
30 import org.eclipse.jdt.annotation.Nullable;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
33 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
34 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
35 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2;
38 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider;
39 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
40 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
41 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionLogStatus;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogEntity;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogEntity;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentEntity;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogEntity;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.GranularityPeriodType;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Inventory;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryEntity;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionEntity;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PmdataEntity;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PmdataEntityBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInputBuilder;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
66 * Event service, writing all events into the database into the appropriate index.
70 public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider {
71 private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
73 private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();
75 private HtDatabaseClient client;
76 private EsDataObjectReaderWriter2<EventlogEntity> eventRWEventLogDevicemanager;
77 private EsDataObjectReaderWriter2<InventoryEntity> eventRWEquipment;
78 private EsDataObjectReaderWriter2<FaultcurrentEntity> eventRWFaultCurrentDB;
79 private EsDataObjectReaderWriter2<FaultlogEntity> eventRWFaultLogDB;
80 private EsDataObjectReaderWriter2<ConnectionlogEntity> eventRWConnectionLogDB;
81 private final EsDataObjectReaderWriter2<NetworkElementConnectionEntity> networkelementConnectionDB;
82 private final EsDataObjectReaderWriter2<PmdataEntity> pmData15mDB;
83 private final EsDataObjectReaderWriter2<PmdataEntity> pmData24hDB;
84 private final EsDataObjectReaderWriter2<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntity> pmData15mDBv2;
85 private final EsDataObjectReaderWriter2<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntity> pmData24hDBv2;
87 @SuppressWarnings("unused")
88 private final ElasticSearchDataProvider dataProvider;
89 // --- Construct and initialize
92 public HtDatabaseEventsService(HtDatabaseClient client, ElasticSearchDataProvider elasticSearchDataProvider)
95 LOG.info("Create {} start", HtDatabaseEventsService.class);
96 this.dataProvider = elasticSearchDataProvider;
99 // Create control structure
100 this.client = client;
102 eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog,
103 EventlogEntity.class, EventlogBuilder.class);
105 eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment, InventoryEntity.class,
106 InventoryBuilder.class);
108 eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent,
109 FaultcurrentEntity.class, FaultcurrentBuilder.class);
111 eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog, FaultlogEntity.class,
112 FaultlogBuilder.class);
114 eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog,
115 ConnectionlogEntity.class, ConnectionlogBuilder.class);
117 networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection,
118 NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true)
119 .setEsIdAttributeName("_id");
121 pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min, PmdataEntity.class,
122 PmdataEntityBuilder.class);
124 pmData24hDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h, PmdataEntity.class,
125 PmdataEntityBuilder.class);
127 pmData15mDBv2 = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min,
128 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntity.class,
129 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntityBuilder.class);
131 pmData24hDBv2 = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h,
132 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntity.class,
133 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntityBuilder.class);
136 } catch (Exception e) {
137 LOG.error("Can not start database client. Exception: {}", e);
138 throw new Exception("Can not start database client. Exception: {}", e);
140 LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,
141 client != null ? "sucessfully" : "not");
148 public void writeConnectionLog(ConnectionlogEntity event) {
149 if (assertIfClientNull(event)) {
152 LOG.debug("Write event: {}", event);
153 eventRWConnectionLogDB.write(event, null);
159 public void writeEventLog(EventlogEntity event) {
160 if (assertIfClientNull("No client to write {}", event)) {
164 LOG.debug("Write event: {}", event.toString());
165 eventRWEventLogDevicemanager.write(event, null);
172 public void writeFaultLog(FaultlogEntity fault) {
173 if (assertIfClientNull(fault)) {
177 LOG.debug("Write fault to faultlog: {}", fault.toString());
178 eventRWFaultLogDB.write(fault, null);
184 public void updateFaultCurrent(FaultcurrentEntity fault) {
185 if (assertIfClientNull(fault)) {
189 if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
190 if (FaultEntityManager.isNoAlarmIndication(fault)) {
191 LOG.debug("Remove from currentFaults: {}", fault.toString());
192 eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault));
194 LOG.debug("Write to currentFaults: {}", fault.toString());
195 eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault));
198 LOG.debug("Ingnore for currentFaults: {}", fault.toString());
203 * Remove all entries for one node
205 * @param nodeName contains the mountpointname
206 * @return number of deleted entries
209 public int clearFaultsCurrentOfNode(String nodeName) {
210 if (assertIfClientNullForNodeName(nodeName)) {
214 LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
215 return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName));
219 * Remove all entries for one node
221 * @param nodeName contains the mountpointname
222 * @param objectId of element to be deleted
223 * @return number of deleted entries
226 public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
227 if (assertIfClientNullForNodeName(nodeName)) {
231 LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
232 return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
236 * Deliver list with all mountpoint/node-names in the database.
238 * @return List of all mountpoint/node-names the had active alarms.
241 public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
242 if (assertIfClientNull("No DB, can not delete for all nodes", null)) {
243 return new ArrayList<>();
246 LOG.debug("Remove from currentFaults faults for all node");
247 List<String> nodeNames = new ArrayList<>();
249 for (FaultcurrentEntity fault : eventRWFaultCurrentDB.doReadAll().getHits()) {
250 String nodeName = fault.getNodeId();
251 if (!nodeNames.contains(nodeName)) {
252 // this.clearFaultsCurrentOfNode(nodeName); -> Function shifted
253 nodeNames.add(nodeName);
259 // -- Inventory and equipment current
262 * write internal equipment to database
264 * @param internalEquipment with mandatory fields.
267 public void writeInventory(Inventory internalEquipment) {
269 if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
272 if (internalEquipment.getManufacturerIdentifier() == null) {
273 internalEquipment = new InventoryBuilder(internalEquipment).setManufacturerIdentifier("").build();
275 if (internalEquipment.getDate() == null) {
276 internalEquipment = new InventoryBuilder(internalEquipment).setDate("").build();
279 eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId() + "/" + internalEquipment.getUuid());
287 * join base with parameters of toJoin (only non null values)
289 * @param base base object
290 * @param toJoin object with new property values
291 * @return new joined object
293 @SuppressWarnings("unused")
294 private NetworkElementConnectionEntity joinNe(NetworkElementConnectionEntity base,
295 NetworkElementConnectionEntity toJoin) {
299 NetworkElementConnectionBuilder builder = new NetworkElementConnectionBuilder(base);
300 if (toJoin != null) {
301 if (toJoin.isIsRequired() != null) {
302 builder.setIsRequired(toJoin.isIsRequired());
304 if (toJoin.getCoreModelCapability() != null) {
305 builder.setCoreModelCapability(toJoin.getCoreModelCapability());
307 if (toJoin.getDeviceType() != null) {
308 builder.setDeviceType(toJoin.getDeviceType());
310 if (toJoin.getHost() != null) {
311 builder.setHost(toJoin.getHost());
313 if (toJoin.getNodeDetails() != null) {
314 builder.setNodeDetails(toJoin.getNodeDetails());
316 if (toJoin.getPassword() != null) {
317 builder.setPassword(toJoin.getPassword());
319 if (toJoin.getPort() != null) {
320 builder.setPort(toJoin.getPort());
322 if (toJoin.getStatus() != null) {
323 builder.setStatus(toJoin.getStatus());
325 if (toJoin.getUsername() != null) {
326 builder.setUsername(toJoin.getUsername());
329 return builder.build();
334 * @param networkElementConnectionEntitiy to wirte to DB
335 * @param nodeId Id for this DB element
338 public boolean updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy,
340 return this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId) != null;
341 // NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
342 // this.networkelementConnectionDB.write(this.joinNe(e, networkElementConnectionEntitiy), nodeId);
346 * Update after new mountpoint registration
348 * @param networkElementConnectionEntitiy data
349 * @param nodeId of device (mountpoint name)
352 public boolean updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy,
354 LOG.info("update networkelement-connection for {} with data {}", nodeId, networkElementConnectionEntitiy);
355 return this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId,
356 Arrays.asList("is-required", "username", "password")) != null;
357 // NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
358 // this.networkelementConnectionDB.write(this.joinNe(e, networkElementConnectionEntitiy), nodeId);
362 /* please do not remove */
363 // public void cleanNetworkElementConnections() {
364 // this.networkelementConnectionDB.remove(QueryBuilders.matchQuery("is-required", false));
365 // CreateNetworkElementConnectionInput x = new CreateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build();
366 // this.networkelementConnectionDB.update(x,QueryBuilders.matchAllQuery());
370 public void removeNetworkConnection(String nodeId) {
372 NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
373 if (e != null && (isRequired = e.isIsRequired()) != null) {
375 LOG.debug("updating connection status for {} of required ne to disconnected", nodeId);
376 this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder()
377 .setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
379 LOG.debug("remove networkelement-connection for {} entry because of non-required", nodeId);
380 this.networkelementConnectionDB.remove(nodeId);
383 LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",
391 public int doIndexClean(Date olderAreOutdated) {
393 String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
396 QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
397 removed += eventRWEventLogDevicemanager.remove(queryEventBase);
399 QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
400 removed += eventRWFaultLogDB.remove(queryFaultLog);
405 public int getNumberOfOldObjects(Date olderAreOutdated) {
407 String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
408 int numberOfElements = 0;
410 QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
411 numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal();
413 QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
414 numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal();
416 return numberOfElements;
422 * Verify status of client
424 * @param event that is printed with message
425 * @return true if client is null
427 private boolean assertIfClientNull(Object event) {
428 return assertIfClientNull("No DB, can not write: {}", event);
431 private boolean assertIfClientNullForNodeName(Object object) {
432 return assertIfClientNull("No DB, can not handle node: {}", object);
436 * Verify status of client
438 * @param message to print including {} for object printout.
439 * @return true if client is null
441 private boolean assertIfClientNull(String message, Object object) {
442 if (client == null) {
443 LOG.debug(message, object);
452 private static class EsEventBase {
454 * Query to get older Elements
456 * @param netconfTimeStamp to identify older Elements
457 * @return QueryBuilder for older elements related to timestamp
459 private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
460 return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
463 private static class EsFaultLogDevicemanager {
467 * @param netconfTimeStamp to identify query elements older than this timestamp.
468 * @return QueryBuilder for related elements
470 public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
471 return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
474 public static class EsFaultCurrent {
476 * @param nodeName name of the node
477 * @return query builder
479 public static QueryBuilder getQueryForOneNode(String nodeName) {
480 return QueryBuilders.matchQuery("node-id", nodeName);
483 public static QueryBuilder getQueryForOneNodeAndObjectId(String nodeName, String objectId) {
484 BoolQueryBuilder bq = QueryBuilders.boolQuery();
485 bq.must(QueryBuilders.matchQuery("node-id", nodeName));
486 bq.must(QueryBuilders.matchQuery("object-id", objectId));
492 public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
493 return this.networkelementConnectionDB.doReadAll().getHits();
497 public void doWritePerformanceData(List<PmdataEntity> list) {
499 list.forEach(elem -> {
500 GranularityPeriodType granularityPeriod = nnGetGranularityPeriodType(elem.getGranularityPeriod());
501 //_id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00"
502 StringBuffer id = new StringBuffer();
503 DateAndTime date = elem.getTimeStamp();
504 id.append(elem.getNodeName());
506 id.append(elem.getUuidInterface());
508 id.append(date != null ? date.getValue() : "null");
510 switch (granularityPeriod) {
512 pmData15mDB.write(elem, id.toString());
515 pmData24hDB.write(elem, id.toString());
519 LOG.debug("Unknown granularity {} id {}", granularityPeriod, id);
526 public void doWritePerformanceData2(
527 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.PmdataEntity> list) {
529 list.forEach(elem -> {
530 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.GranularityPeriodType
531 granularityPeriod = nnGetGranularityPeriodType2(elem.getGranularityPeriod());
532 //_id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00"
533 StringBuffer id = new StringBuffer();
534 DateAndTime date = elem.getTimeStamp();
535 id.append(elem.getNodeName());
537 id.append(elem.getUuidInterface());
539 id.append(date != null ? date.getValue() : "null");
541 switch (granularityPeriod) {
543 pmData15mDB.write(elem, id.toString());
546 pmData24hDB.write(elem, id.toString());
550 LOG.debug("Unknown granularity {} id {}", granularityPeriod, id);
556 GranularityPeriodType nnGetGranularityPeriodType(@Nullable GranularityPeriodType granularityPeriod) {
557 return granularityPeriod != null ? granularityPeriod : GranularityPeriodType.Unknown;
559 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.GranularityPeriodType nnGetGranularityPeriodType2(
560 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.@Nullable GranularityPeriodType granularityPeriod) {
561 return granularityPeriod != null ? granularityPeriod :
562 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.v2.rev200702.GranularityPeriodType.Unknown;
566 public HtDatabaseClient getRawClient() {