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.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;
 
  62  * Event service, writing all events into the database into the appropriate
 
  67 public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider {
 
  68     private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
 
  70     private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();
 
  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;
 
  82     @SuppressWarnings("unused")
 
  83     private final ElasticSearchDataProvider dataProvider;
 
  84     // --- Construct and initialize
 
  87     public HtDatabaseEventsService(HtDatabaseClient client, ElasticSearchDataProvider elasticSearchDataProvider) throws Exception {
 
  89         LOG.info("Create {} start", HtDatabaseEventsService.class);
 
  90         this.dataProvider = elasticSearchDataProvider;
 
  93             // Create control structure
 
  96             eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog,
 
  97                     EventlogEntity.class, EventlogBuilder.class);
 
  99             eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment,
 
 100                     InventoryEntity.class, InventoryBuilder.class);
 
 102             eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent,
 
 103                     FaultcurrentEntity.class, FaultcurrentBuilder.class);
 
 105             eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog,
 
 106                     FaultlogEntity.class, FaultlogBuilder.class);
 
 108             eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog,
 
 109                     ConnectionlogEntity.class, ConnectionlogBuilder.class);
 
 111             networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection,
 
 112                     NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class)
 
 113                     .setEsIdAttributeName("_id");
 
 115             pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min,
 
 116                     PmdataEntity.class, PmdataEntityBuilder.class);
 
 118             pmData24hDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h,
 
 119                     PmdataEntity.class, PmdataEntityBuilder.class);
 
 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);
 
 125         LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,
 
 126                 client != null ? "sucessfully" : "not");
 
 133     public void writeConnectionLog(ConnectionlogEntity event) {
 
 134         if (assertIfClientNull(event)) {
 
 137         LOG.debug("Write event: {}", event);
 
 138         eventRWConnectionLogDB.write(event, null);
 
 143     public void writeEventLog(EventlogEntity event) {
 
 144         if (assertIfClientNull("No client to write {}", event)) {
 
 148         LOG.debug("Write event: {}", event.toString());
 
 149         eventRWEventLogDevicemanager.write(event, null);
 
 156     public void writeFaultLog(FaultlogEntity fault) {
 
 157         if (assertIfClientNull(fault)) {
 
 161         LOG.debug("Write fault to faultlog: {}", fault.toString());
 
 162         eventRWFaultLogDB.write(fault,null);
 
 168     public void updateFaultCurrent(FaultcurrentEntity fault) {
 
 169         if (assertIfClientNull(fault)) {
 
 173         if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
 
 174             if (FaultEntityManager.isNoAlarmIndication(fault)) {
 
 175                 LOG.debug("Remove from currentFaults: {}", fault.toString());
 
 176                 eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault));
 
 178                 LOG.debug("Write to currentFaults: {}", fault.toString());
 
 179                 eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault));
 
 182             LOG.debug("Ingnore for currentFaults: {}", fault.toString());
 
 187      * Remove all entries for one node
 
 189      * @param nodeName contains the mountpointname
 
 190      * @return number of deleted entries
 
 193     public int clearFaultsCurrentOfNode(String nodeName) {
 
 194         if (assertIfClientNullForNodeName(nodeName)) {
 
 198         LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
 
 199         return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName));
 
 203      * Remove all entries for one node
 
 205      * @param nodeName contains the mountpointname
 
 206      * @param objectId of element to be deleted
 
 207      * @return number of deleted entries
 
 210     public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
 
 211         if (assertIfClientNullForNodeName(nodeName)) {
 
 215         LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
 
 216         return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
 
 220      * Deliver list with all mountpoint/node-names in the database.
 
 222      * @return List of all mountpoint/node-names the had active alarms.
 
 225     public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
 
 226         if (assertIfClientNull("No DB, can not delete for all nodes", null)) {
 
 227             return new ArrayList<>();
 
 230         LOG.debug("Remove from currentFaults faults for all node");
 
 231         List<String> nodeNames = new ArrayList<>();
 
 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);
 
 243     // -- Inventory and equipment current
 
 246      * write internal equipment to database
 
 247      * @param internalEquipment with mandatory fields.
 
 250     public void writeInventory(Inventory internalEquipment) {
 
 252         if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
 
 255         eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId()+"/"+internalEquipment.getUuid());
 
 263      * @param networkElementConnectionEntitiy to wirte to DB
 
 264      * @param nodeId Id for this DB element
 
 267     public void updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
 
 268         this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId);
 
 272      * Update after new mountpoint registration
 
 273      * @param networkElementConnectionEntitiy data
 
 274      * @param nodeId of device (mountpoint name)
 
 277     public void updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
 
 278         this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, Arrays.asList("is-required", "username", "password"));
 
 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());
 
 289     public void removeNetworkConnection(String nodeId) {
 
 291         NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
 
 292         if (e != null && (isRequired = e.isIsRequired()) != null) {
 
 294                 LOG.debug("updating connection status for {} of required ne to disconnected",nodeId);
 
 295                 this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
 
 297                 LOG.debug("remove networkelement-connection for {} entry because of non-required",nodeId);
 
 298                 this.networkelementConnectionDB.remove(nodeId);
 
 302             LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",nodeId);
 
 309     public int doIndexClean(Date olderAreOutdated) {
 
 311         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
 
 314         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
 
 315         removed += eventRWEventLogDevicemanager.remove(queryEventBase);
 
 317         QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
 
 318         removed += eventRWFaultLogDB.remove(queryFaultLog);
 
 323     public int getNumberOfOldObjects(Date olderAreOutdated) {
 
 325         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
 
 326         int numberOfElements = 0;
 
 328         QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
 
 329         numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal();
 
 331         QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
 
 332         numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal();
 
 334         return numberOfElements;
 
 340      * Verify status of client
 
 341      * @param event that is printed with message
 
 342      * @return true if client is null
 
 344     private boolean assertIfClientNull(Object event) {
 
 345         return assertIfClientNull("No DB, can not write: {}", event);
 
 348     private boolean assertIfClientNullForNodeName(Object object) {
 
 349         return assertIfClientNull("No DB, can not handle node: {}", object);
 
 352      * Verify status of client
 
 353      * @param message to print including {} for object printout.
 
 354      * @return true if client is null
 
 356     private boolean assertIfClientNull(String message, Object object) {
 
 357         if (client == null) {
 
 358             LOG.debug(message, object);
 
 367     private static class EsEventBase {
 
 369          * Query to get older Elements
 
 370          * @param netconfTimeStamp to identify older Elements
 
 371          * @return QueryBuilder for older elements related to timestamp
 
 373         private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
 
 374             return new RangeQueryBuilder("event.timeStamp").lte(netconfTimeStamp);
 
 377     private static class EsFaultLogDevicemanager {
 
 380          * @param netconfTimeStamp to identify query elements older than this timestamp.
 
 381          * @return QueryBuilder for related elements
 
 383         public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
 
 384             return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
 
 387     public static class EsFaultCurrent  {
 
 389          * @param nodeName name of the node
 
 390          * @return query builder
 
 392         public static QueryBuilder getQueryForOneNode( String nodeName) {
 
 393             return QueryBuilders.matchQuery("node-id", nodeName);
 
 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));
 
 404     public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
 
 405         return this.networkelementConnectionDB.doReadAll().getHits();
 
 409     public void doWritePerformanceData(List<PmdataEntity> list) {
 
 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());
 
 418             id.append(elem.getUuidInterface());
 
 420             id.append(date != null ? date.getValue() : "null");
 
 422             switch (granularityPeriod) {
 
 424                 pmData15mDB.write(elem, id.toString());
 
 427                 pmData24hDB.write(elem, id.toString());
 
 431                 LOG.debug("Unknown granularity {} id {}", granularityPeriod, id);
 
 438     @NonNull GranularityPeriodType nnGetGranularityPeriodType(@Nullable GranularityPeriodType granularityPeriod) {
 
 439         return granularityPeriod != null ? granularityPeriod : GranularityPeriodType.Unknown;