From 016536791b95df23811dabd063010f0561526163 Mon Sep 17 00:00:00 2001 From: Ravi Pendurty Date: Mon, 26 Jul 2021 12:42:00 +0530 Subject: Support for MariaDB Support for MariaDB Issue-ID: CCSDK-3384 Signed-off-by: Ravi Pendurty Change-Id: Ic93ad33257a091f2cd208cdf02d1d7400c256bf0 Signed-off-by: Ravi Pendurty --- .../data/ElasticSearchDataProvider.java | 455 --------------- .../dataprovider/data/HtUserdataManagerImpl.java | 150 ----- .../data/MediatorServerDataProvider.java | 103 ---- .../data/acessor/DataObjectAcessor.java | 60 -- .../data/acessor/DataObjectAcessorPm.java | 132 ----- .../data/acessor/DataObjectAcessorStatus.java | 76 --- .../data/acessor/DataObjectAcessorWithId.java | 41 -- .../data/entity/FaultEntityManager.java | 98 ---- .../data/entity/HtDatabaseEventsService.java | 628 -------------------- .../data/entity/HtDatabaseMaintenanceService.java | 176 ------ .../data/rpctypehelper/QueryByFilter.java | 433 -------------- .../data/rpctypehelper/QueryByFilterStatic.java | 337 ----------- .../data/rpctypehelper/QueryResult.java | 71 --- .../database/EsDataObjectReaderWriter2.java | 405 ------------- .../database/elasticsearch/EsConfig.java | 224 ++++++++ .../elasticsearch/EsDataObjectReaderWriter2.java | 413 +++++++++++++ .../data/acessor/DataObjectAcessor.java | 60 ++ .../data/acessor/DataObjectAcessorPm.java | 131 +++++ .../data/acessor/DataObjectAcessorStatus.java | 103 ++++ .../data/acessor/DataObjectAcessorWithId.java | 40 ++ .../data/entity/FaultEntityManager.java | 98 ++++ .../data/entity/HtDatabaseEventsService.java | 638 +++++++++++++++++++++ .../data/entity/HtDatabaseMaintenanceService.java | 176 ++++++ .../data/rpctypehelper/QueryByFilter.java | 436 ++++++++++++++ .../data/rpctypehelper/QueryByFilterStatic.java | 337 +++++++++++ .../data/rpctypehelper/QueryResult.java | 71 +++ .../impl/ElasticSearchDataProvider.java | 520 +++++++++++++++++ .../elasticsearch/impl/HtUserdataManagerImpl.java | 150 +++++ .../wt/dataprovider/http/DataTreeChildObject.java | 13 +- .../sdnr/wt/dataprovider/http/MsServlet.java | 15 +- .../wt/dataprovider/http/ReadyHttpServlet.java | 140 ----- .../dataprovider/http/about/AboutHttpServlet.java | 120 ++-- .../wt/dataprovider/http/about/MarkdownTable.java | 22 +- .../wt/dataprovider/http/about/ODLVersionLUT.java | 7 + .../http/yangschema/YangFileProvider.java | 25 +- .../wt/dataprovider/impl/DataProviderConfig.java | 74 +++ .../wt/dataprovider/impl/DataProviderImpl.java | 13 +- .../dataprovider/impl/DataProviderServiceImpl.java | 58 +- .../wt/dataprovider/impl/DataTreeProviderImpl.java | 34 +- .../sdnr/wt/dataprovider/impl/EsConfig.java | 215 ------- .../impl/MediatorServerDataProvider.java | 92 +++ .../provider/src/main/resources/about/README.json | 16 + .../org/opendaylight/blueprint/impl-blueprint.xml | 18 +- .../sdnr/wt/dataprovider/test/TestAbout.java | 2 +- .../wt/dataprovider/test/TestCRUDforDatabase.java | 7 +- .../sdnr/wt/dataprovider/test/TestConfig.java | 2 +- .../wt/dataprovider/test/TestConfiguration.java | 2 +- .../wt/dataprovider/test/TestEventService.java | 21 +- .../wt/dataprovider/test/TestFilterConversion.java | 4 +- .../wt/dataprovider/test/TestImplementation.java | 1 - .../test/TestInventoryConsistency.java | 9 +- .../test/TestMaintenanceServiceData.java | 5 +- .../test/TestMediatorServerService.java | 9 +- .../wt/dataprovider/test/TestTimestampFilter.java | 2 +- .../sdnr/wt/dataprovider/test/TestTree.java | 5 +- .../sdnr/wt/dataprovider/test/TestUserdata.java | 2 +- .../dataprovider/test/TestYangGenSalMapping.java | 2 +- .../wt/dataprovider/test/util/MariaDBTestBase.java | 169 ++++++ .../provider/src/test/resources/tlskeys/keys1.json | 40 ++ 59 files changed, 4005 insertions(+), 3701 deletions(-) delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java create mode 100644 sdnr/wt/data-provider/provider/src/main/resources/about/README.json create mode 100644 sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java create mode 100644 sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json (limited to 'sdnr/wt/data-provider/provider/src') diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java deleted file mode 100644 index 0a966aef6..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java +++ /dev/null @@ -1,455 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorPm; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorPm.Intervall; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorStatus; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorWithId; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity.HtDatabaseEventsService; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity.HtDatabaseMaintenanceService; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionOutputBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ElasticSearchDataProvider { - - private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchDataProvider.class); - - private static final String EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE = "unable to write data to database"; - private static final String EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE = "unable to update data in database"; - private static final String EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE = "unable to remove data from database"; - - private final HtDatabaseClient dbClient; - private final DataObjectAcessorWithId eventRWFaultCurrent; - private final DataObjectAcessorWithId eventRWFaultLog; - private final DataObjectAcessorWithId mediatorserverRW; - private final DataObjectAcessorWithId maintenanceRW; - private final DataObjectAcessorWithId guicutthroughRW; - private final DataObjectAcessorWithId equipmentRW; - private final DataObjectAcessorWithId connnectionlogRW; - private final DataObjectAcessorWithId eventlogRW; - private final DataObjectAcessorWithId networkelementConnectionRW; - private final DataObjectAcessorPm pm15mRW; - private final DataObjectAcessorPm pm24hRW; - - private final DataObjectAcessorStatus readStatus; - private final HtDatabaseEventsService databaseService; - private final HtDatabaseMaintenanceService databaseMaintenanceService; - - public HtDatabaseClient getRawClient() { - return this.dbClient; - } - - public ElasticSearchDataProvider(HostInfo[] hosts) throws Exception { - this(hosts, null, null, HtDatabaseClient.TRUSTALL_DEFAULT); - } - - public ElasticSearchDataProvider(HostInfo[] hosts, String authUsername, String authPassword, boolean trustAllCerts) - throws Exception { - super(); - LOG.info("Start {}", this.getClass().getName()); - - - this.dbClient = HtDatabaseClient.getClient(hosts, authUsername, authPassword, trustAllCerts); - this.mediatorserverRW = new DataObjectAcessorWithId<>(dbClient, Entity.MediatorServer, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data.class); - this.mediatorserverRW.setWriteInterface(MediatorServerEntity.class); - - this.maintenanceRW = new DataObjectAcessorWithId<>(dbClient, Entity.Maintenancemode, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data.class); - this.maintenanceRW.setWriteInterface(MaintenanceEntity.class); - - this.guicutthroughRW = new DataObjectAcessorWithId<>(dbClient, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity.Guicutthrough, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data.class); - this.guicutthroughRW.setWriteInterface(Guicutthrough.class); - - this.equipmentRW = new DataObjectAcessorWithId<>(dbClient, Entity.Inventoryequipment, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data.class); - - this.eventRWFaultCurrent = new DataObjectAcessorWithId<>(dbClient, Entity.Faultcurrent, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data.class); - - this.eventRWFaultLog = new DataObjectAcessorWithId<>(dbClient, Entity.Faultlog, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data.class); - - this.connnectionlogRW = new DataObjectAcessorWithId<>(dbClient, Entity.Connectionlog, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data.class); - - this.eventlogRW = new DataObjectAcessorWithId<>(dbClient, Entity.Eventlog, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data.class); - - this.networkelementConnectionRW = new DataObjectAcessorWithId<>(dbClient, Entity.NetworkelementConnection, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data.class); - this.networkelementConnectionRW.setWriteInterface(NetworkElementConnectionEntity.class); - - this.pm15mRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA15M, Entity.Historicalperformance15min, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data.class); - - this.pm24hRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA24H, Entity.Historicalperformance24h, - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data.class); - - this.readStatus = new DataObjectAcessorStatus(dbClient, Entity.Faultcurrent); - - this.databaseService = new HtDatabaseEventsService(dbClient, this); - this.databaseMaintenanceService = new HtDatabaseMaintenanceService(dbClient); - } - - /*------------------------- - * Provide access to model API - */ - - public ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input) { - - ReadFaultcurrentListOutputBuilder outputBuilder = new ReadFaultcurrentListOutputBuilder(); - - QueryResult result = - this.eventRWFaultCurrent.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadFaultlogListOutputBuilder readFaultLogList(EntityInput input) { - ReadFaultlogListOutputBuilder outputBuilder = new ReadFaultlogListOutputBuilder(); - QueryResult result = - this.eventRWFaultLog.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadMaintenanceListOutputBuilder readMaintenanceList(EntityInput input) { - ReadMaintenanceListOutputBuilder outputBuilder = new ReadMaintenanceListOutputBuilder(); - QueryResult result = - this.maintenanceRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadMediatorServerListOutputBuilder readMediatorServerList(EntityInput input) { - - ReadMediatorServerListOutputBuilder outputBuilder = new ReadMediatorServerListOutputBuilder(); - QueryResult result = - this.mediatorserverRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadNetworkElementConnectionListOutputBuilder readNetworkElementConnectionList(EntityInput input) { - ReadNetworkElementConnectionListOutputBuilder outputBuilder = - new ReadNetworkElementConnectionListOutputBuilder(); - QueryResult result = - this.networkelementConnectionRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadInventoryListOutputBuilder readInventoryList(EntityInput input) { - ReadInventoryListOutputBuilder outputBuilder = new ReadInventoryListOutputBuilder(); - QueryResult result = - this.equipmentRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadConnectionlogListOutputBuilder readConnectionlogList(EntityInput input) { - ReadConnectionlogListOutputBuilder outputBuilder = new ReadConnectionlogListOutputBuilder(); - QueryResult result = - this.connnectionlogRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadEventlogListOutputBuilder readEventlogList(ReadEventlogListInput input) throws IOException { - ReadEventlogListOutputBuilder outputBuilder = new ReadEventlogListOutputBuilder(); - QueryResult result = - this.eventlogRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadPmdata15mListOutputBuilder readPmdata15mList(EntityInput input) { - ReadPmdata15mListOutputBuilder outputBuilder = new ReadPmdata15mListOutputBuilder(); - QueryResult result = - this.pm15mRW.getData(input); - LOG.debug("Read data: readPmdata15mList: {}", result); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadPmdata24hListOutputBuilder readPmdata24hList(EntityInput input) { - ReadPmdata24hListOutputBuilder outputBuilder = new ReadPmdata24hListOutputBuilder(); - QueryResult result = - this.pm24hRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.PaginationBuilder( - result.getPagination()).build()); - return outputBuilder; - } - - public ReadPmdata15mLtpListOutputBuilder readPmdata15mLtpList(EntityInput input) throws IOException { - ReadPmdata15mLtpListOutputBuilder outputBuilder = new ReadPmdata15mLtpListOutputBuilder(); - QueryResult result = pm15mRW.getDataLtpList(input); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.ltp.list.output.PaginationBuilder( - result.getPagination()).build()); - outputBuilder.setData(result.getResult().getHits()); - return outputBuilder; - } - - public ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException { - ReadPmdata15mDeviceListOutputBuilder outputBuilder = new ReadPmdata15mDeviceListOutputBuilder(); - QueryResult result = pm15mRW.getDataDeviceList(input); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.device.list.output.PaginationBuilder( - result.getPagination()).build()); - outputBuilder.setData(result.getResult().getHits()); - return outputBuilder; - } - - public ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException { - - QueryResult result = pm24hRW.getDataLtpList(input); - - ReadPmdata24hLtpListOutputBuilder outputBuilder = new ReadPmdata24hLtpListOutputBuilder(); - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.ltp.list.output.PaginationBuilder(); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.ltp.list.output.PaginationBuilder( - result.getPagination()).build()); - outputBuilder.setData(result.getResult().getHits()); - return outputBuilder; - } - - public ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input) throws IOException { - - QueryResult result = pm24hRW.getDataDeviceList(input); - - ReadPmdata24hDeviceListOutputBuilder outputBuilder = new ReadPmdata24hDeviceListOutputBuilder(); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.device.list.output.PaginationBuilder( - result.getPagination()).build()); - outputBuilder.setData(result.getResult().getHits()); - return outputBuilder; - } - - public ReadStatusOutputBuilder readStatus() throws IOException { - QueryResult result = - readStatus.getDataStatus(); - - ReadStatusOutputBuilder outputBuilder = new ReadStatusOutputBuilder(); - outputBuilder.setData(result.getResult().getHits()); - return outputBuilder; - } - - public boolean waitForYellowDatabaseStatus(long timeout, TimeUnit unit) { - return this.dbClient.waitForYellowStatus(unit.toMillis(timeout)); - } - - public CreateNetworkElementConnectionOutputBuilder createNetworkElementConnection( - NetworkElementConnectionEntity input) throws IOException { - String id = this.networkelementConnectionRW.update(input, input.getNodeId()); - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); - } - CreateNetworkElementConnectionOutputBuilder builder = new CreateNetworkElementConnectionOutputBuilder(); - builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort()) - .setUsername(input.getUsername()).setPassword(input.getPassword()).setIsRequired(input.isIsRequired()) - .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType()); - return builder; - } - - public UpdateNetworkElementConnectionOutputBuilder updateNetworkElementConnection( - UpdateNetworkElementConnectionInput input) throws IOException { - String id = this.networkelementConnectionRW.update(input, input.getId()); - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); - } - UpdateNetworkElementConnectionOutputBuilder builder = new UpdateNetworkElementConnectionOutputBuilder(); - builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort()) - .setUsername(input.getUsername()).setPassword(input.getPassword()) - .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType()); - return builder; - } - - public DeleteNetworkElementConnectionOutputBuilder deleteNetworkElementConnection( - DeleteNetworkElementConnectionInput input) throws IOException { - boolean removed = this.networkelementConnectionRW.remove(input.getId()); - if (!removed) { - throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); - } - return new DeleteNetworkElementConnectionOutputBuilder(); - } - - public DeleteMediatorServerOutputBuilder deleteMediatorServer(DeleteMediatorServerInput input) throws IOException { - boolean removed = this.mediatorserverRW.remove(input.getId()); - if (!removed) { - throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); - } - return new DeleteMediatorServerOutputBuilder(); - } - - public DeleteMaintenanceOutputBuilder deleteMaintenance(DeleteMaintenanceInput input) throws IOException { - boolean removed = this.maintenanceRW.remove(input.getId()); - if (!removed) { - throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); - } - return new DeleteMaintenanceOutputBuilder(); - } - - public UpdateMaintenanceOutputBuilder updateMaintenance(UpdateMaintenanceInput input) throws IOException { - if (input.getId() == null) { - throw new IOException("please give the id for updating entry"); - } - String id = this.maintenanceRW.update(input, input.getId()); - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); - } - UpdateMaintenanceOutputBuilder builder = new UpdateMaintenanceOutputBuilder(input).setId(id); - return builder; - } - - public UpdateMediatorServerOutputBuilder updateMediatorServer(UpdateMediatorServerInput input) throws IOException { - if (input.getId() == null) { - throw new IOException("please give the id for updating entry"); - } - String id = this.mediatorserverRW.update(input, input.getId()); - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); - } - UpdateMediatorServerOutputBuilder builder = new UpdateMediatorServerOutputBuilder(); - builder.setId(id).setName(input.getName()).setUrl(input.getUrl()); - return builder; - } - - public CreateMaintenanceOutputBuilder createMaintenance(CreateMaintenanceInput input) throws IOException { - String id = this.maintenanceRW.write(input, input.getNodeId()); - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); - } - CreateMaintenanceOutputBuilder builder = new CreateMaintenanceOutputBuilder(input).setId(id); - return builder; - } - - public CreateMediatorServerOutputBuilder createMediatorServer(CreateMediatorServerInput input) throws IOException { - String id = this.mediatorserverRW.write(input, null); - - if (id == null) { - throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); - } - CreateMediatorServerOutputBuilder builder = new CreateMediatorServerOutputBuilder(); - builder.setId(id).setName(input.getName()).setUrl(input.getUrl()); - return builder; - } - - public ReadGuiCutThroughEntryOutputBuilder readGuiCutThroughEntry(EntityInput input) { - ReadGuiCutThroughEntryOutputBuilder outputBuilder = new ReadGuiCutThroughEntryOutputBuilder(); - QueryResult result = - this.guicutthroughRW.getData(input); - outputBuilder.setData(result.getResult().getHits()); - outputBuilder.setPagination( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.PaginationBuilder( - ).build()); - return outputBuilder; - } - - public DataProvider getDataProvider() { - return this.databaseService; - } - - public HtDatabaseMaintenance getHtDatabaseMaintenance() { - return this.databaseMaintenanceService; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java deleted file mode 100644 index 73cc1a212..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import org.json.JSONException; -import org.json.JSONObject; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class HtUserdataManagerImpl implements HtUserdataManager { - - private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerImpl.class); - - private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json"; - private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults(); - - private static JSONObject loadDefaults() { - File f = new File(USERDATA_DEFAULTS_FILENAME); - String content; - JSONObject o = null; - if (f.exists()) { - try { - content = Files.readString(f.toPath()); - o = new JSONObject(content); - } catch (IOException e) { - LOG.warn("problem loading defaults: ", e); - } catch (JSONException e) { - LOG.warn("problem parsing defaults: ", e); - } - } - return o; - } - - - private final HtDatabaseClient dbClient; - - public HtUserdataManagerImpl(HtDatabaseClient rawClient) { - this.dbClient = rawClient; - } - - @Override - public String getUserdata(String username) { - SearchResult result = this.dbClient.doReadByQueryJsonData(Entity.Userdata.getName(), - QueryBuilders.matchQuery("_id", username)); - String json = result.getHits().size() > 0 ? result.getHits().get(0).getSourceAsString() : "{}"; - if (USERDATA_DEFAULTS_CONTENT != null) { - JSONObject merge = mergeData(new JSONObject(json), USERDATA_DEFAULTS_CONTENT); - json = merge.toString(); - } - return json; - } - - @Override - public String getUserdata(String username, String key) { - JSONObject o = new JSONObject(this.getUserdata(username)); - return o.has(key) ? o.get(key).toString() : "{}"; - } - - @Override - public boolean setUserdata(String username, String data) { - JSONObject o = new JSONObject(this.getUserdata(username)); - JSONObject merge = mergeData(o, new JSONObject(data)); - return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, merge.toString()) != null; - } - - @Override - public boolean setUserdata(String username, String key, String data) { - JSONObject o = new JSONObject(this.getUserdata(username)); - o = mergeData(o, key, new JSONObject(data)); - return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, o.toString()) != null; - } - - @Override - public boolean removeUserdata(String username) { - return this.dbClient.doRemove(Entity.Userdata.getName(), username); - } - - @Override - public boolean removeUserdata(String username, String key) { - JSONObject o = new JSONObject(this.getUserdata(username)); - if (o.has(key)) { - o.remove(key); - return this.setUserdata(username, o.toString()); - } - return true; - } - - private static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) { - if (!o.has(key)) { - o.put(key, subObject); - } else { - JSONObject tmp = new JSONObject(); - tmp.put(key, subObject); - o = mergeData(tmp, o); - } - return o; - } - - private static JSONObject mergeData(JSONObject source, JSONObject target) throws JSONException { - String[] keys = JSONObject.getNames(source); - if (keys == null) { - return target; - } - for (String key : keys) { - Object value = source.get(key); - if (!target.has(key)) { - // new value for "key": - target.put(key, value); - } else { - // existing value for "key" - recursively deep merge: - if (value instanceof JSONObject) { - JSONObject valueJson = (JSONObject) value; - mergeData(valueJson, target.getJSONObject(key)); - } else { - target.put(key, value); - } - } - } - return target; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java deleted file mode 100644 index c4fe672cd..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorWithId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MediatorServerDataProvider implements AutoCloseable { - - private static final Logger LOG = LoggerFactory.getLogger(MediatorServerDataProvider.class); - - private final HtDatabaseClient dbClient; - private final DataObjectAcessorWithId mediatorserverRW; - private final int REFRESH_INTERVAL = 60; - private final Map entries; - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - private boolean isRunning; - - public MediatorServerDataProvider(HostInfo[] hosts) throws Exception { - this(hosts, null, null, false); - } - - public MediatorServerDataProvider(HostInfo[] hosts, String authUsername, String authPassword, boolean trustAll) throws Exception { - super(); - LOG.info("Start {}", this.getClass().getName()); - this.entries = new HashMap<>(); - this.dbClient = HtDatabaseClient.getClient(hosts, authUsername, authPassword, trustAll); - this.mediatorserverRW = new DataObjectAcessorWithId<>(dbClient, Entity.MediatorServer, Data.class); - this.scheduler.scheduleAtFixedRate(onTick, this.REFRESH_INTERVAL, this.REFRESH_INTERVAL, TimeUnit.SECONDS); - } - - private final Runnable onTick = new Runnable() { - - @Override - public void run() { - isRunning = true; - runIt(); - isRunning = false; - } - - }; - - private void runIt() { - SearchResult result = MediatorServerDataProvider.this.mediatorserverRW.doReadAll(); - List data = result.getHits(); - for (Data item : data) { - MediatorServerDataProvider.this.entries.put(item.getId(), item); - } - } - - /** - * - * @param dbServerId - * @return url or null if not exists - */ - public String getHostUrl(String dbServerId) { - Data info = this.entries.getOrDefault(dbServerId, null); - return info == null ? null : info.getUrl(); - } - - public boolean triggerReloadSync() { - if (!isRunning) { - runIt(); - } - return true; - } - - @Override - public void close() throws Exception { - this.scheduler.shutdown(); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java deleted file mode 100644 index 0cd327bfc..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor; - -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DataObjectAcessor extends EsDataObjectReaderWriter2 { - - private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessor.class); - - DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class clazz) throws ClassNotFoundException { - super(dbClient, entity, clazz); - LOG.info("Create {}", this.getClass().getName()); - } - - public QueryResult getData(EntityInput input) { - - QueryByFilter queryByFilter = new QueryByFilter(input); - QueryBuilder queryBuilder = queryByFilter.getQueryBuilderByFilter(); - // Exception handling during user input for invalid filter input. - // This wrong filter by user is allowed an results into empty data. - boolean ignoreException = queryBuilder.contains("range"); - - LOG.info("Request: {} filter {} ignoreException{}:", this.getDataTypeName(), queryByFilter, ignoreException); - - SearchResult result = doReadAll(queryBuilder, ignoreException); - return new QueryResult<>(queryByFilter, result); - } - - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java deleted file mode 100644 index 9280a0602..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor; - -import java.io.IOException; - -import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; -import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries; -import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DataObjectAcessorPm extends DataObjectAcessor { - - private final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); - - private static final String UUID_KEY = "uuid-interface"; - private static final String NODE_KEY = "node-name"; - private static final String KEY = "node-name"; - - - public enum Intervall { - PMDATA15M("historicalperformance15min", "historicalperformance15min"), PMDATA24H("historicalperformance24h", - "historicalperformance24h"); - - String index; - String type; - - Intervall(String index, String type) { - this.index = index; - this.type = type; - } - - public String getIndex() { - return index; - } - - public String getType() { - return type; - } - } - - private ExtRestClient dbClient; - private Intervall mode; - - public DataObjectAcessorPm(HtDatabaseClient dbClient, Intervall mode, Entity entity, Class clazz) - throws ClassNotFoundException { - super(dbClient, entity, clazz); - LOG.info("DataObjectAcessorPm"); - this.dbClient = dbClient; - this.mode = mode; - } - - /** - * get aggregated list of ltps for filter NODE_KEY - * - * @param input - * @return - * @throws IOException - */ - public QueryResult getDataLtpList(EntityInput input) throws IOException { - - QueryByFilter queryByFilter = new QueryByFilter(input); - SearchRequest request = - queryByFilter.getSearchRequestByFilter(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType()); - try { - SearchResponse response = this.dbClient.search(request); - AggregationEntries aggs = response.getAggregations(UUID_KEY); - String[] uuids = - aggs.getKeysAsPagedStringList(queryByFilter.getPageSize(), queryByFilter.getPageStartIndex()); - long totalSize = aggs.size(); - return new QueryResult(queryByFilter.getPage(), queryByFilter.getPageSize(), - new SearchResult(uuids, totalSize)); - } catch (IOException e) { - throw new IOException("problem reading ltps for req=" + request, e); - } - } - - /** - * get aggregated devices list - * - * @param input filter should be empty/no filter handled, only sortorder for KEY ('node-name') - * @return - * @throws IOException - */ - public QueryResult getDataDeviceList(EntityInput input) throws IOException { - - QueryByFilter queryByFilter = new QueryByFilter(input); - SearchRequest request = - queryByFilter.getSearchRequestBySortOrder(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType()); - try { - SearchResponse response = this.dbClient.search(request); - AggregationEntries aggs = response.getAggregations(KEY); - String[] uuids = - aggs.getKeysAsPagedStringList(queryByFilter.getPageSize(), queryByFilter.getPageStartIndex()); - long totalSize = aggs.size(); - return new QueryResult(queryByFilter.getPage(), queryByFilter.getPageSize(), - new SearchResult(uuids, totalSize)); - } catch (IOException e) { - throw new IOException("problem reading nodes for req=" + request, e); - } - - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java deleted file mode 100644 index efb52213d..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor; - -import java.io.IOException; -import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; -import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; -import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries; -import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.DataBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.FaultsBuilder; - -public class DataObjectAcessorStatus extends DataObjectAcessor { - - final String ESDATATYPE_FAULTCURRENT_SEVERITY_KEY = "severity"; - - private final ExtRestClient dbClient; - private final Entity entity; - - public DataObjectAcessorStatus(HtDatabaseClient dbClient, Entity entity) throws ClassNotFoundException { - super(dbClient, entity, Data.class); - this.dbClient = dbClient; - this.entity = entity; - } - - public QueryResult getDataStatus() throws IOException { - SearchRequest request = getNewInstanceOfSearchRequest(entity); - request.setQuery(QueryBuilders.matchAllQuery().aggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY).size(0)); - SearchResponse response = this.dbClient.search(request); - AggregationEntries aggs = response.getAggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY); - - Data[] data = {new DataBuilder() - .setFaults( - new FaultsBuilder().setCriticals(YangHelper2.getLongOrUint32(aggs.getOrDefault("Critical", 0L))) - .setMajors(YangHelper2.getLongOrUint32(aggs.getOrDefault("Major", 0L))) - .setMinors(YangHelper2.getLongOrUint32(aggs.getOrDefault("Minor", 0L))) - .setWarnings(YangHelper2.getLongOrUint32(aggs.getOrDefault("Warning", 0L))).build()) - .build()}; - long toalsize = data.length; - return new QueryResult(1L, 1L, new SearchResult(data, toalsize)); - - } - - - private static SearchRequest getNewInstanceOfSearchRequest(Entity entity) { - return new SearchRequest(entity.getName(), entity.getName()); - } - - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java deleted file mode 100644 index a977890c9..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor; - -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DataObjectAcessorWithId extends DataObjectAcessor { - - private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorWithId.class); - - public DataObjectAcessorWithId(HtDatabaseClient dbClient, Entity entity, Class clazz) - throws ClassNotFoundException { - super(dbClient, entity, clazz); - setEsIdAttributeName("_id"); - LOG.info("Create {}", this.getClass().getName()); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java deleted file mode 100644 index f1a43359c..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Fault; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType; - -public class FaultEntityManager { - - private static final Pattern pattern = Pattern.compile(".*\\[layerProtocol=(.*)\\]"); - - /** - * The leading indication for notification or events that are not in the currentProblem data of the ONF Coremodel - */ - private static final String NOCURRENTPROBLEMINDICATION = "#"; - - /** - * Specific problems are not moving into current problem list - * - * @param problemName to be verified - * @return true if problem is current - */ - public static boolean isManagedAsCurrentProblem(String problemName) { - return !problemName.startsWith(NOCURRENTPROBLEMINDICATION); - } - - public static boolean isManagedAsCurrentProblem(Fault problem) { - return isManagedAsCurrentProblem(problem.getProblem()); - } - - /** - * Specific problems are not moving into current problem list - * - * @param fault to be verified - * @return true if cleared indication - */ - public static boolean isNoAlarmIndication(@Nonnull Fault fault) { - return SeverityType.NonAlarmed.equals(fault.getSeverity()); - } - - /** - * Create a specific ES id for the current log. - * - * @return a string with the generated ES Id - */ - public static String genSpecificEsId(String nodeName, String objectId, String problemName) { - - String uuId; - - Matcher matcher = pattern.matcher(objectId); - if (matcher.matches() && matcher.groupCount() == 1) { - uuId = matcher.group(1); - } else { - uuId = objectId; - } - - StringBuffer strBuf = new StringBuffer(); - strBuf.append(nodeName); - strBuf.append("/"); - strBuf.append(uuId); - strBuf.append("/"); - strBuf.append(problemName); - return strBuf.toString(); - } - - /** - * Create Es id - * - * @param fault used to create uuid for faultcurrent - * @return String with Id - */ - public static String genSpecificEsId(FaultcurrentEntity fault) { - return genSpecificEsId(fault.getNodeId(), fault.getObjectId(), fault.getProblem()); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java deleted file mode 100644 index b23d882c8..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java +++ /dev/null @@ -1,628 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import javax.annotation.Nonnull; -import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataInconsistencyException; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionLogStatus; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GranularityPeriodType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntityBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInputBuilder; -import org.opendaylight.yangtools.yang.common.Uint32; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Event service, writing all events into the database into the appropriate index. - * - * @author herbert - */ -public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider { - private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class); - - private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter(); - - private HtDatabaseClient client; - private EsDataObjectReaderWriter2 eventRWEventLogDevicemanager; - private EsDataObjectReaderWriter2 eventRWEquipment; - private EsDataObjectReaderWriter2 eventRWFaultCurrentDB; - private EsDataObjectReaderWriter2 eventRWFaultLogDB; - private EsDataObjectReaderWriter2 eventRWConnectionLogDB; - private final EsDataObjectReaderWriter2 networkelementConnectionDB; - private final EsDataObjectReaderWriter2 guiCutThroughDB; - private final EsDataObjectReaderWriter2 pmData15mDB; - private final EsDataObjectReaderWriter2 pmData24hDB; - - @SuppressWarnings("unused") - private final ElasticSearchDataProvider dataProvider; - // --- Construct and initialize - - - public HtDatabaseEventsService(HtDatabaseClient client, ElasticSearchDataProvider elasticSearchDataProvider) - throws Exception { - - LOG.info("Create {} start", HtDatabaseEventsService.class); - this.dataProvider = elasticSearchDataProvider; - - try { - // Create control structure - this.client = client; - - eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog, - EventlogEntity.class, EventlogBuilder.class); - - eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment, InventoryEntity.class, - InventoryBuilder.class); - - eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent, - FaultcurrentEntity.class, FaultcurrentBuilder.class); - - eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog, FaultlogEntity.class, - FaultlogBuilder.class); - - eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog, - ConnectionlogEntity.class, ConnectionlogBuilder.class); - - networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection, - NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true) - .setEsIdAttributeName("_id"); - - guiCutThroughDB = new EsDataObjectReaderWriter2<>(client, Entity.Guicutthrough, GuicutthroughEntity.class, - GuicutthroughBuilder.class); - - pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min, PmdataEntity.class, - PmdataEntityBuilder.class); - - pmData24hDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h, PmdataEntity.class, - PmdataEntityBuilder.class); - - } catch (Exception e) { - LOG.error("Can not start database client. Exception: {}", e); - throw new Exception("Can not start database client. Exception: {}", e); - } - LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class, - client != null ? "sucessfully" : "not"); - } - - // --- Function - - // -- Connection log - @Override - public void writeConnectionLog(ConnectionlogEntity event) { - if (assertIfClientNull(event)) { - return; - } - LOG.debug("Write event: {}", event); - eventRWConnectionLogDB.write(event, null); - - } - - // -- Event log - @Override - public void writeEventLog(EventlogEntity event) { - if (assertIfClientNull("No client to write {}", event)) { - return; - } - - LOG.debug("Write event: {}", event.toString()); - eventRWEventLogDevicemanager.write(event, null); - } - - - // -- Fault log - - @Override - public void writeFaultLog(FaultlogEntity fault) { - if (assertIfClientNull(fault)) { - return; - } - - LOG.debug("Write fault to faultlog: {}", fault.toString()); - eventRWFaultLogDB.write(fault, null); - } - - // -- Fault current - - @Override - public void updateFaultCurrent(FaultcurrentEntity fault) { - if (assertIfClientNull(fault)) { - return; - } - - if (FaultEntityManager.isManagedAsCurrentProblem(fault)) { - if (FaultEntityManager.isNoAlarmIndication(fault)) { - LOG.debug("Remove from currentFaults: {}", fault.toString()); - eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault)); - } else { - LOG.debug("Write to currentFaults: {}", fault.toString()); - eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault)); - } - } else { - LOG.debug("Ingnore for currentFaults: {}", fault.toString()); - } - } - - /** - * Remove all entries for one node - * - * @param nodeName contains the mountpointname - * @return number of deleted entries - */ - @Override - public int clearFaultsCurrentOfNode(String nodeName) { - if (assertIfClientNullForNodeName(nodeName)) { - return -1; - } - - LOG.debug("Remove from currentFaults all faults for node: {}", nodeName); - return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName)); - } - - /** - * Remove all entries for one node - * - * @param nodeName contains the mountpointname - * @param objectId of element to be deleted - * @return number of deleted entries - */ - @Override - public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) { - if (assertIfClientNullForNodeName(nodeName)) { - return -1; - } - - LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId); - return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId)); - } - - /** - * Deliver list with all mountpoint/node-names in the database. - * - * @return List of all mountpoint/node-names the had active alarms. - */ - @Override - public @Nonnull List getAllNodesWithCurrentAlarms() { - if (assertIfClientNull("No DB, can not delete for all nodes", null)) { - return new ArrayList<>(); - } - - LOG.debug("Remove from currentFaults faults for all node"); - List nodeNames = new ArrayList<>(); - - for (FaultcurrentEntity fault : eventRWFaultCurrentDB.doReadAll().getHits()) { - String nodeName = fault.getNodeId(); - if (!nodeNames.contains(nodeName)) { - // this.clearFaultsCurrentOfNode(nodeName); -> Function shifted - nodeNames.add(nodeName); - } - } - return nodeNames; - } - - // -- Inventory and equipment current - - /** - * write internal equipment to database - * - * @param internalEquipment with mandatory fields. - */ - - private void writeInventory(Inventory internalEquipment) { - - if (internalEquipment.getManufacturerIdentifier() == null) { - internalEquipment = new InventoryBuilder(internalEquipment).setManufacturerIdentifier("").build(); - } - if (internalEquipment.getDate() == null) { - internalEquipment = new InventoryBuilder(internalEquipment).setDate("").build(); - } - eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId() + "/" + internalEquipment.getUuid()); - } - - /** - * write internal equipment to database - * - * @param nodeId - * @param list - */ - @Override - public void writeInventory(String nodeId, List list) { - - try { - checkConsistency(nodeId, list); - } catch (DataInconsistencyException e) { - LOG.warn("inventory list for node {} is not consistent", nodeId, e); - list = e.getRepairedList(); - } - - for (Inventory internalEquipment : list) { - this.writeInventory(internalEquipment); - } - } - - private static void checkConsistency(String nodeId, List list) throws DataInconsistencyException { - final String UNBOUND_INVENTORY_UUID = "unbound"; - List failures = new ArrayList<>(); - long treeLevel; - int failCounter = 0; - Map repairList = new HashMap<>(); - InventoryBuilder repairedItem; - InventoryBuilder unboundItem = new InventoryBuilder().setNodeId(nodeId).setUuid(UNBOUND_INVENTORY_UUID) - .setTreeLevel(Uint32.valueOf(0));; - for (Inventory item : list) { - repairedItem = new InventoryBuilder(item); - //check missing tree-level - if (!nodeId.equals(item.getNodeId())) { - failures.add(String.format("missing node-id for equipment(uuid=%s)", item.getUuid())); - repairedItem.setNodeId(nodeId); - failCounter++; - } - if (item.getTreeLevel() == null) { - failures.add(String.format("missing tree-level for equipment(uuid=%s)", item.getUuid())); - repairedItem.setTreeLevel(Uint32.valueOf(1)); - failCounter++; - - } else { - treeLevel = item.getTreeLevel().longValue(); - if (treeLevel > 0) { - //check non root elem and missing parent - if (item.getParentUuid() == null) { - failures.add(String.format("Non root level element (uuid=%s) has to have a parent element", - item.getUuid())); - failCounter++; - repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID); - repairList.put(unboundItem.getUuid(), unboundItem.build()); - } - //check that parent exists in list and is tree-level -1 - else { - Optional parent = - list.stream().filter(e -> item.getParentUuid().equals(e.getUuid())).findFirst(); - if (parent.isEmpty()) { - failures.add(String.format("no parent found for uuid=%s with parent-uuid=%s", - item.getUuid(), item.getParentUuid())); - repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID); - failCounter++; - } - } - } - //check for duplicated uui - Optional duplicate = list - .stream().filter(e -> !item.equals(e) && item.getUuid() != null - && item.getUuid().equals(e.getUuid()) && repairList.containsKey(e.getUuid())) - .findFirst(); - if (duplicate.isPresent()) { - failures.add(String.format("found duplicate uuid=%s", item.getUuid())); - failCounter++; - continue; - - } - if (failCounter > 0) { - repairList.put(repairedItem.getUuid(), repairedItem.build()); - } else { - repairList.put(item.getUuid(), item); - } - } - } - - if (!failures.isEmpty()) { - throw new DataInconsistencyException(new ArrayList<>(repairList.values()), - "inventory list is not consistent;\n" + String.join("\n", failures)); - } - } - - // -- Networkelement - - - /** - * join base with parameters of toJoin (only non null values) - * - * @param base base object - * @param toJoin object with new property values - * @return new joined object - */ - @SuppressWarnings("unused") - private NetworkElementConnectionEntity joinNe(NetworkElementConnectionEntity base, - NetworkElementConnectionEntity toJoin) { - if (base == null) { - return toJoin; - } - NetworkElementConnectionBuilder builder = new NetworkElementConnectionBuilder(base); - if (toJoin != null) { - if (toJoin.isIsRequired() != null) { - builder.setIsRequired(toJoin.isIsRequired()); - } - if (toJoin.getCoreModelCapability() != null) { - builder.setCoreModelCapability(toJoin.getCoreModelCapability()); - } - if (toJoin.getDeviceType() != null) { - builder.setDeviceType(toJoin.getDeviceType()); - } - if (toJoin.getHost() != null) { - builder.setHost(toJoin.getHost()); - } - if (toJoin.getNodeDetails() != null) { - builder.setNodeDetails(toJoin.getNodeDetails()); - } - if (toJoin.getPassword() != null) { - builder.setPassword(toJoin.getPassword()); - } - if (toJoin.getPort() != null) { - builder.setPort(toJoin.getPort()); - } - if (toJoin.getStatus() != null) { - builder.setStatus(toJoin.getStatus()); - } - if (toJoin.getUsername() != null) { - builder.setUsername(toJoin.getUsername()); - } - } - return builder.build(); - } - - /** - * - * @param networkElementConnectionEntitiy to wirte to DB - * @param nodeId Id for this DB element - */ - @Override - public boolean updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, - String nodeId) { - return this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId) != null; - // NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId); - // this.networkelementConnectionDB.write(this.joinNe(e, networkElementConnectionEntitiy), nodeId); - } - - /** - * Update after new mountpoint registration - * - * @param networkElementConnectionEntitiy data - * @param nodeId of device (mountpoint name) - */ - @Override - public boolean updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, - String nodeId) { - LOG.info("update networkelement-connection for {} with data {}", nodeId, networkElementConnectionEntitiy); - return this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, - Arrays.asList("is-required", "username", "password")) != null; - // NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId); - // this.networkelementConnectionDB.write(this.joinNe(e, networkElementConnectionEntitiy), nodeId); - - } - - /* please do not remove */ - // public void cleanNetworkElementConnections() { - // this.networkelementConnectionDB.remove(QueryBuilders.matchQuery("is-required", false)); - // CreateNetworkElementConnectionInput x = new CreateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(); - // this.networkelementConnectionDB.update(x,QueryBuilders.matchAllQuery()); - // } - - @Override - public void removeNetworkConnection(String nodeId) { - Boolean isRequired; - NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId); - if (e != null && (isRequired = e.isIsRequired()) != null) { - if (isRequired) { - LOG.debug("updating connection status for {} of required ne to disconnected", nodeId); - this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder() - .setStatus(ConnectionLogStatus.Disconnected).build(), nodeId); - } else { - LOG.debug("remove networkelement-connection for {} entry because of non-required", nodeId); - this.networkelementConnectionDB.remove(nodeId); - } - } else { - LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection", - nodeId); - } - } - - // -- Multiple areas - - @Override - public int doIndexClean(Date olderAreOutdated) { - - String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); - int removed = 0; - - QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); - removed += eventRWEventLogDevicemanager.remove(queryEventBase); - - QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp); - removed += eventRWFaultLogDB.remove(queryFaultLog); - return removed; - } - - @Override - public int getNumberOfOldObjects(Date olderAreOutdated) { - - String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); - int numberOfElements = 0; - - QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); - numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal(); - - QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp); - numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal(); - - return numberOfElements; - } - - // -- Helper - - /** - * Verify status of client - * - * @param event that is printed with message - * @return true if client is null - */ - private boolean assertIfClientNull(Object event) { - return assertIfClientNull("No DB, can not write: {}", event); - } - - private boolean assertIfClientNullForNodeName(Object object) { - return assertIfClientNull("No DB, can not handle node: {}", object); - } - - /** - * Verify status of client - * - * @param message to print including {} for object printout. - * @return true if client is null - */ - private boolean assertIfClientNull(String message, Object object) { - if (client == null) { - LOG.debug(message, object); - return true; - } - return false; - } - - // ### sub classes - - - private static class EsEventBase { - /** - * Query to get older Elements - * - * @param netconfTimeStamp to identify older Elements - * @return QueryBuilder for older elements related to timestamp - */ - private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { - return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp); - } - } - private static class EsFaultLogDevicemanager { - /** - * Get older Elements - * - * @param netconfTimeStamp to identify query elements older than this timestamp. - * @return QueryBuilder for related elements - */ - public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { - return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp); - } - } - public static class EsFaultCurrent { - /** - * @param nodeName name of the node - * @return query builder - */ - public static QueryBuilder getQueryForOneNode(String nodeName) { - return QueryBuilders.matchQuery("node-id", nodeName); - } - - public static QueryBuilder getQueryForOneNodeAndObjectId(String nodeName, String objectId) { - BoolQueryBuilder bq = QueryBuilders.boolQuery(); - bq.must(QueryBuilders.matchQuery("node-id", nodeName)); - bq.must(QueryBuilders.matchQuery("object-id", objectId)); - return bq; - } - } - - @Override - public List getNetworkElementConnections() { - return this.networkelementConnectionDB.doReadAll().getHits(); - } - - @Override - public void doWritePerformanceData(List list) { - - list.forEach(elem -> { - GranularityPeriodType granularityPeriod = nnGetGranularityPeriodType(elem.getGranularityPeriod()); - //_id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00" - StringBuffer id = new StringBuffer(); - DateAndTime date = elem.getTimeStamp(); - id.append(elem.getNodeName()); - id.append("/"); - id.append(elem.getUuidInterface()); - id.append("/"); - id.append(date != null ? date.getValue() : "null"); - - switch (granularityPeriod) { - case Period15Min: - pmData15mDB.write(elem, id.toString()); - break; - case Period24Hours: - pmData24hDB.write(elem, id.toString()); - break; - case Unknown: - default: - LOG.debug("Unknown granularity {} id {}", granularityPeriod, id); - break; - } - }); - - } - - @NonNull - GranularityPeriodType nnGetGranularityPeriodType(@Nullable GranularityPeriodType granularityPeriod) { - return granularityPeriod != null ? granularityPeriod : GranularityPeriodType.Unknown; - } - - @Override - public HtDatabaseClient getRawClient() { - return this.client; - } - - @Override - public void writeGuiCutThroughData(Guicutthrough gcData, String nodeId) { - guiCutThroughDB.write(gcData, nodeId); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java deleted file mode 100644 index 380526d9a..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity; - -import java.util.ArrayList; -import java.util.List; -import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; -import org.onap.ccsdk.features.sdnr.wt.common.HtAssert; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class HtDatabaseMaintenanceService implements HtDatabaseMaintenance { - - private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseMaintenanceService.class); - - private final EsDataObjectReaderWriter2 maintenanceRW; - private final EsDataObjectReaderWriter2 requiredNeRW; - - public HtDatabaseMaintenanceService(@NonNull HtDatabaseClient client) throws ClassNotFoundException { - HtAssert.nonnull(client); - - // Create control structure - maintenanceRW = new EsDataObjectReaderWriter2<>(client, Entity.Maintenancemode, MaintenanceEntity.class, - MaintenanceBuilder.class, true).setEsIdAttributeName("_id"); - - requiredNeRW = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection, - NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true) - .setEsIdAttributeName("_id"); - - } - - /** - * Get existing object for mountpoint to manage maintenance mode - * - * @return Object with configuration - */ - @Override - @Nullable - public MaintenanceEntity getMaintenance(@Nullable String mountpointId) { - MaintenanceEntity deviceMaintenanceMode = null; - if (maintenanceRW != null && mountpointId != null) { - deviceMaintenanceMode = maintenanceRW.read(mountpointId); - } - return deviceMaintenanceMode; - } - - @Override - public MaintenanceEntity setMaintenance(MaintenanceEntity m) { - if (maintenanceRW != null) { - if (maintenanceRW.write(m, m.getNodeId()) == null) { - throw new IllegalArgumentException("Problem writing to database: " + m.getId()); - } - LOG.info("Wrote maintenance object {}", m.toString()); - } - return m; - } - - @Override - public List getAll() { - return maintenanceRW != null ? maintenanceRW.doReadAll().getHits() : new ArrayList<>(); - } - - @Override - public MaintenanceEntity createIfNotExists(String mountpointId) { - MaintenanceEntity deviceMaintenanceMode = null; - if (maintenanceRW != null) { - deviceMaintenanceMode = maintenanceRW.read(mountpointId); - if (deviceMaintenanceMode == null) { - LOG.debug("creating empty maintenance object in database"); - deviceMaintenanceMode = getDefaultMaintenance(mountpointId); - maintenanceRW.write(deviceMaintenanceMode, mountpointId); - } else { - LOG.debug("maintenance object already exists in database"); - } - } else { - LOG.warn("cannot create maintenance obj. db reader/writer is null"); - } - return deviceMaintenanceMode; - } - - @Override - public void deleteIfNotRequired(String mountPointNodeName) { - - if (!this.isRequireNe(mountPointNodeName)) { - if (maintenanceRW != null) { - LOG.debug("removing maintenance object in database for " + mountPointNodeName); - maintenanceRW.remove(mountPointNodeName); - } else { - LOG.warn("cannot create maintenance obj. db reader/writer is null"); - } - } - - - } - - /** - * Provide default maintenanceinformation for a device - * - * @param mountpointId nodeId of device - * @return default data - */ - static private MaintenanceEntity getDefaultMaintenance(String mountpointId) { - - DateAndTime now = NetconfTimeStampImpl.getConverter().getTimeStamp(); - - MaintenanceBuilder deviceMaintenanceModeBuilder = new MaintenanceBuilder(); - deviceMaintenanceModeBuilder.setNodeId(mountpointId).setId(mountpointId); - // Use time from mountpoint creation - deviceMaintenanceModeBuilder.setDescription(""); - // Use time from mountpoint creation - deviceMaintenanceModeBuilder.setStart(now); - deviceMaintenanceModeBuilder.setEnd(now); - deviceMaintenanceModeBuilder.setActive(false); - - // Reference to all - //consistent to UI input to null/not empty string - //deviceMaintenanceModeBuilder.setObjectIdRef(""); - //deviceMaintenanceModeBuilder.setProblem(""); - - return deviceMaintenanceModeBuilder.build(); - } - - // -- Private - /** - * Check in required ne if entry exists for mountpointNodeName - * - * @param mountPointNodeName - * @return - */ - @SuppressWarnings("null") - private boolean isRequireNe(String mountPointNodeName) { - NetworkElementConnectionEntity ne = null; - if (requiredNeRW != null) { - LOG.debug("searching for entry in required-networkelement for " + mountPointNodeName); - ne = requiredNeRW.read(mountPointNodeName); - } else { - LOG.warn("cannot read db. no db reader writer initialized"); - } - if (ne != null && ne.isIsRequired() != null) { - return ne.isIsRequired(); - } else { - return false; - } - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java deleted file mode 100644 index 627d125ae..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java +++ /dev/null @@ -1,433 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; -import org.eclipse.jdt.annotation.Nullable; -import org.onap.ccsdk.features.sdnr.wt.common.YangHelper; -import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; -import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorPm; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Pagination; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Sortorder; -import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.common.Uint64; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class QueryByFilter { - - private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); - private static final List timestampValueNames = Arrays.asList("timestamp", "start", "end"); - - private static List emptySortOrderList = new ArrayList<>(); - private static List emptyFilterList = new ArrayList<>(); - - // Derived from input - private long page; - private long pageSize; - private long fromPage; - private List filterList; - private List sortOrder; - - /** - * Process input from RPC into Queries to database - * - * @param input Input from RPC, for test it could be null - */ - public QueryByFilter(EntityInput input) { - page = -1; - pageSize = -1; - if (input != null) { - @Nullable - Pagination pagination = input.getPagination(); - if (pagination != null) { - @Nullable - Uint64 pageOrNull = YangHelper2.getUint64(pagination.getPage()); - if (pageOrNull != null) { - page = pageOrNull.longValue(); - } - @Nullable - Uint32 pageSizeOrNull = YangHelper2.getUint32(pagination.getSize()); - if (pageSizeOrNull != null) { - pageSize = pageSizeOrNull.longValue(); - } - } - } - if (page < 0) - page = 1; - if (pageSize < 0) - pageSize = 1; - - fromPage = (page - 1) * pageSize; - if (fromPage < 0 || pageSize > 10000) - throw new IllegalArgumentException("mismatching input parameters. From:" + fromPage + " size:" + pageSize); - - filterList = YangHelper.getList(input.getFilter()); - if (filterList == null) - filterList = emptyFilterList; - sortOrder = YangHelper.getList(input.getSortorder()); - if (sortOrder == null) - sortOrder = emptySortOrderList; - - } - - public QueryBuilder getQueryBuilderByFilter() { - return getQueryBuilderByFilter(""); - } - - public QueryBuilder getQueryBuilderByFilter(String prefix) { - QueryBuilder queryBuilder = fromFilter(filterList, prefix).from(fromPage).size(pageSize); - setSortOrder(queryBuilder, sortOrder, prefix); - return queryBuilder; - } - - public SearchRequest getSearchRequestByFilter(String nodeKey, String uuidKey, String index, String dataType) { - Filter nodeFilter = getFilter(filterList, nodeKey); - if (nodeFilter != null) { - SearchRequest request = new SearchRequest(index, dataType); - request.setQuery( - QueryBuilders.matchQuery(nodeKey, nodeFilter.getFiltervalue()).aggregations(uuidKey).size(0)); - return request; - } else { - String msg = "no nodename in filter found "; - LOG.debug(msg); - throw new IllegalArgumentException(msg); - } - } - - public SearchRequest getSearchRequestBySortOrder(String nodeKey, String uuidKey, String index, String dataType) { - Sortorder soNode = getSortOrder(sortOrder, nodeKey); - SearchRequest request = new SearchRequest(index, dataType); - QueryBuilder query = null; - if (soNode != null) { - query = QueryBuilders.matchAllQuery().aggregations(nodeKey, convert(soNode.getSortorder())).size(0); - } else { - query = QueryBuilders.matchAllQuery().aggregations(nodeKey).size(0); - } - request.setQuery(query); - return request; - } - - public long getPage() { - return page; - } - - public long getPageSize() { - return pageSize; - } - - public long getPageStartIndex() { - return fromPage; - } - - @Override - public String toString() { - return "QueryByFilter [page=" + page + ", pageSize=" + pageSize + ", fromPage=" + fromPage + ", filterList=" - + filterList + ", sortOrder=" + sortOrder + "]"; - } - - /* - * Private and static implementations - */ - private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder, String prefix) { - if (sortorder != null && sortorder.size() > 0) { - for (Sortorder so : sortorder) { - query.sort(handlePrefix(prefix, so.getProperty()), convert(so.getSortorder())); - } - } - return query; - } - - private static org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder convert(SortOrder sortOrder) { - return sortOrder == SortOrder.Ascending - ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING - : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING; - }; - - private static Sortorder getSortOrder(@Nullable List list, String prop) { - if (list == null) { - return null; - } - for (Sortorder o : list) { - if (prop.equals(o.getProperty())) { - return o; - } - } - return null; - } - - private static Filter getFilter(@Nullable List list, String prop) { - if (list == null) { - return null; - } - for (Filter f : list) { - if (prop.equals(f.getProperty())) { - return f; - } - } - return null; - } - - private static String fillTimeStamp(String value) { - int idx = value.lastIndexOf("*"); - final String REPLACE = "0000-00-00T00:00:00.0Z"; - String s = value.substring(0, idx) + REPLACE.substring(idx); - if (Integer.parseInt(s.substring(5, 7)) == 0) { - s = s.substring(0, 5) + "01-" + s.substring(8); - } - if (Integer.parseInt(s.substring(8, 10)) == 0) { - s = s.substring(0, 8) + "01" + s.substring(10); - } - - return s; - } - - /** - * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte: - * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z - * - * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01 - * - */ - private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) { - if (!value.endsWith("*")) { - return null; - } - int idx = value.lastIndexOf("*"); - String lowerEnd = fillTimeStamp(value); - String upperEnd = null; - NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter(); - Date dt = null; - try { - dt = converter.getDateFromNetconf(lowerEnd); - } catch (Exception e) { - - } - if (dt == null) { - return null; - } - // property.substring(0,idx)+REPLACE.substring(idx+1); - Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - c.setTime(dt); - int tmpvalue; - switch (idx) { - case 1: // (2*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 2: // (20*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 3: // (200*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 4: // (2000*) - case 5: // (2000-*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 6: // switch 10 months (2000-0* or 2000-1*) - tmpvalue = c.get(Calendar.MONTH); - if (tmpvalue < 9) { - c.set(Calendar.MONTH, 9); - } else { - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); - c.set(Calendar.MONTH, 0); - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - - break; - case 7: // switch one month (2018-01* or 2018-01-*) - case 8: - c.add(Calendar.MONTH, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 9: // (2018-01-0*) - tmpvalue = c.get(Calendar.DAY_OF_MONTH); - if (tmpvalue == 1) { - c.set(Calendar.DAY_OF_MONTH, 10); - } else if (tmpvalue == 10) { - c.set(Calendar.DAY_OF_MONTH, 20); - } else if (tmpvalue == 20) { - if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) { - c.set(Calendar.DAY_OF_MONTH, 1); - c.add(Calendar.MONTH, 1); - } else { - c.set(Calendar.DAY_OF_MONTH, 30); - } - } else if (tmpvalue == 30) { - c.set(Calendar.DAY_OF_MONTH, 1); - c.add(Calendar.MONTH, 1); - } else { - break; - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 10: // (2018-01-01*) - case 11: // (2018-01-01T*) - c.add(Calendar.DAY_OF_MONTH, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 12: // (2018-01-01T1*) - tmpvalue = c.get(Calendar.HOUR_OF_DAY); - if (tmpvalue == 20) { - c.set(Calendar.HOUR_OF_DAY, 0); - c.add(Calendar.DAY_OF_MONTH, 1); - } else { - c.add(Calendar.HOUR_OF_DAY, 10); - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 13: // (2018-01-01T11*) - case 14: // (2018-01-01T11-*) - c.add(Calendar.HOUR_OF_DAY, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 15: // (2018-01-01T11-3*) - c.add(Calendar.MINUTE, 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 16: // (2018-01-01T11-32*) - case 17: // (2018-01-01T11-32-*) - c.add(Calendar.MINUTE, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 18: // (2018-01-01T11-32-1*) - c.add(Calendar.SECOND, 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 19: // (2018-01-01T11-32-11*) - case 20: // (2018-01-01T11-32-11.*) - c.add(Calendar.SECOND, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - - default: - break; - } - - if (upperEnd == null) { - return null; - } - return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd); - - } - - private static List collectValues(Filter filter) { - List values = new ArrayList(); - if (filter.getFiltervalue() != null) { - values.add(filter.getFiltervalue()); - } - if (filter.getFiltervalues() != null) { - values.addAll(filter.getFiltervalues()); - } - return values; - } - - private static QueryBuilder fromFilter(@Nullable List filters, String prefix) { - if (filters == null || filters.size() == 0) { - return QueryBuilders.matchAllQuery(); - - } else if (filters.size() == 1) { - String property = filters.get(0).getProperty(); - List values = collectValues(filters.get(0)); - if ("id".equals(property)) { - property = "_id"; - } - if (values.size() == 1) { - return getSinglePropertyQuery(property, values.get(0), prefix); - } else { - BoolQueryBuilder bquery = new BoolQueryBuilder(); - for (String v : values) { - bquery.should(getSinglePropertyQuery(property, v, prefix)); - } - return bquery; - - } - } else { - BoolQueryBuilder query = new BoolQueryBuilder(); - for (Filter fi : filters) { - String p = fi.getProperty(); - List values = collectValues(fi); - if ("id".equals(p)) { - p = "_id"; - } - if (values.size() == 1) { - query.must(getSinglePropertyQuery(p, values.get(0), prefix)); - } else { - BoolQueryBuilder tmpQuery = QueryBuilders.boolQuery(); - for (String v : values) { - tmpQuery.should(getSinglePropertyQuery(p, v, prefix)); - } - query.must(tmpQuery); - tmpQuery = QueryBuilders.boolQuery(); - } - } - LOG.trace("Query result. {}", query.toJSON()); - return query; - } - } - - private static QueryBuilder getSinglePropertyQuery(String p, String v, String prefix) { - QueryBuilder query = null; - if (DbFilter.hasSearchParams(v)) { - if (p != null && timestampValueNames.contains(p.toLowerCase())) { - query = fromTimestampSearchFilter(p, v); - if (query == null) { - query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)); - } - } else { - query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)); - } - } else if (DbFilter.isComparisonValid(v)) { - query = DbFilter.getRangeQuery(handlePrefix(prefix, p), v); - if (query == null) { - query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v); - } - } else { - query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v); - } - return query; - } - - private static String handlePrefix(String prefix, String p) { - return (prefix != null ? prefix : "") + p; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java deleted file mode 100644 index b76e0a872..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper; - -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; -import org.eclipse.jdt.annotation.Nullable; -import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorPm; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Sortorder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class QueryByFilterStatic { - - private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); - private static final List timestampValueNames = Arrays.asList("timestamp", "start", "end"); - - private QueryByFilterStatic() { - //Hide - } - - static long getPage(EntityInput input) { - return getPage(input, 1); - } - - private static long getPage(EntityInput input, long defaultValue) { - return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue; - } - - static long getPageSize(EntityInput input) { - return getPageSize(input, 1); - } - - private static long getPageSize(EntityInput input, long defaultValue) { - return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue; - } - - - public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder) { - return setSortOrder(query, sortorder, ""); - } - - private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder, String prefix) { - if (sortorder != null && sortorder.size() > 0) { - for (Sortorder so : sortorder) { - query.sort((prefix != null ? prefix : "") + so.getProperty(), - so.getSortorder() == SortOrder.Ascending - ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING - : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING); - } - } - return query; - - } - - - public static Sortorder getSortOrder(@Nullable List list, String prop) { - if (list == null) { - return null; - } - for (Sortorder o : list) { - if (prop.equals(o.getProperty())) { - return o; - } - } - return null; - } - - public static Filter getFilter(@Nullable List list, String prop) { - if (list == null) { - return null; - } - for (Filter f : list) { - if (prop.equals(f.getProperty())) { - return f; - } - } - return null; - } - - public static QueryBuilder fromFilter(@Nullable List filters) { - return fromFilter(filters, ""); - } - - private static String fillTimeStamp(String value) { - int idx = value.lastIndexOf("*"); - final String REPLACE = "0000-00-00T00:00:00.0Z"; - String s = value.substring(0, idx) + REPLACE.substring(idx); - if (Integer.parseInt(s.substring(5, 7)) == 0) { - s = s.substring(0, 5) + "01-" + s.substring(8); - } - if (Integer.parseInt(s.substring(8, 10)) == 0) { - s = s.substring(0, 8) + "01" + s.substring(10); - } - - return s; - } - - /** - * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte: - * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z - * - * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01 - * - */ - private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) { - if (!value.endsWith("*")) { - return null; - } - int idx = value.lastIndexOf("*"); - String lowerEnd = fillTimeStamp(value); - String upperEnd = null; - NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter(); - Date dt = null; - try { - dt = converter.getDateFromNetconf(lowerEnd); - } catch (Exception e) { - - } - if (dt == null) { - return null; - } - // property.substring(0,idx)+REPLACE.substring(idx+1); - Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - c.setTime(dt); - int tmpvalue; - switch (idx) { - case 1: // (2*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 2: // (20*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 3: // (200*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 4: // (2000*) - case 5: // (2000-*) - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 6: //switch 10 months (2000-0* or 2000-1*) - tmpvalue = c.get(Calendar.MONTH); - if (tmpvalue < 9) { - c.set(Calendar.MONTH, 9); - } else { - c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); - c.set(Calendar.MONTH, 0); - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - - break; - case 7: //switch one month (2018-01* or 2018-01-*) - case 8: - c.add(Calendar.MONTH, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 9: // (2018-01-0*) - tmpvalue = c.get(Calendar.DAY_OF_MONTH); - if (tmpvalue == 1) { - c.set(Calendar.DAY_OF_MONTH, 10); - } else if (tmpvalue == 10) { - c.set(Calendar.DAY_OF_MONTH, 20); - } else if (tmpvalue == 20) { - if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) { - c.set(Calendar.DAY_OF_MONTH, 1); - c.add(Calendar.MONTH, 1); - } else { - c.set(Calendar.DAY_OF_MONTH, 30); - } - } else if (tmpvalue == 30) { - c.set(Calendar.DAY_OF_MONTH, 1); - c.add(Calendar.MONTH, 1); - } else { - break; - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 10: // (2018-01-01*) - case 11: // (2018-01-01T*) - c.add(Calendar.DAY_OF_MONTH, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 12: // (2018-01-01T1*) - tmpvalue = c.get(Calendar.HOUR_OF_DAY); - if (tmpvalue == 20) { - c.set(Calendar.HOUR_OF_DAY, 0); - c.add(Calendar.DAY_OF_MONTH, 1); - } else { - c.add(Calendar.HOUR_OF_DAY, 10); - } - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 13: // (2018-01-01T11*) - case 14: // (2018-01-01T11-*) - c.add(Calendar.HOUR_OF_DAY, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 15: // (2018-01-01T11-3*) - c.add(Calendar.MINUTE, 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 16: // (2018-01-01T11-32*) - case 17: // (2018-01-01T11-32-*) - c.add(Calendar.MINUTE, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 18: // (2018-01-01T11-32-1*) - c.add(Calendar.SECOND, 10); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - case 19: // (2018-01-01T11-32-11*) - case 20: // (2018-01-01T11-32-11.*) - c.add(Calendar.SECOND, 1); - upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); - break; - - default: - break; - } - - if (upperEnd == null) { - return null; - } - return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd); - - } - - private static QueryBuilder fromFilter(@Nullable List filters, String prefix) { - if (filters == null || filters.size() == 0) { - return QueryBuilders.matchAllQuery(); - - } else if (filters.size() == 1) { - QueryBuilder query; - String p = filters.get(0).getProperty(); - String v = filters.get(0).getFiltervalue(); - if ("id".equals(p)) { - p = "_id"; - } else { - // v=v.toLowerCase(); - } - if (DbFilter.hasSearchParams(v)) { - if (p != null && timestampValueNames.contains(p.toLowerCase())) { - query = fromTimestampSearchFilter(p, v); - if (query != null) { - return query; - } - } - return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v)); - - - } else if (DbFilter.isComparisonValid(v)) { - RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v); - if (q != null) { - return q; - } else { - return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v); - } - } else { - return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v); - } - } else { - BoolQueryBuilder query = new BoolQueryBuilder(); - QueryBuilder tmpQuery; - for (Filter fi : filters) { - String p = fi.getProperty(); - String v = fi.getFiltervalue(); - if ("id".equals(p)) { - p = "_id"; - } else { - // v=v.toLowerCase(); - } - if (DbFilter.hasSearchParams(v)) { - if (p != null && timestampValueNames.contains(p.toLowerCase())) { - tmpQuery = fromTimestampSearchFilter(p, v); - if (tmpQuery != null) { - query.must(tmpQuery); - } else { - query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p, - DbFilter.createDatabaseRegex(v))); - } - } else { - query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p, - DbFilter.createDatabaseRegex(v))); - } - } else if (DbFilter.isComparisonValid(v)) { - RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v); - if (q != null) { - query.must(q); - } else { - query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v)); - } - } else { - query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v)); - } - } - LOG.trace("Query result. {}", query.toJSON()); - return query; - } - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java deleted file mode 100644 index 6e653baf2..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper; - -import java.math.BigInteger; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PaginationOutputG; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.PaginationBuilder; - -public class QueryResult { - - private SearchResult result; - private PaginationOutputG pagination; - - public QueryResult(long page, long pageSize, SearchResult result) { - this.result = result; - - PaginationBuilder x = new PaginationBuilder(); - x.setPage(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(page))); - x.setSize(YangHelper2.getLongOrUint32(pageSize)); - x.setTotal(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(result.getTotal()))); - pagination = x.build(); - } - - public QueryResult(QueryByFilter queryByFilter, SearchResult result) { - this.result = result; - - PaginationBuilder x = new PaginationBuilder(); - x.setPage(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(queryByFilter.getPage()))); - x.setSize(YangHelper2.getLongOrUint32(queryByFilter.getPageSize())); - x.setTotal(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(result.getTotal()))); - pagination = x.build(); - } - - - public SearchResult getResult() { - return result; - } - - public PaginationOutputG getPagination() { - return pagination; - } - - @Override - public String toString() { - return "QueryResult [result=" + result + ", pagination=" + pagination + "]"; - } - - - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java deleted file mode 100644 index 153022b4c..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.database; - -import com.fasterxml.jackson.core.JsonProcessingException; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.List; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.eclipse.jdt.annotation.NonNull; -import org.onap.ccsdk.features.sdnr.wt.common.database.DatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; -import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; -import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper2; -import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; -import org.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Class to rw yang-tool generated objects into elasticsearch database. For "ES _id" exchange the esIdAddAtributteName - * is used. This attribute mast be of type String and contains for read and write operations the object id. The function - * can be used without id handling. If id handling is required the parameter needs to be specified by class definition - * in yang and setting the name by using setAttributeName() - * - * Due to using Jackson base interfaces the org.eclipse.jdt.annotation.NonNull needs to be used here to get rid of - * warnings - * - * @param Yang tools generated class object. - */ -public class EsDataObjectReaderWriter2 { - - private final Logger LOG = LoggerFactory.getLogger(EsDataObjectReaderWriter2.class); - - /** Typename for elastic search data schema **/ - private String dataTypeName; - - /** Elasticsearch Database client to be used **/ - private DatabaseClient db; - - /** Mapper with configuration to use opendaylight yang-tools builder pattern for object creation **/ - private YangToolsMapper2 yangtoolsMapper; - - /** Class of T as attribute to allow JSON to Class object mapping **/ - private Class clazz; - - /** Field is used to write id. If null no id handling **/ - private @Nullable Field field; - - /** Attribute that is used as id field for the database object **/ - private @Nullable String esIdAddAtributteName; - - /** Interface to be used for write operations. Rule for write: T extends S and **/ - private Class writeInterfaceClazz; // == "S" - /** Flag true to sync this attribute during write always, what is slow and false do not sync */ - private final boolean syncAfterWrite; - - /** - * Elasticsearch database read and write for specific class, defined by opendaylight yang-tools. - * - * @param - * @param - * @param db Database access client - * @param dataTypeName typename in database schema - * @param clazz class of type to be handled - * @param builderClazz class to build related object if builder pattern should be used. - * @param syncAfterWrite - * @throws ClassNotFoundException - */ - public > EsDataObjectReaderWriter2(DatabaseClient db, - String dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz, boolean syncAfterWrite) - throws ClassNotFoundException { - LOG.info("Create {} for datatype {} class {}", this.getClass().getName(), dataTypeName, clazz.getName()); - - this.esIdAddAtributteName = null; - this.field = null; - this.writeInterfaceClazz = clazz; - this.db = db; - this.dataTypeName = dataTypeName; - this.yangtoolsMapper = new YangToolsMapper2<>(clazz, builderClazz); - this.clazz = clazz; - this.syncAfterWrite = syncAfterWrite; - } - - public > EsDataObjectReaderWriter2(DatabaseClient db, - Entity dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz) - throws ClassNotFoundException { - this(db, dataTypeName.getName(), clazz, builderClazz, false); - } - - public > EsDataObjectReaderWriter2(DatabaseClient db, - Entity dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz, boolean syncAfterWrite) - throws ClassNotFoundException { - this(db, dataTypeName.getName(), clazz, builderClazz, syncAfterWrite); - } - - public EsDataObjectReaderWriter2(DatabaseClient db, Entity dataTypeName, @Nonnull Class clazz, - boolean syncAfterWrite) throws ClassNotFoundException { - this(db, dataTypeName.getName(), clazz, null, syncAfterWrite); - } - - public EsDataObjectReaderWriter2(DatabaseClient db, Entity dataTypeName, Class clazz) - throws ClassNotFoundException { - this(db, dataTypeName.getName(), clazz, null, false); - } - - /** - * Get Datatype name - * - * @return string with dataTypeName - */ - public String getDataTypeName() { - return dataTypeName; - } - - /** - * Simlar to {@link #setEsIdAttributeName()}, but adapts the parameter to yangtools attribute naming schema - * - * @param esIdAttributeName is converted to UnderscoreCamelCase - * @return this for further operations. - */ - public EsDataObjectReaderWriter2 setEsIdAttributeNameCamelized(String esIdAttributeName) { - return setEsIdAttributeName(YangToolsMapperHelper.toCamelCaseAttributeName(esIdAttributeName)); - } - - /** - * Attribute name of class that is containing the object id - * - * @param esIdAttributeName of the implementation class for the yangtools interface. Expected attribute name format - * is CamelCase with leading underline. @ - * @return this for further operations. - * @throws SecurityException if no access or IllegalArgumentException if wrong type or no attribute with this name. - */ - public EsDataObjectReaderWriter2 setEsIdAttributeName(String esIdAttributeName) { - LOG.debug("Set attribute '{}'", esIdAttributeName); - this.esIdAddAtributteName = null; // Reset status - this.field = null; - - Field attributeField; - try { - Builder builder = yangtoolsMapper.getBuilder(clazz); - if (builder == null) { - String msg = "No builder for " + clazz; - LOG.debug(msg); - throw new IllegalArgumentException(msg); - } else { - T object = builder.build(); - attributeField = object.getClass().getDeclaredField(esIdAttributeName); - if (attributeField.getType().equals(String.class)) { - attributeField.setAccessible(true); - this.esIdAddAtributteName = esIdAttributeName; // Set new status if everything OK - this.field = attributeField; - } else { - String msg = "Wrong field type " + attributeField.getType().getName() + " of " + esIdAttributeName; - LOG.debug(msg); - throw new IllegalArgumentException(msg); - } - } - } catch (NoSuchFieldException e) { - // Convert to run-time exception - String msg = "NoSuchFieldException for '" + esIdAttributeName + "' in class " + clazz.getName(); - LOG.debug(msg); - throw new IllegalArgumentException(msg); - } catch (SecurityException e) { - LOG.debug("Access problem " + esIdAttributeName, e); - throw e; - } - return this; - } - - /** - * Specify subclass of T for write operations. - * - * @param writeInterfaceClazz - */ - public EsDataObjectReaderWriter2 setWriteInterface(@Nonnull Class writeInterfaceClazz) { - LOG.debug("Set write interface to {}", writeInterfaceClazz); - if (writeInterfaceClazz == null) { - throw new IllegalArgumentException("Null not allowed here."); - } - - this.writeInterfaceClazz = writeInterfaceClazz; - return this; - } - - public interface IdGetter { - String getId(S object); - } - - public void write(List objectList, IdGetter idGetter) { - for (S object : objectList) { - write(object, idGetter.getId(object)); - } - } - - /** - * Write child object to database with specific id - * - * @param object to be written - * @param esId use the id or if null generate unique id - * @return String with id or null - */ - public @Nullable String write(S object, @Nullable String esId) { - if (object != null && writeInterfaceClazz.isInstance(object)) { - try { - String json = yangtoolsMapper.writeValueAsString(object); - return db.doWriteRaw(dataTypeName, esId, json, this.syncAfterWrite); - } catch (JsonProcessingException e) { - LOG.error("Write problem: ", e); - } - } else { - LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", - writeInterfaceClazz.getName()); - } - return null; - } - - /** - * Update partial child object to database with match/term query - * - * @param of object - * @param object to write - * @param query for write of specific attributes - * @return json string with new Object - */ - public @Nullable boolean update(S object, QueryBuilder query) { - if (object != null && writeInterfaceClazz.isInstance(object)) { - try { - String json = yangtoolsMapper.writeValueAsString(object); - return db.doUpdate(this.dataTypeName, json, query); - } catch (JsonProcessingException e) { - LOG.error("Update problem: ", e); - } - } else { - LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", - writeInterfaceClazz.getName()); - } - return false; - } - - /** - * Write/ update partial child object to database with specific id Write if not exists, else update - * - * @param object - * @param esId - * @return String with esId or null - */ - public @Nullable String update(S object, String esId) { - return this.updateOrCreate(object, esId, null); - } - - /** - * See {@link doUpdateOrCreate(String dataTypeName, String esId, String json, List doNotUpdateField) } - */ - public @Nullable String updateOrCreate(S object, String esId, List onlyForInsert) { - if (object != null && writeInterfaceClazz.isInstance(object)) { - try { - String json = yangtoolsMapper.writeValueAsString(object); - return db.doUpdateOrCreate(dataTypeName, esId, json, onlyForInsert); - } catch (JsonProcessingException e) { - LOG.error("Update problem: ", e); - } - } else { - LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", - writeInterfaceClazz.getName()); - } - return null; - } - - /** - * Read object from database, by using the id field - * - * @param object - * @return - */ - public @Nullable T read(String esId) { - @Nullable - T res = null; - if (esId != null) { - String json = db.doReadJsonData(dataTypeName, esId); - if (json != null) { - try { - res = yangtoolsMapper.readValue(json.getBytes(), clazz); - } catch (IOException e) { - LOG.error("Problem: ", e); - } - } else { - LOG.debug("Can not read from DB id {} type {}", esId, dataTypeName); - } - } - return res; - } - - /** - * Remove object - * - * @param esId to identify the object. - * @return success - */ - public boolean remove(String esId) { - return db.doRemove(this.dataTypeName, esId); - } - - public int remove(QueryBuilder query) { - return this.db.doRemove(this.dataTypeName, query); - } - - /** - * Get all elements of related type - * - * @return all Elements - */ - public SearchResult doReadAll() { - return doReadAll(null); - } - - public SearchResult doReadAll(QueryBuilder query) { - return this.doReadAll(query, false); - } - - /** - * Read all existing objects of a type - * - * @param query for the elements - * @return the list of all objects - */ - - public SearchResult doReadAll(QueryBuilder query, boolean ignoreException) { - - SearchResult res = new SearchResult(); - - SearchResult result; - List hits; - if (query != null) { - LOG.debug("read data in {} with query {}", dataTypeName, query.toJSON()); - result = db.doReadByQueryJsonData(dataTypeName, query, ignoreException); - } else { - result = db.doReadAllJsonData(dataTypeName, ignoreException); - } - hits = result.getHits(); - LOG.debug("Read: {} elements: {}", dataTypeName, hits.size()); - - T object; - for (SearchHit hit : hits) { - object = getT(hit.getSourceAsString()); - LOG.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n", hit.getId(), - hit.getSourceAsString(), object); - if (object != null) { - setEsId(object, hit.getId()); - res.add(object); - } else { - LOG.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); - } - } - res.setTotal(result.getTotal()); - return res; - } - - /* --------------------------------------------- - * Private functions - */ - - private void setEsId(T object, String esId) { - if (field != null) { - try { - field.set(object, esId); - } catch (IllegalArgumentException | IllegalAccessException e) { - LOG.debug("Field set problem.", e); - } - } - } - - private @Nullable T getT(String jsonString) { - try { - return yangtoolsMapper.readValue(jsonString, clazz); - } catch (IOException e) { - LOG.info("Mapping problem {}:", clazz.getName(), e); - return null; - } - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java new file mode 100644 index 000000000..c428b67d3 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java @@ -0,0 +1,224 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EsConfig implements Configuration, IEsConfig { + + private static final Logger LOG = LoggerFactory.getLogger(EsConfig.class); + + public static final String SECTION_MARKER_ES = "es"; + + private static final String PROPERTY_KEY_DBHOSTS = "esHosts"; + private static final String PROPERTY_KEY_TRUSTALLCERTS = "esTrustAllCerts"; + private static final String PROPERTY_KEY_ARCHIVE_LIMIT = "esArchiveLifetimeSeconds"; + private static final String PROPERTY_KEY_CLUSTER = "esCluster"; + private static final String PROPERTY_KEY_ARCHIVE_INTERVAL = "esArchiveCheckIntervalSeconds"; + private static final String PROPERTY_KEY_NODE = "esNode"; + private static final String PROPERTY_KEY_AUTH_USERNAME = "esAuthUsername"; + private static final String PROPERTY_KEY_AUTH_PASSWORD = "esAuthPassword"; + private static final String PROPERTY_KEY_FULLSIZE = "esFullsize"; + + + private static String defaultHostinfo = "${SDNRDBURL}"; + private static final String DEFAULT_VALUE_CLUSTER = ""; + /** check db data in this interval [in seconds] 0 deactivated */ + private static final String DEFAULT_ARCHIVE_INTERVAL_SEC = "0"; + /** keep data for this time [in seconds] 30 days */ + private static final String DEFAULT_ARCHIVE_LIMIT_SEC = String.valueOf(60L * 60L * 24L * 30L); + private static final String DEFAULT_VALUE_NODE = "elasticsearchnode"; + private static final String DEFAULT_VALUE_DBUSERNAME = "${SDNRDBUSERNAME}"; + private static final String DEFAULT_VALUE_DBPASSWORD = "${SDNRDBPASSWORD}"; + private static final String DEFAULT_VALUE_TRUSTALLCERTS = "${SDNRDBTRUSTALLCERTS}"; + private static final String DEFAULT_VALUE_FULLSIZE = "${SDNRDBFULLSIZEREQUESTS}"; + + private final ConfigurationFileRepresentation configuration; + + public EsConfig(ConfigurationFileRepresentation configuration) { + + this.configuration = configuration; + this.configuration.addSection(SECTION_MARKER_ES); + defaults(); + } + + /* + * Setter + */ + + public void setNode(String nodeName) { + configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_NODE, nodeName); + } + + /* + * Getter + */ + + public String getNode() { + return configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_NODE); + } + + public HostInfo[] getHosts() { + String dbHosts = configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS); + return parseHosts(dbHosts); + } + + public void setHosts(HostInfo[] hosts) { + this.configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS, printHosts(hosts)); + } + + @Override + public String getCluster() { + return configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL); + } + + public void setCluster(String cluster) { + configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_CLUSTER, cluster); + } + + public boolean hasBasicAuthCredentials() { + return this.getBasicAuthUsername() != null && this.getBasicAuthPassword() != null + && !this.getBasicAuthUsername().isEmpty() && !this.getBasicAuthPassword().isEmpty(); + } + + public String getBasicAuthUsername() { + return this.configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_USERNAME); + } + + public String getBasicAuthPassword() { + return this.configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_PASSWORD); + } + + @Override + public long getArchiveCheckIntervalSeconds() { + return configuration.getPropertyLong(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL).orElse(0L); + } + + public boolean trustAllCerts() { + return configuration.getPropertyBoolean(SECTION_MARKER_ES, PROPERTY_KEY_TRUSTALLCERTS); + } + + public void setArchiveCheckIntervalSeconds(long seconds) { + configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL, seconds); + } + + @Override + public long getArchiveLifetimeSeconds() { + return configuration.getPropertyLong(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT).orElse(0L); + } + + public void setArchiveLimit(long seconds) { + configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT, seconds); + } + + @Override + public String getSectionName() { + return SECTION_MARKER_ES; + } + + @Override + public synchronized void defaults() { + // Add default if not available + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS, defaultHostinfo); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT, + DEFAULT_ARCHIVE_LIMIT_SEC); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_CLUSTER, DEFAULT_VALUE_CLUSTER); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL, + DEFAULT_ARCHIVE_INTERVAL_SEC); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_NODE, DEFAULT_VALUE_NODE); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_USERNAME, + DEFAULT_VALUE_DBUSERNAME); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_PASSWORD, + DEFAULT_VALUE_DBPASSWORD); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_TRUSTALLCERTS, + DEFAULT_VALUE_TRUSTALLCERTS); + configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_FULLSIZE, + DEFAULT_VALUE_FULLSIZE); + + } + + @Override + public void unregisterConfigChangedListener(IConfigChangedListener archiveCleanService) { + configuration.unregisterConfigChangedListener(archiveCleanService); + } + + @Override + public void registerConfigChangedListener(IConfigChangedListener archiveCleanService) { + configuration.registerConfigChangedListener(archiveCleanService); + } + + /** @TODO Shift to own class **/ + private static String printHosts(HostInfo[] h) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < h.length; i++) { + sb.append(h[i].toUrl()); + if (i != h.length - 1) { + sb.append(","); + } + } + return sb.toString(); + } + + /** @TODO Shift to own class **/ + private static HostInfo[] parseHosts(String string) { + List infos = new ArrayList<>(); + String[] list = string.split(","); + if (list.length > 0) { + for (String item : list) { + try { + URL url = new URL(item); + infos.add(new HostInfo(url.getHost(), url.getPort(), Protocol.getValueOf(url.getProtocol()))); + } catch (MalformedURLException e) { + LOG.warn("problem parsing url {} : {}", item, e.getMessage()); + } + } + } + HostInfo[] a = new HostInfo[infos.size()]; + return infos.toArray(a); + } + + @Override + public String toString() { + return "EsConfig [getNode()=" + getNode() + ", getHosts()=" + Arrays.toString(getHosts()) + ", getCluster()=" + + getCluster() + ", getArchiveCheckIntervalSeconds()=" + getArchiveCheckIntervalSeconds() + + ", getArchiveLifetimeSeconds()=" + getArchiveLifetimeSeconds() + ", getSectionName()=" + + getSectionName() + "]"; + } + + @Override + public boolean doFullsizeRequests() { + return configuration.getPropertyBoolean(SECTION_MARKER_ES, PROPERTY_KEY_FULLSIZE); + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java new file mode 100644 index 000000000..a86ecdde1 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java @@ -0,0 +1,413 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.common.database.DatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper2; +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Class to rw yang-tool generated objects into elasticsearch database. For "ES _id" exchange the esIdAddAtributteName + * is used. This attribute mast be of type String and contains for read and write operations the object id. The function + * can be used without id handling. If id handling is required the parameter needs to be specified by class definition + * in yang and setting the name by using setAttributeName() + * + * Due to using Jackson base interfaces the org.eclipse.jdt.annotation.NonNull needs to be used here to get rid of + * warnings + * + * @param Yang tools generated class object. + */ +public class EsDataObjectReaderWriter2 { + + private final Logger LOG = LoggerFactory.getLogger(EsDataObjectReaderWriter2.class); + + /** Typename for elastic search data schema **/ + private String dataTypeName; + + /** Elasticsearch Database client to be used **/ + private DatabaseClient db; + + /** Mapper with configuration to use opendaylight yang-tools builder pattern for object creation **/ + private YangToolsMapper2 yangtoolsMapper; + + /** Class of T as attribute to allow JSON to Class object mapping **/ + private Class clazz; + + /** Field is used to write id. If null no id handling **/ + private @Nullable Field field; + + /** Attribute that is used as id field for the database object **/ + private @Nullable String esIdAddAtributteName; + + /** Interface to be used for write operations. Rule for write: T extends S and **/ + private Class writeInterfaceClazz; // == "S" + /** Flag true to sync this attribute during write always, what is slow and false do not sync */ + private final boolean syncAfterWrite; + + protected boolean doFullsizeRequest; + + /** + * Elasticsearch database read and write for specific class, defined by opendaylight yang-tools. + * + * @param + * @param + * @param db Database access client + * @param dataTypeName typename in database schema + * @param clazz class of type to be handled + * @param builderClazz class to build related object if builder pattern should be used. + * @param syncAfterWrite + * @throws ClassNotFoundException + */ + public > EsDataObjectReaderWriter2(DatabaseClient db, + String dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz, boolean syncAfterWrite) + throws ClassNotFoundException { + LOG.info("Create {} for datatype {} class {}", this.getClass().getName(), dataTypeName, clazz.getName()); + + this.esIdAddAtributteName = null; + this.field = null; + this.writeInterfaceClazz = clazz; + this.db = db; + this.dataTypeName = dataTypeName; + this.yangtoolsMapper = new YangToolsMapper2<>(clazz, builderClazz); + this.clazz = clazz; + this.syncAfterWrite = syncAfterWrite; + this.doFullsizeRequest = false; + } + + public void setFullsizeRequest(boolean fullsizeRequest) { + this.doFullsizeRequest = fullsizeRequest; + } + public > EsDataObjectReaderWriter2(DatabaseClient db, + Entity dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz) + throws ClassNotFoundException { + this(db, dataTypeName.getName(), clazz, builderClazz, false); + } + + public > EsDataObjectReaderWriter2(DatabaseClient db, + Entity dataTypeName, @Nonnull Class clazz, @Nullable Class builderClazz, boolean syncAfterWrite) + throws ClassNotFoundException { + this(db, dataTypeName.getName(), clazz, builderClazz, syncAfterWrite); + } + + public EsDataObjectReaderWriter2(DatabaseClient db, Entity dataTypeName, @Nonnull Class clazz, + boolean syncAfterWrite) throws ClassNotFoundException { + this(db, dataTypeName.getName(), clazz, null, syncAfterWrite); + } + + public EsDataObjectReaderWriter2(DatabaseClient db, Entity dataTypeName, Class clazz) + throws ClassNotFoundException { + this(db, dataTypeName.getName(), clazz, null, false); + } + + /** + * Get Datatype name + * + * @return string with dataTypeName + */ + public String getDataTypeName() { + return dataTypeName; + } + + /** + * Simlar to {@link #setEsIdAttributeName()}, but adapts the parameter to yangtools attribute naming schema + * + * @param esIdAttributeName is converted to UnderscoreCamelCase + * @return this for further operations. + */ + public EsDataObjectReaderWriter2 setEsIdAttributeNameCamelized(String esIdAttributeName) { + return setEsIdAttributeName(YangToolsMapperHelper.toCamelCaseAttributeName(esIdAttributeName)); + } + + /** + * Attribute name of class that is containing the object id + * + * @param esIdAttributeName of the implementation class for the yangtools interface. Expected attribute name format + * is CamelCase with leading underline. @ + * @return this for further operations. + * @throws SecurityException if no access or IllegalArgumentException if wrong type or no attribute with this name. + */ + public EsDataObjectReaderWriter2 setEsIdAttributeName(String esIdAttributeName) { + LOG.debug("Set attribute '{}'", esIdAttributeName); + this.esIdAddAtributteName = null; // Reset status + this.field = null; + + Field attributeField; + try { + Builder builder = yangtoolsMapper.getBuilder(clazz); + if (builder == null) { + String msg = "No builder for " + clazz; + LOG.debug(msg); + throw new IllegalArgumentException(msg); + } else { + T object = builder.build(); + attributeField = object.getClass().getDeclaredField(esIdAttributeName); + if (attributeField.getType().equals(String.class)) { + attributeField.setAccessible(true); + this.esIdAddAtributteName = esIdAttributeName; // Set new status if everything OK + this.field = attributeField; + } else { + String msg = "Wrong field type " + attributeField.getType().getName() + " of " + esIdAttributeName; + LOG.debug(msg); + throw new IllegalArgumentException(msg); + } + } + } catch (NoSuchFieldException e) { + // Convert to run-time exception + String msg = "NoSuchFieldException for '" + esIdAttributeName + "' in class " + clazz.getName(); + LOG.debug(msg); + throw new IllegalArgumentException(msg); + } catch (SecurityException e) { + LOG.debug("Access problem " + esIdAttributeName, e); + throw e; + } + return this; + } + + /** + * Specify subclass of T for write operations. + * + * @param writeInterfaceClazz + */ + public EsDataObjectReaderWriter2 setWriteInterface(@Nonnull Class writeInterfaceClazz) { + LOG.debug("Set write interface to {}", writeInterfaceClazz); + if (writeInterfaceClazz == null) { + throw new IllegalArgumentException("Null not allowed here."); + } + + this.writeInterfaceClazz = writeInterfaceClazz; + return this; + } + + public interface IdGetter { + String getId(S object); + } + + public void write(List objectList, IdGetter idGetter) { + for (S object : objectList) { + write(object, idGetter.getId(object)); + } + } + + /** + * Write child object to database with specific id + * + * @param object to be written + * @param esId use the id or if null generate unique id + * @return String with id or null + */ + public @Nullable String write(S object, @Nullable String esId) { + if (object != null && writeInterfaceClazz.isInstance(object)) { + try { + String json = yangtoolsMapper.writeValueAsString(object); + return db.doWriteRaw(dataTypeName, esId, json, this.syncAfterWrite); + } catch (JsonProcessingException e) { + LOG.error("Write problem: ", e); + } + } else { + LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", + writeInterfaceClazz.getName()); + } + return null; + } + + /** + * Update partial child object to database with match/term query + * + * @param of object + * @param object to write + * @param query for write of specific attributes + * @return json string with new Object + */ + public @Nullable boolean update(S object, QueryBuilder query) { + if (object != null && writeInterfaceClazz.isInstance(object)) { + try { + String json = yangtoolsMapper.writeValueAsString(object); + return db.doUpdate(this.dataTypeName, json, query); + } catch (JsonProcessingException e) { + LOG.error("Update problem: ", e); + } + } else { + LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", + writeInterfaceClazz.getName()); + } + return false; + } + + /** + * Write/ update partial child object to database with specific id Write if not exists, else update + * + * @param object + * @param esId + * @return String with esId or null + */ + public @Nullable String update(S object, String esId) { + return this.updateOrCreate(object, esId, null); + } + + /** + * See {@link doUpdateOrCreate(String dataTypeName, String esId, String json, List doNotUpdateField) } + */ + public @Nullable String updateOrCreate(S object, String esId, List onlyForInsert) { + if (object != null && writeInterfaceClazz.isInstance(object)) { + try { + String json = yangtoolsMapper.writeValueAsString(object); + return db.doUpdateOrCreate(dataTypeName, esId, json, onlyForInsert); + } catch (JsonProcessingException e) { + LOG.error("Update problem: ", e); + } + } else { + LOG.error("Type {} does not provide interface {}", object != null ? object.getClass().getName() : "null", + writeInterfaceClazz.getName()); + } + return null; + } + + /** + * Read object from database, by using the id field + * + * @param object + * @return + */ + public @Nullable T read(String esId) { + @Nullable + T res = null; + if (esId != null) { + String json = db.doReadJsonData(dataTypeName, esId); + if (json != null) { + try { + res = yangtoolsMapper.readValue(json.getBytes(), clazz); + } catch (IOException e) { + LOG.error("Problem: ", e); + } + } else { + LOG.debug("Can not read from DB id {} type {}", esId, dataTypeName); + } + } + return res; + } + + /** + * Remove object + * + * @param esId to identify the object. + * @return success + */ + public boolean remove(String esId) { + return db.doRemove(this.dataTypeName, esId); + } + + public int remove(QueryBuilder query) { + return this.db.doRemove(this.dataTypeName, query); + } + + /** + * Get all elements of related type + * + * @return all Elements + */ + public SearchResult doReadAll() { + return doReadAll(null); + } + + public SearchResult doReadAll(QueryBuilder query) { + return this.doReadAll(query, false); + } + + /** + * Read all existing objects of a type + * + * @param query for the elements + * @return the list of all objects + */ + + public SearchResult doReadAll(QueryBuilder query, boolean ignoreException) { + + if(this.doFullsizeRequest) { + query.doFullsizeRequest(); + } + SearchResult res = new SearchResult(); + SearchResult result; + List hits; + if (query != null) { + LOG.debug("read data in {} with query {}", dataTypeName, query.toJSON()); + result = db.doReadByQueryJsonData(dataTypeName, query, ignoreException); + } else { + result = db.doReadAllJsonData(dataTypeName, ignoreException); + } + hits = result.getHits(); + LOG.debug("Read: {} elements: {}", dataTypeName, hits.size()); + + T object; + for (SearchHit hit : hits) { + object = getT(hit.getSourceAsString()); + LOG.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n", hit.getId(), + hit.getSourceAsString(), object); + if (object != null) { + setEsId(object, hit.getId()); + res.add(object); + } else { + LOG.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); + } + } + res.setTotal(result.getTotal()); + return res; + } + + /* --------------------------------------------- + * Private functions + */ + + private void setEsId(T object, String esId) { + if (field != null) { + try { + field.set(object, esId); + } catch (IllegalArgumentException | IllegalAccessException e) { + LOG.debug("Field set problem.", e); + } + } + } + + private @Nullable T getT(String jsonString) { + try { + return yangtoolsMapper.readValue(jsonString, clazz); + } catch (IOException e) { + LOG.info("Mapping problem {}:", clazz.getName(), e); + return null; + } + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java new file mode 100644 index 000000000..ec467eab1 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java @@ -0,0 +1,60 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor; + +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsDataObjectReaderWriter2; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryResult; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataObjectAcessor extends EsDataObjectReaderWriter2 { + + private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessor.class); + + DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class clazz, boolean doFullsizeRequest) + throws ClassNotFoundException { + super(dbClient, entity, clazz); + this.setFullsizeRequest(doFullsizeRequest); + LOG.info("Create {}", this.getClass().getName()); + } + + public QueryResult getData(EntityInput input) { + + QueryByFilter queryByFilter = new QueryByFilter(input); + QueryBuilder queryBuilder = queryByFilter.getQueryBuilderByFilter(); + // Exception handling during user input for invalid filter input. + // This wrong filter by user is allowed an results into empty data. + boolean ignoreException = queryBuilder.contains("range"); + + LOG.debug("Request: {} filter {} ignoreException{}:", this.getDataTypeName(), queryByFilter, ignoreException); + + SearchResult result = doReadAll(queryBuilder, ignoreException); + return new QueryResult<>(queryByFilter, result); + } +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java new file mode 100644 index 000000000..04849004f --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java @@ -0,0 +1,131 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor; + +import java.io.IOException; +import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryResult; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataObjectAcessorPm extends DataObjectAcessor { + + private final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); + + private static final String UUID_KEY = "uuid-interface"; + private static final String NODE_KEY = "node-name"; + private static final String KEY = "node-name"; + + + public enum Intervall { + PMDATA15M("historicalperformance15min", "historicalperformance15min"), PMDATA24H("historicalperformance24h", + "historicalperformance24h"); + + String index; + String type; + + Intervall(String index, String type) { + this.index = index; + this.type = type; + } + + public String getIndex() { + return index; + } + + public String getType() { + return type; + } + } + + private ExtRestClient dbClient; + private Intervall mode; + + public DataObjectAcessorPm(HtDatabaseClient dbClient, Intervall mode, Entity entity, Class clazz, + boolean doFullsizeRequest) throws ClassNotFoundException { + super(dbClient, entity, clazz, doFullsizeRequest); + LOG.info("DataObjectAcessorPm"); + this.dbClient = dbClient; + this.mode = mode; + } + + /** + * get aggregated list of ltps for filter NODE_KEY + * + * @param input + * @return + * @throws IOException + */ + public QueryResult getDataLtpList(EntityInput input) throws IOException { + + QueryByFilter queryByFilter = new QueryByFilter(input); + SearchRequest request = queryByFilter.getSearchRequestByFilter(NODE_KEY, UUID_KEY, mode.getIndex(), + mode.getType(), this.doFullsizeRequest); + try { + SearchResponse response = this.dbClient.search(request); + AggregationEntries aggs = response.getAggregations(UUID_KEY); + String[] uuids = + aggs.getKeysAsPagedStringList(queryByFilter.getPageSize(), queryByFilter.getPageStartIndex()); + long totalSize = aggs.size(); + return new QueryResult(queryByFilter.getPage(), queryByFilter.getPageSize(), + new SearchResult(uuids, totalSize)); + } catch (IOException e) { + throw new IOException("problem reading ltps for req=" + request, e); + } + } + + /** + * get aggregated devices list + * + * @param input filter should be empty/no filter handled, only sortorder for KEY ('node-name') + * @return + * @throws IOException + */ + public QueryResult getDataDeviceList(EntityInput input) throws IOException { + + QueryByFilter queryByFilter = new QueryByFilter(input); + SearchRequest request = + queryByFilter.getSearchRequestBySortOrder(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType(), this.doFullsizeRequest); + try { + SearchResponse response = this.dbClient.search(request); + AggregationEntries aggs = response.getAggregations(KEY); + String[] uuids = + aggs.getKeysAsPagedStringList(queryByFilter.getPageSize(), queryByFilter.getPageStartIndex()); + long totalSize = aggs.size(); + return new QueryResult(queryByFilter.getPage(), queryByFilter.getPageSize(), + new SearchResult(uuids, totalSize)); + } catch (IOException e) { + throw new IOException("problem reading nodes for req=" + request, e); + } + + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java new file mode 100644 index 000000000..5811550e6 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java @@ -0,0 +1,103 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor; + +import java.io.IOException; +import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries; +import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryResult; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionLogStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.DataBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.FaultsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.NetworkElementConnectionsBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; + +public class DataObjectAcessorStatus extends DataObjectAcessor { + + final String ESDATATYPE_FAULTCURRENT_SEVERITY_KEY = "severity"; + final String ESDATATYPE_NECON_CONNECTIONSTATE_KEY = "status"; + + private final ExtRestClient dbClient; + + public DataObjectAcessorStatus(HtDatabaseClient dbClient, Entity entity, boolean doFullsizeRequests) + throws ClassNotFoundException { + super(dbClient, entity, Data.class, doFullsizeRequests); + this.dbClient = dbClient; + + } + + public QueryResult getDataStatus() throws IOException { + SearchRequest request = getNewInstanceOfSearchRequest(Entity.Faultcurrent); + QueryBuilder query = QueryBuilders.matchAllQuery().aggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY).size(0); + if(this.doFullsizeRequest) { + query.doFullsizeRequest(); + } + request.setQuery(query); + SearchResponse response = this.dbClient.search(request); + AggregationEntries aggs = response.getAggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY); + + DataBuilder builder = new DataBuilder().setFaults( + new FaultsBuilder().setCriticals(YangHelper2.getLongOrUint32(aggs.getOrDefault("Critical", 0L))) + .setMajors(YangHelper2.getLongOrUint32(aggs.getOrDefault("Major", 0L))) + .setMinors(YangHelper2.getLongOrUint32(aggs.getOrDefault("Minor", 0L))) + .setWarnings(YangHelper2.getLongOrUint32(aggs.getOrDefault("Warning", 0L))).build()); + + request = getNewInstanceOfSearchRequest(Entity.NetworkelementConnection); + query = QueryBuilders.matchAllQuery().aggregations(ESDATATYPE_NECON_CONNECTIONSTATE_KEY).size(0); + if(this.doFullsizeRequest) { + query.doFullsizeRequest(); + } + request.setQuery(query); + response = this.dbClient.search(request); + aggs = response.getAggregations(ESDATATYPE_NECON_CONNECTIONSTATE_KEY); + builder.setNetworkElementConnections(new NetworkElementConnectionsBuilder() + .setConnected(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Connected.getName(), 0L))) + .setConnecting(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Connecting.getName(), 0L))) + .setDisconnected(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Disconnected.getName(), 0L))) + .setUnableToConnect( + Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.UnableToConnect.getName(), 0L))) + .setMounted(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Mounted.getName(), 0L))) + .setUnmounted(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Unmounted.getName(), 0L))) + .setUndefined(Uint32.valueOf(aggs.getOrDefault(ConnectionLogStatus.Undefined.getName(), 0L))) + .setTotal(Uint32.valueOf(response.getTotal())).build()); + + long toalsize = 1; + return new QueryResult(1L, 1L, new SearchResult(new Data[] {builder.build()}, toalsize)); + + } + + + private static SearchRequest getNewInstanceOfSearchRequest(Entity entity) { + return new SearchRequest(entity.getName(), entity.getName()); + } + + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java new file mode 100644 index 000000000..da2b4b151 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java @@ -0,0 +1,40 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor; + +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataObjectAcessorWithId extends DataObjectAcessor { + + private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorWithId.class); + + public DataObjectAcessorWithId(HtDatabaseClient dbClient, Entity entity, Class clazz, boolean doFullsizeRequest) + throws ClassNotFoundException { + super(dbClient, entity, clazz, doFullsizeRequest); + setEsIdAttributeName("_id"); + LOG.info("Create {}", this.getClass().getName()); + } +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java new file mode 100644 index 000000000..36ab39845 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java @@ -0,0 +1,98 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Fault; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType; + +public class FaultEntityManager { + + private static final Pattern pattern = Pattern.compile(".*\\[layerProtocol=(.*)\\]"); + + /** + * The leading indication for notification or events that are not in the currentProblem data of the ONF Coremodel + */ + private static final String NOCURRENTPROBLEMINDICATION = "#"; + + /** + * Specific problems are not moving into current problem list + * + * @param problemName to be verified + * @return true if problem is current + */ + public static boolean isManagedAsCurrentProblem(String problemName) { + return !problemName.startsWith(NOCURRENTPROBLEMINDICATION); + } + + public static boolean isManagedAsCurrentProblem(Fault problem) { + return isManagedAsCurrentProblem(problem.getProblem()); + } + + /** + * Specific problems are not moving into current problem list + * + * @param fault to be verified + * @return true if cleared indication + */ + public static boolean isNoAlarmIndication(@Nonnull Fault fault) { + return SeverityType.NonAlarmed.equals(fault.getSeverity()); + } + + /** + * Create a specific ES id for the current log. + * + * @return a string with the generated ES Id + */ + public static String genSpecificEsId(String nodeName, String objectId, String problemName) { + + String uuId; + + Matcher matcher = pattern.matcher(objectId); + if (matcher.matches() && matcher.groupCount() == 1) { + uuId = matcher.group(1); + } else { + uuId = objectId; + } + + StringBuffer strBuf = new StringBuffer(); + strBuf.append(nodeName); + strBuf.append("/"); + strBuf.append(uuId); + strBuf.append("/"); + strBuf.append(problemName); + return strBuf.toString(); + } + + /** + * Create Es id + * + * @param fault used to create uuid for faultcurrent + * @return String with Id + */ + public static String genSpecificEsId(FaultcurrentEntity fault) { + return genSpecificEsId(fault.getNodeId(), fault.getObjectId(), fault.getProblem()); + } +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java new file mode 100644 index 000000000..41e94e3f6 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java @@ -0,0 +1,638 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsDataObjectReaderWriter2; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataInconsistencyException; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionLogStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInputBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Event service, writing all events into the database into the appropriate index. + * + * @author herbert + */ +public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider { + private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class); + + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter(); + + private HtDatabaseClient client; + private EsDataObjectReaderWriter2 eventRWEventLogDevicemanager; + private EsDataObjectReaderWriter2 eventRWEquipment; + private EsDataObjectReaderWriter2 eventRWFaultCurrentDB; + private EsDataObjectReaderWriter2 eventRWFaultLogDB; + private EsDataObjectReaderWriter2 eventRWConnectionLogDB; + private final EsDataObjectReaderWriter2 networkelementConnectionDB; + private final EsDataObjectReaderWriter2 guiCutThroughDB; + private final EsDataObjectReaderWriter2 pmData15mDB; + private final EsDataObjectReaderWriter2 pmData24hDB; + + @SuppressWarnings("unused") + private final DatabaseDataProvider dataProvider; + // --- Construct and initialize + + public HtDatabaseEventsService(HtDatabaseClient client, DatabaseDataProvider elasticSearchDataProvider) + throws Exception { + + LOG.info("Create {} start", HtDatabaseEventsService.class); + this.dataProvider = elasticSearchDataProvider; + + try { + // Create control structure + this.client = client; + + eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog, + EventlogEntity.class, EventlogBuilder.class); + + eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment, InventoryEntity.class, + InventoryBuilder.class); + + eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent, + FaultcurrentEntity.class, FaultcurrentBuilder.class); + + eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog, FaultlogEntity.class, + FaultlogBuilder.class); + + eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog, + ConnectionlogEntity.class, ConnectionlogBuilder.class); + + networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection, + NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true) + .setEsIdAttributeName("_id"); + + guiCutThroughDB = new EsDataObjectReaderWriter2<>(client, Entity.Guicutthrough, GuicutthroughEntity.class, + GuicutthroughBuilder.class); + + pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min, PmdataEntity.class, + PmdataEntityBuilder.class); + + pmData24hDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance24h, PmdataEntity.class, + PmdataEntityBuilder.class); + + } catch (Exception e) { + LOG.error("Can not start database client. Exception: {}", e); + throw new Exception("Can not start database client. Exception: {}", e); + } + LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class, + client != null ? "sucessfully" : "not"); + } + + // --- Function + + // -- Connection log + @Override + public void writeConnectionLog(ConnectionlogEntity event) { + if (assertIfClientNull(event)) { + return; + } + LOG.debug("Write event: {}", event); + eventRWConnectionLogDB.write(event, null); + + } + + // -- Event log + @Override + public void writeEventLog(EventlogEntity event) { + if (assertIfClientNull("No client to write {}", event)) { + return; + } + + LOG.debug("Write event: {}", event.toString()); + eventRWEventLogDevicemanager.write(event, null); + } + + // -- Fault log + + @Override + public void writeFaultLog(FaultlogEntity fault) { + if (assertIfClientNull(fault)) { + return; + } + + LOG.debug("Write fault to faultlog: {}", fault.toString()); + eventRWFaultLogDB.write(fault, null); + } + + // -- Fault current + + @Override + public void updateFaultCurrent(FaultcurrentEntity fault) { + if (assertIfClientNull(fault)) { + return; + } + + if (FaultEntityManager.isManagedAsCurrentProblem(fault)) { + if (FaultEntityManager.isNoAlarmIndication(fault)) { + LOG.debug("Remove from currentFaults: {}", fault.toString()); + eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault)); + } else { + LOG.debug("Write to currentFaults: {}", fault.toString()); + eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault)); + } + } else { + LOG.debug("Ingnore for currentFaults: {}", fault.toString()); + } + } + + /** + * Remove all entries for one node + * + * @param nodeName contains the mountpointname + * @return number of deleted entries + */ + @Override + public int clearFaultsCurrentOfNode(String nodeName) { + if (assertIfClientNullForNodeName(nodeName)) { + return -1; + } + + LOG.debug("Remove from currentFaults all faults for node: {}", nodeName); + return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName)); + } + + /** + * Remove all entries for one node + * + * @param nodeName contains the mountpointname + * @param objectId of element to be deleted + * @return number of deleted entries + */ + @Override + public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) { + if (assertIfClientNullForNodeName(nodeName)) { + return -1; + } + + LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId); + return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId)); + } + + /** + * Deliver list with all mountpoint/node-names in the database. + * + * @return List of all mountpoint/node-names the had active alarms. + */ + @Override + public @Nonnull List getAllNodesWithCurrentAlarms() { + if (assertIfClientNull("No DB, can not delete for all nodes", null)) { + return new ArrayList<>(); + } + + LOG.debug("Remove from currentFaults faults for all node"); + List nodeNames = new ArrayList<>(); + + for (FaultcurrentEntity fault : eventRWFaultCurrentDB.doReadAll().getHits()) { + String nodeName = fault.getNodeId(); + if (!nodeNames.contains(nodeName)) { + // this.clearFaultsCurrentOfNode(nodeName); -> Function shifted + nodeNames.add(nodeName); + } + } + return nodeNames; + } + + // -- Inventory and equipment current + + /** + * write internal equipment to database + * + * @param internalEquipment with mandatory fields. + */ + + private void writeInventory(Inventory internalEquipment) { + + if (internalEquipment.getManufacturerIdentifier() == null) { + internalEquipment = new InventoryBuilder(internalEquipment).setManufacturerIdentifier("").build(); + } + if (internalEquipment.getDate() == null) { + internalEquipment = new InventoryBuilder(internalEquipment).setDate("").build(); + } + eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId() + "/" + internalEquipment.getUuid()); + } + + /** + * write internal equipment to database + * + * @param nodeId + * @param list + */ + @Override + public void writeInventory(String nodeId, List list) { + + try { + checkConsistency(nodeId, list); + } catch (DataInconsistencyException e) { + LOG.warn("inventory list for node {} is not consistent", nodeId, e); + list = e.getRepairedList(); + } + + for (Inventory internalEquipment : list) { + this.writeInventory(internalEquipment); + } + } + + private static void checkConsistency(String nodeId, List list) throws DataInconsistencyException { + final String UNBOUND_INVENTORY_UUID = "unbound"; + List failures = new ArrayList<>(); + long treeLevel; + int failCounter = 0; + Map repairList = new HashMap<>(); + InventoryBuilder repairedItem; + InventoryBuilder unboundItem = new InventoryBuilder().setNodeId(nodeId).setUuid(UNBOUND_INVENTORY_UUID) + .setTreeLevel(Uint32.valueOf(0));; + for (Inventory item : list) { + repairedItem = new InventoryBuilder(item); + // check missing tree-level + if (!nodeId.equals(item.getNodeId())) { + failures.add(String.format("missing node-id for equipment(uuid=%s)", item.getUuid())); + repairedItem.setNodeId(nodeId); + failCounter++; + } + if (item.getTreeLevel() == null) { + failures.add(String.format("missing tree-level for equipment(uuid=%s)", item.getUuid())); + repairedItem.setTreeLevel(Uint32.valueOf(1)); + failCounter++; + + } else { + treeLevel = item.getTreeLevel().longValue(); + if (treeLevel > 0) { + // check non root elem and missing parent + if (item.getParentUuid() == null) { + failures.add(String.format("Non root level element (uuid=%s) has to have a parent element", + item.getUuid())); + failCounter++; + repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID); + repairList.put(unboundItem.getUuid(), unboundItem.build()); + } + // check that parent exists in list and is tree-level -1 + else { + Optional parent = + list.stream().filter(e -> item.getParentUuid().equals(e.getUuid())).findFirst(); + if (parent.isEmpty()) { + failures.add(String.format("no parent found for uuid=%s with parent-uuid=%s", + item.getUuid(), item.getParentUuid())); + repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID); + failCounter++; + } + } + } + // check for duplicated uui + Optional duplicate = list + .stream().filter(e -> !item.equals(e) && item.getUuid() != null + && item.getUuid().equals(e.getUuid()) && repairList.containsKey(e.getUuid())) + .findFirst(); + if (duplicate.isPresent()) { + failures.add(String.format("found duplicate uuid=%s", item.getUuid())); + failCounter++; + continue; + + } + if (failCounter > 0) { + repairList.put(repairedItem.getUuid(), repairedItem.build()); + } else { + repairList.put(item.getUuid(), item); + } + } + } + + if (failures.size() > 0) { + throw new DataInconsistencyException(new ArrayList<>(repairList.values()), + "inventory list is not consistent;\n" + String.join("\n", failures)); + } + } + + // -- Networkelement + + /** + * join base with parameters of toJoin (only non null values) + * + * @param base base object + * @param toJoin object with new property values + * @return new joined object + */ + @SuppressWarnings("unused") + private NetworkElementConnectionEntity joinNe(NetworkElementConnectionEntity base, + NetworkElementConnectionEntity toJoin) { + if (base == null) { + return toJoin; + } + NetworkElementConnectionBuilder builder = new NetworkElementConnectionBuilder(base); + if (toJoin != null) { + if (toJoin.isIsRequired() != null) { + builder.setIsRequired(toJoin.isIsRequired()); + } + if (toJoin.getCoreModelCapability() != null) { + builder.setCoreModelCapability(toJoin.getCoreModelCapability()); + } + if (toJoin.getDeviceType() != null) { + builder.setDeviceType(toJoin.getDeviceType()); + } + if (toJoin.getHost() != null) { + builder.setHost(toJoin.getHost()); + } + if (toJoin.getNodeDetails() != null) { + builder.setNodeDetails(toJoin.getNodeDetails()); + } + if (toJoin.getPassword() != null) { + builder.setPassword(toJoin.getPassword()); + } + if (toJoin.getPort() != null) { + builder.setPort(toJoin.getPort()); + } + if (toJoin.getStatus() != null) { + builder.setStatus(toJoin.getStatus()); + } + if (toJoin.getUsername() != null) { + builder.setUsername(toJoin.getUsername()); + } + } + return builder.build(); + } + + /** + * + * @param networkElementConnectionEntitiy to wirte to DB + * @param nodeId Id for this DB element + */ + @Override + public boolean updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, + String nodeId) { + return this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId) != null; + // NetworkElementConnectionEntity e = + // this.networkelementConnectionDB.read(nodeId); + // this.networkelementConnectionDB.write(this.joinNe(e, + // networkElementConnectionEntitiy), nodeId); + } + + /** + * Update after new mountpoint registration + * + * @param networkElementConnectionEntitiy data + * @param nodeId of device (mountpoint name) + */ + @Override + public boolean updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, + String nodeId) { + LOG.info("update networkelement-connection for {} with data {}", nodeId, networkElementConnectionEntitiy); + return this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, + Arrays.asList("is-required", "username", "password")) != null; + // NetworkElementConnectionEntity e = + // this.networkelementConnectionDB.read(nodeId); + // this.networkelementConnectionDB.write(this.joinNe(e, + // networkElementConnectionEntitiy), nodeId); + + } + + /* please do not remove */ + // public void cleanNetworkElementConnections() { + // this.networkelementConnectionDB.remove(QueryBuilders.matchQuery("is-required", + // false)); + // CreateNetworkElementConnectionInput x = new + // CreateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(); + // this.networkelementConnectionDB.update(x,QueryBuilders.matchAllQuery()); + // } + + @Override + public void removeNetworkConnection(String nodeId) { + Boolean isRequired; + NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId); + if (e != null && (isRequired = e.isIsRequired()) != null) { + if (isRequired) { + LOG.debug("updating connection status for {} of required ne to disconnected", nodeId); + this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder() + .setStatus(ConnectionLogStatus.Disconnected).build(), nodeId); + } else { + LOG.debug("remove networkelement-connection for {} entry because of non-required", nodeId); + this.networkelementConnectionDB.remove(nodeId); + } + } else { + LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection", + nodeId); + } + } + + // -- Multiple areas + + @Override + public int doIndexClean(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + int removed = 0; + + QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); + removed += eventRWEventLogDevicemanager.remove(queryEventBase); + + QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp); + removed += eventRWFaultLogDB.remove(queryFaultLog); + return removed; + } + + @Override + public long getNumberOfOldObjects(Date olderAreOutdated) { + + String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated); + int numberOfElements = 0; + + QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp); + numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal(); + + QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp); + numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal(); + + return numberOfElements; + } + + // -- Helper + + /** + * Verify status of client + * + * @param event that is printed with message + * @return true if client is null + */ + private boolean assertIfClientNull(Object event) { + return assertIfClientNull("No DB, can not write: {}", event); + } + + private boolean assertIfClientNullForNodeName(Object object) { + return assertIfClientNull("No DB, can not handle node: {}", object); + } + + /** + * Verify status of client + * + * @param message to print including {} for object printout. + * @return true if client is null + */ + private boolean assertIfClientNull(String message, Object object) { + if (client == null) { + LOG.debug(message, object); + return true; + } + return false; + } + + // ### sub classes + + private static class EsEventBase { + /** + * Query to get older Elements + * + * @param netconfTimeStamp to identify older Elements + * @return QueryBuilder for older elements related to timestamp + */ + private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { + return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp); + } + } + + private static class EsFaultLogDevicemanager { + /** + * Get older Elements + * + * @param netconfTimeStamp to identify query elements older than this timestamp. + * @return QueryBuilder for related elements + */ + public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) { + return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp); + } + } + + public static class EsFaultCurrent { + /** + * @param nodeName name of the node + * @return query builder + */ + public static QueryBuilder getQueryForOneNode(String nodeName) { + return QueryBuilders.matchQuery("node-id", nodeName); + } + + public static QueryBuilder getQueryForOneNodeAndObjectId(String nodeName, String objectId) { + BoolQueryBuilder bq = QueryBuilders.boolQuery(); + bq.must(QueryBuilders.matchQuery("node-id", nodeName)); + bq.must(QueryBuilders.matchQuery("object-id", objectId)); + return bq; + } + } + + @Override + public List getNetworkElementConnections() { + return this.networkelementConnectionDB.doReadAll().getHits(); + } + + @Override + public void doWritePerformanceData(List list) { + + list.forEach(elem -> { + GranularityPeriodType granularityPeriod = nnGetGranularityPeriodType(elem.getGranularityPeriod()); + // _id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00" + StringBuffer id = new StringBuffer(); + DateAndTime date = elem.getTimeStamp(); + id.append(elem.getNodeName()); + id.append("/"); + id.append(elem.getUuidInterface()); + id.append("/"); + id.append(date != null ? date.getValue() : "null"); + + switch (granularityPeriod) { + case Period15Min: + pmData15mDB.write(elem, id.toString()); + break; + case Period24Hours: + pmData24hDB.write(elem, id.toString()); + break; + case Unknown: + default: + LOG.debug("Unknown granularity {} id {}", granularityPeriod, id); + break; + } + }); + + } + + @NonNull + GranularityPeriodType nnGetGranularityPeriodType(@Nullable GranularityPeriodType granularityPeriod) { + return granularityPeriod != null ? granularityPeriod : GranularityPeriodType.Unknown; + } + + @Override + public HtDatabaseClient getRawClient() { + return this.client; + } + + @Override + public void writeGuiCutThroughData(Guicutthrough gcData, String nodeId) { + guiCutThroughDB.write(gcData, nodeId); + } + + @Override + public int clearGuiCutThroughEntriesOfNode(String nodeName) { + guiCutThroughDB.remove(nodeName); + return 0; + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java new file mode 100644 index 000000000..c6161b54c --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java @@ -0,0 +1,176 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity; + +import java.util.ArrayList; +import java.util.List; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.HtAssert; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsDataObjectReaderWriter2; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtDatabaseMaintenanceService implements HtDatabaseMaintenance { + + private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseMaintenanceService.class); + + private final EsDataObjectReaderWriter2 maintenanceRW; + private final EsDataObjectReaderWriter2 requiredNeRW; + + public HtDatabaseMaintenanceService(@NonNull HtDatabaseClient client) throws ClassNotFoundException { + HtAssert.nonnull(client); + + // Create control structure + maintenanceRW = new EsDataObjectReaderWriter2<>(client, Entity.Maintenancemode, MaintenanceEntity.class, + MaintenanceBuilder.class, true).setEsIdAttributeName("_id"); + + requiredNeRW = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection, + NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true) + .setEsIdAttributeName("_id"); + + } + + /** + * Get existing object for mountpoint to manage maintenance mode + * + * @return Object with configuration + */ + @Override + @Nullable + public MaintenanceEntity getMaintenance(@Nullable String mountpointId) { + MaintenanceEntity deviceMaintenanceMode = null; + if (maintenanceRW != null && mountpointId != null) { + deviceMaintenanceMode = maintenanceRW.read(mountpointId); + } + return deviceMaintenanceMode; + } + + @Override + public MaintenanceEntity setMaintenance(MaintenanceEntity m) { + if (maintenanceRW != null) { + if (maintenanceRW.write(m, m.getNodeId()) == null) { + throw new IllegalArgumentException("Problem writing to database: " + m.getId()); + } + LOG.info("Wrote maintenance object {}", m.toString()); + } + return m; + } + + @Override + public List getAll() { + return maintenanceRW != null ? maintenanceRW.doReadAll().getHits() : new ArrayList<>(); + } + + @Override + public MaintenanceEntity createIfNotExists(String mountpointId) { + MaintenanceEntity deviceMaintenanceMode = null; + if (maintenanceRW != null) { + deviceMaintenanceMode = maintenanceRW.read(mountpointId); + if (deviceMaintenanceMode == null) { + LOG.debug("creating empty maintenance object in database"); + deviceMaintenanceMode = getDefaultMaintenance(mountpointId); + maintenanceRW.write(deviceMaintenanceMode, mountpointId); + } else { + LOG.debug("maintenance object already exists in database"); + } + } else { + LOG.warn("cannot create maintenance obj. db reader/writer is null"); + } + return deviceMaintenanceMode; + } + + @Override + public void deleteIfNotRequired(String mountPointNodeName) { + + if (!this.isRequireNe(mountPointNodeName)) { + if (maintenanceRW != null) { + LOG.debug("removing maintenance object in database for " + mountPointNodeName); + maintenanceRW.remove(mountPointNodeName); + } else { + LOG.warn("cannot create maintenance obj. db reader/writer is null"); + } + } + + + } + + /** + * Provide default maintenanceinformation for a device + * + * @param mountpointId nodeId of device + * @return default data + */ + static private MaintenanceEntity getDefaultMaintenance(String mountpointId) { + + DateAndTime now = NetconfTimeStampImpl.getConverter().getTimeStamp(); + + MaintenanceBuilder deviceMaintenanceModeBuilder = new MaintenanceBuilder(); + deviceMaintenanceModeBuilder.setNodeId(mountpointId).setId(mountpointId); + // Use time from mountpoint creation + deviceMaintenanceModeBuilder.setDescription(""); + // Use time from mountpoint creation + deviceMaintenanceModeBuilder.setStart(now); + deviceMaintenanceModeBuilder.setEnd(now); + deviceMaintenanceModeBuilder.setActive(false); + + // Reference to all + //consistent to UI input to null/not empty string + //deviceMaintenanceModeBuilder.setObjectIdRef(""); + //deviceMaintenanceModeBuilder.setProblem(""); + + return deviceMaintenanceModeBuilder.build(); + } + + // -- Private + /** + * Check in required ne if entry exists for mountpointNodeName + * + * @param mountPointNodeName + * @return + */ + @SuppressWarnings("null") + private boolean isRequireNe(String mountPointNodeName) { + NetworkElementConnectionEntity ne = null; + if (requiredNeRW != null) { + LOG.debug("searching for entry in required-networkelement for " + mountPointNodeName); + ne = requiredNeRW.read(mountPointNodeName); + } else { + LOG.warn("cannot read db. no db reader writer initialized"); + } + if (ne != null && ne.isIsRequired() != null) { + return ne.isIsRequired(); + } else { + return false; + } + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java new file mode 100644 index 000000000..eef61e09c --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java @@ -0,0 +1,436 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.YangHelper; +import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorPm; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Pagination; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Sortorder; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class QueryByFilter { + + private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); + private static final List timestampValueNames = Arrays.asList("timestamp", "start", "end"); + + private static List emptySortOrderList = new ArrayList<>(); + private static List emptyFilterList = new ArrayList<>(); + + // Derived from input + private long page; + private long pageSize; + private long fromPage; + private List filterList; + private List sortOrder; + + /** + * Process input from RPC into Queries to database + * + * @param input Input from RPC, for test it could be null + */ + public QueryByFilter(EntityInput input) { + page = -1; + pageSize = -1; + if (input != null) { + @Nullable + Pagination pagination = input.getPagination(); + if (pagination != null) { + @Nullable + Uint64 pageOrNull = YangHelper2.getUint64(pagination.getPage()); + if (pageOrNull != null) { + page = pageOrNull.longValue(); + } + @Nullable + Uint32 pageSizeOrNull = YangHelper2.getUint32(pagination.getSize()); + if (pageSizeOrNull != null) { + pageSize = pageSizeOrNull.longValue(); + } + } + } + if (page < 0) + page = 1; + if (pageSize < 0) + pageSize = 1; + + fromPage = (page - 1) * pageSize; + if (fromPage < 0 || pageSize > 10000) + throw new IllegalArgumentException("mismatching input parameters. From:" + fromPage + " size:" + pageSize); + + filterList = YangHelper.getList(input.getFilter()); + if (filterList == null) + filterList = emptyFilterList; + sortOrder = YangHelper.getList(input.getSortorder()); + if (sortOrder == null) + sortOrder = emptySortOrderList; + + } + + public QueryBuilder getQueryBuilderByFilter() { + return getQueryBuilderByFilter(""); + } + + public QueryBuilder getQueryBuilderByFilter(String prefix) { + QueryBuilder queryBuilder = fromFilter(filterList, prefix).from(fromPage).size(pageSize); + setSortOrder(queryBuilder, sortOrder, prefix); + return queryBuilder; + } + + public SearchRequest getSearchRequestByFilter(String nodeKey, String uuidKey, String index, String dataType, + boolean doFullsizeRequest) { + Filter nodeFilter = getFilter(filterList, nodeKey); + if (nodeFilter != null) { + SearchRequest request = new SearchRequest(index, dataType); + request.setQuery(QueryBuilders.matchQuery(nodeKey, nodeFilter.getFiltervalue()) + .setFullsizeRequest(doFullsizeRequest).aggregations(uuidKey).size(0)); + return request; + } else { + String msg = "no nodename in filter found "; + LOG.debug(msg); + throw new IllegalArgumentException(msg); + } + } + + public SearchRequest getSearchRequestBySortOrder(String nodeKey, String uuidKey, String index, String dataType, + boolean doFullsizeRequest) { + Sortorder soNode = getSortOrder(sortOrder, nodeKey); + SearchRequest request = new SearchRequest(index, dataType); + QueryBuilder query = null; + if (soNode != null) { + query = QueryBuilders.matchAllQuery().setFullsizeRequest(doFullsizeRequest) + .aggregations(nodeKey, convert(soNode.getSortorder())).size(0); + } else { + query = QueryBuilders.matchAllQuery().setFullsizeRequest(doFullsizeRequest).aggregations(nodeKey).size(0); + } + request.setQuery(query); + return request; + } + + public long getPage() { + return page; + } + + public long getPageSize() { + return pageSize; + } + + public long getPageStartIndex() { + return fromPage; + } + + @Override + public String toString() { + return "QueryByFilter [page=" + page + ", pageSize=" + pageSize + ", fromPage=" + fromPage + ", filterList=" + + filterList + ", sortOrder=" + sortOrder + "]"; + } + + /* + * Private and static implementations + */ + private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder, String prefix) { + if (sortorder != null && sortorder.size() > 0) { + for (Sortorder so : sortorder) { + query.sort(handlePrefix(prefix, so.getProperty()), convert(so.getSortorder())); + } + } + return query; + } + + private static org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder convert(SortOrder sortOrder) { + return sortOrder == SortOrder.Ascending + ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING + : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING; + }; + + private static Sortorder getSortOrder(@Nullable List list, String prop) { + if (list == null) { + return null; + } + for (Sortorder o : list) { + if (prop.equals(o.getProperty())) { + return o; + } + } + return null; + } + + private static Filter getFilter(@Nullable List list, String prop) { + if (list == null) { + return null; + } + for (Filter f : list) { + if (prop.equals(f.getProperty())) { + return f; + } + } + return null; + } + + private static String fillTimeStamp(String value) { + int idx = value.lastIndexOf("*"); + final String REPLACE = "0000-00-00T00:00:00.0Z"; + String s = value.substring(0, idx) + REPLACE.substring(idx); + if (Integer.parseInt(s.substring(5, 7)) == 0) { + s = s.substring(0, 5) + "01-" + s.substring(8); + } + if (Integer.parseInt(s.substring(8, 10)) == 0) { + s = s.substring(0, 8) + "01" + s.substring(10); + } + + return s; + } + + /** + * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte: + * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z + * + * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01 + * + */ + private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) { + if (!value.endsWith("*")) { + return null; + } + int idx = value.lastIndexOf("*"); + String lowerEnd = fillTimeStamp(value); + String upperEnd = null; + NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter(); + Date dt = null; + try { + dt = converter.getDateFromNetconf(lowerEnd); + } catch (Exception e) { + + } + if (dt == null) { + return null; + } + // property.substring(0,idx)+REPLACE.substring(idx+1); + Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + c.setTime(dt); + int tmpvalue; + switch (idx) { + case 1: // (2*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 2: // (20*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 3: // (200*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 4: // (2000*) + case 5: // (2000-*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 6: // switch 10 months (2000-0* or 2000-1*) + tmpvalue = c.get(Calendar.MONTH); + if (tmpvalue < 9) { + c.set(Calendar.MONTH, 9); + } else { + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); + c.set(Calendar.MONTH, 0); + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + + break; + case 7: // switch one month (2018-01* or 2018-01-*) + case 8: + c.add(Calendar.MONTH, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 9: // (2018-01-0*) + tmpvalue = c.get(Calendar.DAY_OF_MONTH); + if (tmpvalue == 1) { + c.set(Calendar.DAY_OF_MONTH, 10); + } else if (tmpvalue == 10) { + c.set(Calendar.DAY_OF_MONTH, 20); + } else if (tmpvalue == 20) { + if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) { + c.set(Calendar.DAY_OF_MONTH, 1); + c.add(Calendar.MONTH, 1); + } else { + c.set(Calendar.DAY_OF_MONTH, 30); + } + } else if (tmpvalue == 30) { + c.set(Calendar.DAY_OF_MONTH, 1); + c.add(Calendar.MONTH, 1); + } else { + break; + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 10: // (2018-01-01*) + case 11: // (2018-01-01T*) + c.add(Calendar.DAY_OF_MONTH, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 12: // (2018-01-01T1*) + tmpvalue = c.get(Calendar.HOUR_OF_DAY); + if (tmpvalue == 20) { + c.set(Calendar.HOUR_OF_DAY, 0); + c.add(Calendar.DAY_OF_MONTH, 1); + } else { + c.add(Calendar.HOUR_OF_DAY, 10); + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 13: // (2018-01-01T11*) + case 14: // (2018-01-01T11-*) + c.add(Calendar.HOUR_OF_DAY, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 15: // (2018-01-01T11-3*) + c.add(Calendar.MINUTE, 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 16: // (2018-01-01T11-32*) + case 17: // (2018-01-01T11-32-*) + c.add(Calendar.MINUTE, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 18: // (2018-01-01T11-32-1*) + c.add(Calendar.SECOND, 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 19: // (2018-01-01T11-32-11*) + case 20: // (2018-01-01T11-32-11.*) + c.add(Calendar.SECOND, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + + default: + break; + } + + if (upperEnd == null) { + return null; + } + return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd); + + } + + private static List collectValues(Filter filter) { + List values = new ArrayList(); + if (filter.getFiltervalue() != null) { + values.add(filter.getFiltervalue()); + } + if (filter.getFiltervalues() != null) { + values.addAll(filter.getFiltervalues()); + } + return values; + } + + private static QueryBuilder fromFilter(@Nullable List filters, String prefix) { + if (filters == null || filters.size() == 0) { + return QueryBuilders.matchAllQuery(); + + } else if (filters.size() == 1) { + String property = filters.get(0).getProperty(); + List values = collectValues(filters.get(0)); + if ("id".equals(property)) { + property = "_id"; + } + if (values.size() == 1) { + return getSinglePropertyQuery(property, values.get(0), prefix); + } else { + BoolQueryBuilder bquery = new BoolQueryBuilder(); + for (String v : values) { + bquery.should(getSinglePropertyQuery(property, v, prefix)); + } + return bquery; + + } + } else { + BoolQueryBuilder query = new BoolQueryBuilder(); + for (Filter fi : filters) { + String p = fi.getProperty(); + List values = collectValues(fi); + if ("id".equals(p)) { + p = "_id"; + } + if (values.size() == 1) { + query.must(getSinglePropertyQuery(p, values.get(0), prefix)); + } else { + BoolQueryBuilder tmpQuery = QueryBuilders.boolQuery(); + for (String v : values) { + tmpQuery.should(getSinglePropertyQuery(p, v, prefix)); + } + query.must(tmpQuery); + tmpQuery = QueryBuilders.boolQuery(); + } + } + LOG.trace("Query result. {}", query.toJSON()); + return query; + } + } + + private static QueryBuilder getSinglePropertyQuery(String p, String v, String prefix) { + QueryBuilder query = null; + if (DbFilter.hasSearchParams(v)) { + if (p != null && timestampValueNames.contains(p.toLowerCase())) { + query = fromTimestampSearchFilter(p, v); + if (query == null) { + query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)); + } + } else { + query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)); + } + } else if (DbFilter.isComparisonValid(v)) { + query = DbFilter.getRangeQuery(handlePrefix(prefix, p), v); + if (query == null) { + query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v); + } + } else { + query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v); + } + return query; + } + + private static String handlePrefix(String prefix, String p) { + return (prefix != null ? prefix : "") + p; + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java new file mode 100644 index 000000000..4e4c1a9c8 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java @@ -0,0 +1,337 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper; + +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorPm; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Sortorder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class QueryByFilterStatic { + + private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class); + private static final List timestampValueNames = Arrays.asList("timestamp", "start", "end"); + + private QueryByFilterStatic() { + //Hide + } + + static long getPage(EntityInput input) { + return getPage(input, 1); + } + + private static long getPage(EntityInput input, long defaultValue) { + return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue; + } + + static long getPageSize(EntityInput input) { + return getPageSize(input, 1); + } + + private static long getPageSize(EntityInput input, long defaultValue) { + return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue; + } + + + public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder) { + return setSortOrder(query, sortorder, ""); + } + + private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List sortorder, String prefix) { + if (sortorder != null && sortorder.size() > 0) { + for (Sortorder so : sortorder) { + query.sort((prefix != null ? prefix : "") + so.getProperty(), + so.getSortorder() == SortOrder.Ascending + ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING + : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING); + } + } + return query; + + } + + + public static Sortorder getSortOrder(@Nullable List list, String prop) { + if (list == null) { + return null; + } + for (Sortorder o : list) { + if (prop.equals(o.getProperty())) { + return o; + } + } + return null; + } + + public static Filter getFilter(@Nullable List list, String prop) { + if (list == null) { + return null; + } + for (Filter f : list) { + if (prop.equals(f.getProperty())) { + return f; + } + } + return null; + } + + public static QueryBuilder fromFilter(@Nullable List filters) { + return fromFilter(filters, ""); + } + + private static String fillTimeStamp(String value) { + int idx = value.lastIndexOf("*"); + final String REPLACE = "0000-00-00T00:00:00.0Z"; + String s = value.substring(0, idx) + REPLACE.substring(idx); + if (Integer.parseInt(s.substring(5, 7)) == 0) { + s = s.substring(0, 5) + "01-" + s.substring(8); + } + if (Integer.parseInt(s.substring(8, 10)) == 0) { + s = s.substring(0, 8) + "01" + s.substring(10); + } + + return s; + } + + /** + * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte: + * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z + * + * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01 + * + */ + private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) { + if (!value.endsWith("*")) { + return null; + } + int idx = value.lastIndexOf("*"); + String lowerEnd = fillTimeStamp(value); + String upperEnd = null; + NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter(); + Date dt = null; + try { + dt = converter.getDateFromNetconf(lowerEnd); + } catch (Exception e) { + + } + if (dt == null) { + return null; + } + // property.substring(0,idx)+REPLACE.substring(idx+1); + Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + c.setTime(dt); + int tmpvalue; + switch (idx) { + case 1: // (2*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 2: // (20*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 3: // (200*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 4: // (2000*) + case 5: // (2000-*) + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 6: //switch 10 months (2000-0* or 2000-1*) + tmpvalue = c.get(Calendar.MONTH); + if (tmpvalue < 9) { + c.set(Calendar.MONTH, 9); + } else { + c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1); + c.set(Calendar.MONTH, 0); + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + + break; + case 7: //switch one month (2018-01* or 2018-01-*) + case 8: + c.add(Calendar.MONTH, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 9: // (2018-01-0*) + tmpvalue = c.get(Calendar.DAY_OF_MONTH); + if (tmpvalue == 1) { + c.set(Calendar.DAY_OF_MONTH, 10); + } else if (tmpvalue == 10) { + c.set(Calendar.DAY_OF_MONTH, 20); + } else if (tmpvalue == 20) { + if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) { + c.set(Calendar.DAY_OF_MONTH, 1); + c.add(Calendar.MONTH, 1); + } else { + c.set(Calendar.DAY_OF_MONTH, 30); + } + } else if (tmpvalue == 30) { + c.set(Calendar.DAY_OF_MONTH, 1); + c.add(Calendar.MONTH, 1); + } else { + break; + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 10: // (2018-01-01*) + case 11: // (2018-01-01T*) + c.add(Calendar.DAY_OF_MONTH, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 12: // (2018-01-01T1*) + tmpvalue = c.get(Calendar.HOUR_OF_DAY); + if (tmpvalue == 20) { + c.set(Calendar.HOUR_OF_DAY, 0); + c.add(Calendar.DAY_OF_MONTH, 1); + } else { + c.add(Calendar.HOUR_OF_DAY, 10); + } + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 13: // (2018-01-01T11*) + case 14: // (2018-01-01T11-*) + c.add(Calendar.HOUR_OF_DAY, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 15: // (2018-01-01T11-3*) + c.add(Calendar.MINUTE, 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 16: // (2018-01-01T11-32*) + case 17: // (2018-01-01T11-32-*) + c.add(Calendar.MINUTE, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 18: // (2018-01-01T11-32-1*) + c.add(Calendar.SECOND, 10); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + case 19: // (2018-01-01T11-32-11*) + case 20: // (2018-01-01T11-32-11.*) + c.add(Calendar.SECOND, 1); + upperEnd = converter.getTimeStampAsNetconfString(c.getTime()); + break; + + default: + break; + } + + if (upperEnd == null) { + return null; + } + return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd); + + } + + private static QueryBuilder fromFilter(@Nullable List filters, String prefix) { + if (filters == null || filters.size() == 0) { + return QueryBuilders.matchAllQuery(); + + } else if (filters.size() == 1) { + QueryBuilder query; + String p = filters.get(0).getProperty(); + String v = filters.get(0).getFiltervalue(); + if ("id".equals(p)) { + p = "_id"; + } else { + // v=v.toLowerCase(); + } + if (DbFilter.hasSearchParams(v)) { + if (p != null && timestampValueNames.contains(p.toLowerCase())) { + query = fromTimestampSearchFilter(p, v); + if (query != null) { + return query; + } + } + return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v)); + + + } else if (DbFilter.isComparisonValid(v)) { + RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v); + if (q != null) { + return q; + } else { + return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v); + } + } else { + return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v); + } + } else { + BoolQueryBuilder query = new BoolQueryBuilder(); + QueryBuilder tmpQuery; + for (Filter fi : filters) { + String p = fi.getProperty(); + String v = fi.getFiltervalue(); + if ("id".equals(p)) { + p = "_id"; + } else { + // v=v.toLowerCase(); + } + if (DbFilter.hasSearchParams(v)) { + if (p != null && timestampValueNames.contains(p.toLowerCase())) { + tmpQuery = fromTimestampSearchFilter(p, v); + if (tmpQuery != null) { + query.must(tmpQuery); + } else { + query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p, + DbFilter.createDatabaseRegex(v))); + } + } else { + query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p, + DbFilter.createDatabaseRegex(v))); + } + } else if (DbFilter.isComparisonValid(v)) { + RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v); + if (q != null) { + query.must(q); + } else { + query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v)); + } + } else { + query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v)); + } + } + LOG.trace("Query result. {}", query.toJSON()); + return query; + } + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java new file mode 100644 index 000000000..d4cf0eb53 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java @@ -0,0 +1,71 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper; + +import java.math.BigInteger; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PaginationOutputG; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.PaginationBuilder; + +public class QueryResult { + + private SearchResult result; + private PaginationOutputG pagination; + + public QueryResult(long page, long pageSize, SearchResult result) { + this.result = result; + + PaginationBuilder x = new PaginationBuilder(); + x.setPage(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(page))); + x.setSize(YangHelper2.getLongOrUint32(pageSize)); + x.setTotal(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(result.getTotal()))); + pagination = x.build(); + } + + public QueryResult(QueryByFilter queryByFilter, SearchResult result) { + this.result = result; + + PaginationBuilder x = new PaginationBuilder(); + x.setPage(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(queryByFilter.getPage()))); + x.setSize(YangHelper2.getLongOrUint32(queryByFilter.getPageSize())); + x.setTotal(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(result.getTotal()))); + pagination = x.build(); + } + + + public SearchResult getResult() { + return result; + } + + public PaginationOutputG getPagination() { + return pagination; + } + + @Override + public String toString() { + return "QueryResult [result=" + result + ", pagination=" + pagination + "]"; + } + + + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java new file mode 100644 index 000000000..53b21e0ed --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java @@ -0,0 +1,520 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorPm; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorPm.Intervall; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorStatus; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorWithId; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity.HtDatabaseMaintenanceService; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryResult; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMediatorserver; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionOutputBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ElasticSearchDataProvider implements DatabaseDataProvider { + + private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchDataProvider.class); + + private static final String EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE = "unable to write data to database"; + private static final String EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE = "unable to update data in database"; + private static final String EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE = "unable to remove data from database"; + + private final HtDatabaseClient dbClient; + private final DataObjectAcessorWithId eventRWFaultCurrent; + private final DataObjectAcessorWithId eventRWFaultLog; + private final DataObjectAcessorWithId mediatorserverRW; + private final DataObjectAcessorWithId maintenanceRW; + private final DataObjectAcessorWithId guicutthroughRW; + private final DataObjectAcessorWithId equipmentRW; + private final DataObjectAcessorWithId connnectionlogRW; + private final DataObjectAcessorWithId eventlogRW; + private final DataObjectAcessorWithId networkelementConnectionRW; + private final DataObjectAcessorPm pm15mRW; + private final DataObjectAcessorPm pm24hRW; + + private final DataObjectAcessorStatus readStatus; + private final HtDatabaseEventsService databaseService; + private final HtDatabaseMaintenanceService databaseMaintenanceService; + + private final HtDatabaseMediatorserver dbMediatorServerService = new HtDatabaseMediatorserver() { + + @Override + public List getAll() { + return new ArrayList<>(ElasticSearchDataProvider.this.mediatorserverRW.doReadAll().getHits()); + } + }; + + @Override + public HtDatabaseClient getRawClient() { + return this.dbClient; + } + + public ElasticSearchDataProvider(HostInfo[] hosts) throws Exception { + this(hosts, null, null, HtDatabaseClient.TRUSTALL_DEFAULT, false); + } + + public ElasticSearchDataProvider(EsConfig esConfig) throws Exception { + this(esConfig.getHosts(), esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(), + esConfig.trustAllCerts(), esConfig.doFullsizeRequests()); + } + + public ElasticSearchDataProvider(HostInfo[] hosts, String authUsername, String authPassword, boolean trustAllCerts, + boolean doFullsizeRequests) throws Exception { + super(); + LOG.info("Start {}", this.getClass().getName()); + + + this.dbClient = HtDatabaseClient.getClient(hosts, authUsername, authPassword, trustAllCerts); + this.mediatorserverRW = new DataObjectAcessorWithId<>(dbClient, Entity.MediatorServer, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data.class, + doFullsizeRequests); + this.mediatorserverRW.setWriteInterface(MediatorServerEntity.class); + + this.maintenanceRW = new DataObjectAcessorWithId<>(dbClient, Entity.Maintenancemode, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data.class, + doFullsizeRequests); + this.maintenanceRW.setWriteInterface(MaintenanceEntity.class); + + this.guicutthroughRW = new DataObjectAcessorWithId<>(dbClient, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity.Guicutthrough, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data.class, + doFullsizeRequests); + this.guicutthroughRW.setWriteInterface(Guicutthrough.class); + + this.equipmentRW = new DataObjectAcessorWithId<>(dbClient, Entity.Inventoryequipment, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data.class, + doFullsizeRequests); + + this.eventRWFaultCurrent = new DataObjectAcessorWithId<>(dbClient, Entity.Faultcurrent, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data.class, + doFullsizeRequests); + + this.eventRWFaultLog = new DataObjectAcessorWithId<>(dbClient, Entity.Faultlog, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data.class, + doFullsizeRequests); + + this.connnectionlogRW = new DataObjectAcessorWithId<>(dbClient, Entity.Connectionlog, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data.class, + doFullsizeRequests); + + this.eventlogRW = new DataObjectAcessorWithId<>(dbClient, Entity.Eventlog, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data.class, + doFullsizeRequests); + + this.networkelementConnectionRW = new DataObjectAcessorWithId<>(dbClient, Entity.NetworkelementConnection, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data.class, + doFullsizeRequests); + this.networkelementConnectionRW.setWriteInterface(NetworkElementConnectionEntity.class); + + this.pm15mRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA15M, Entity.Historicalperformance15min, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data.class, + doFullsizeRequests); + + this.pm24hRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA24H, Entity.Historicalperformance24h, + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data.class, + doFullsizeRequests); + + this.readStatus = new DataObjectAcessorStatus(dbClient, Entity.Faultcurrent, doFullsizeRequests); + + this.databaseService = new HtDatabaseEventsService(dbClient, this); + this.databaseMaintenanceService = new HtDatabaseMaintenanceService(dbClient); + } + + /*------------------------- + * Provide access to model API + */ + + + @Override + public ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input) { + + ReadFaultcurrentListOutputBuilder outputBuilder = new ReadFaultcurrentListOutputBuilder(); + + QueryResult result = + this.eventRWFaultCurrent.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadFaultlogListOutputBuilder readFaultLogList(EntityInput input) { + ReadFaultlogListOutputBuilder outputBuilder = new ReadFaultlogListOutputBuilder(); + QueryResult result = + this.eventRWFaultLog.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadMaintenanceListOutputBuilder readMaintenanceList(EntityInput input) { + ReadMaintenanceListOutputBuilder outputBuilder = new ReadMaintenanceListOutputBuilder(); + QueryResult result = + this.maintenanceRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadMediatorServerListOutputBuilder readMediatorServerList(EntityInput input) { + + ReadMediatorServerListOutputBuilder outputBuilder = new ReadMediatorServerListOutputBuilder(); + QueryResult result = + this.mediatorserverRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadNetworkElementConnectionListOutputBuilder readNetworkElementConnectionList(EntityInput input) { + ReadNetworkElementConnectionListOutputBuilder outputBuilder = + new ReadNetworkElementConnectionListOutputBuilder(); + QueryResult result = + this.networkelementConnectionRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadInventoryListOutputBuilder readInventoryList(EntityInput input) { + ReadInventoryListOutputBuilder outputBuilder = new ReadInventoryListOutputBuilder(); + QueryResult result = + this.equipmentRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadConnectionlogListOutputBuilder readConnectionlogList(EntityInput input) { + ReadConnectionlogListOutputBuilder outputBuilder = new ReadConnectionlogListOutputBuilder(); + QueryResult result = + this.connnectionlogRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadEventlogListOutputBuilder readEventlogList(EntityInput input) throws IOException { + ReadEventlogListOutputBuilder outputBuilder = new ReadEventlogListOutputBuilder(); + QueryResult result = + this.eventlogRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadPmdata15mListOutputBuilder readPmdata15mList(EntityInput input) { + ReadPmdata15mListOutputBuilder outputBuilder = new ReadPmdata15mListOutputBuilder(); + QueryResult result = + this.pm15mRW.getData(input); + LOG.debug("Read data: readPmdata15mList: {}", result); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadPmdata24hListOutputBuilder readPmdata24hList(EntityInput input) { + ReadPmdata24hListOutputBuilder outputBuilder = new ReadPmdata24hListOutputBuilder(); + QueryResult result = + this.pm24hRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.PaginationBuilder( + result.getPagination()).build()); + return outputBuilder; + } + + @Override + public ReadPmdata15mLtpListOutputBuilder readPmdata15mLtpList(EntityInput input) throws IOException { + ReadPmdata15mLtpListOutputBuilder outputBuilder = new ReadPmdata15mLtpListOutputBuilder(); + QueryResult result = pm15mRW.getDataLtpList(input); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.ltp.list.output.PaginationBuilder( + result.getPagination()).build()); + outputBuilder.setData(result.getResult().getHits()); + return outputBuilder; + } + + @Override + public ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException { + ReadPmdata15mDeviceListOutputBuilder outputBuilder = new ReadPmdata15mDeviceListOutputBuilder(); + QueryResult result = pm15mRW.getDataDeviceList(input); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.device.list.output.PaginationBuilder( + result.getPagination()).build()); + outputBuilder.setData(result.getResult().getHits()); + return outputBuilder; + } + + @Override + public ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException { + + QueryResult result = pm24hRW.getDataLtpList(input); + + ReadPmdata24hLtpListOutputBuilder outputBuilder = new ReadPmdata24hLtpListOutputBuilder(); + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.ltp.list.output.PaginationBuilder(); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.ltp.list.output.PaginationBuilder( + result.getPagination()).build()); + outputBuilder.setData(result.getResult().getHits()); + return outputBuilder; + } + + @Override + public ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input) throws IOException { + + QueryResult result = pm24hRW.getDataDeviceList(input); + + ReadPmdata24hDeviceListOutputBuilder outputBuilder = new ReadPmdata24hDeviceListOutputBuilder(); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.device.list.output.PaginationBuilder( + result.getPagination()).build()); + outputBuilder.setData(result.getResult().getHits()); + return outputBuilder; + } + + @Override + public ReadStatusOutputBuilder readStatus() throws IOException { + QueryResult result = + readStatus.getDataStatus(); + + ReadStatusOutputBuilder outputBuilder = new ReadStatusOutputBuilder(); + outputBuilder.setData(result.getResult().getHits()); + return outputBuilder; + } + + @Override + public boolean waitForYellowDatabaseStatus(long timeout, TimeUnit unit) { + return this.dbClient.waitForYellowStatus(unit.toMillis(timeout)); + } + + @Override + public CreateNetworkElementConnectionOutputBuilder createNetworkElementConnection( + NetworkElementConnectionEntity input) throws IOException { + String id = this.networkelementConnectionRW.update(input, input.getNodeId()); + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); + } + CreateNetworkElementConnectionOutputBuilder builder = new CreateNetworkElementConnectionOutputBuilder(); + builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort()) + .setUsername(input.getUsername()).setPassword(input.getPassword()).setIsRequired(input.isIsRequired()) + .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType()); + return builder; + } + + @Override + public UpdateNetworkElementConnectionOutputBuilder updateNetworkElementConnection( + UpdateNetworkElementConnectionInput input) throws IOException { + String id = this.networkelementConnectionRW.update(input, input.getId()); + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); + } + UpdateNetworkElementConnectionOutputBuilder builder = new UpdateNetworkElementConnectionOutputBuilder(); + builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort()) + .setUsername(input.getUsername()).setPassword(input.getPassword()) + .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType()); + return builder; + } + + @Override + public DeleteNetworkElementConnectionOutputBuilder deleteNetworkElementConnection( + DeleteNetworkElementConnectionInput input) throws IOException { + boolean removed = this.networkelementConnectionRW.remove(input.getId()); + if (!removed) { + throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); + } + return new DeleteNetworkElementConnectionOutputBuilder(); + } + + @Override + public DeleteMediatorServerOutputBuilder deleteMediatorServer(DeleteMediatorServerInput input) throws IOException { + boolean removed = this.mediatorserverRW.remove(input.getId()); + if (!removed) { + throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); + } + return new DeleteMediatorServerOutputBuilder(); + } + + @Override + public DeleteMaintenanceOutputBuilder deleteMaintenance(DeleteMaintenanceInput input) throws IOException { + boolean removed = this.maintenanceRW.remove(input.getId()); + if (!removed) { + throw new IOException(EXCEPTION_UNABLE_TO_REMOVE_FROM_DATABASE); + } + return new DeleteMaintenanceOutputBuilder(); + } + + @Override + public UpdateMaintenanceOutputBuilder updateMaintenance(UpdateMaintenanceInput input) throws IOException { + if (input.getId() == null) { + throw new IOException("please give the id for updating entry"); + } + String id = this.maintenanceRW.update(input, input.getId()); + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); + } + UpdateMaintenanceOutputBuilder builder = new UpdateMaintenanceOutputBuilder(input).setId(id); + return builder; + } + + @Override + public UpdateMediatorServerOutputBuilder updateMediatorServer(UpdateMediatorServerInput input) throws IOException { + if (input.getId() == null) { + throw new IOException("please give the id for updating entry"); + } + String id = this.mediatorserverRW.update(input, input.getId()); + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_UPDATE_IN_DATABASE); + } + UpdateMediatorServerOutputBuilder builder = new UpdateMediatorServerOutputBuilder(); + builder.setId(id).setName(input.getName()).setUrl(input.getUrl()); + return builder; + } + + @Override + public CreateMaintenanceOutputBuilder createMaintenance(CreateMaintenanceInput input) throws IOException { + String id = this.maintenanceRW.write(input, input.getNodeId()); + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); + } + CreateMaintenanceOutputBuilder builder = new CreateMaintenanceOutputBuilder(input).setId(id); + return builder; + } + + @Override + public CreateMediatorServerOutputBuilder createMediatorServer(CreateMediatorServerInput input) throws IOException { + String id = this.mediatorserverRW.write(input, null); + + if (id == null) { + throw new IOException(EXCEPTION_UNABLE_TO_WRITE_IN_DATABASE); + } + CreateMediatorServerOutputBuilder builder = new CreateMediatorServerOutputBuilder(); + builder.setId(id).setName(input.getName()).setUrl(input.getUrl()); + return builder; + } + + @Override + public ReadGuiCutThroughEntryOutputBuilder readGuiCutThroughEntry(EntityInput input) { + ReadGuiCutThroughEntryOutputBuilder outputBuilder = new ReadGuiCutThroughEntryOutputBuilder(); + QueryResult result = + this.guicutthroughRW.getData(input); + outputBuilder.setData(result.getResult().getHits()); + outputBuilder.setPagination( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.PaginationBuilder() + .build()); + return outputBuilder; + } + + @Override + public DataProvider getDataProvider() { + return this.databaseService; + } + + @Override + public HtDatabaseMaintenance getHtDatabaseMaintenance() { + return this.databaseMaintenanceService; + } + + @Override + public HtDatabaseMediatorserver getHtDatabaseMediatorServer() { + return dbMediatorServerService; + } + + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java new file mode 100644 index 000000000..9dbdb136a --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java @@ -0,0 +1,150 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import org.json.JSONException; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtUserdataManagerImpl implements HtUserdataManager { + + private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerImpl.class); + + private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json"; + private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults(); + + private static JSONObject loadDefaults() { + File f = new File(USERDATA_DEFAULTS_FILENAME); + String content; + JSONObject o = null; + if (f.exists()) { + try { + content = Files.readString(f.toPath()); + o = new JSONObject(content); + } catch (IOException e) { + LOG.warn("problem loading defaults: ", e); + } catch (JSONException e) { + LOG.warn("problem parsing defaults: ", e); + } + } + return o; + } + + + private final HtDatabaseClient dbClient; + + public HtUserdataManagerImpl(HtDatabaseClient rawClient) { + this.dbClient = rawClient; + } + + @Override + public String getUserdata(String username) { + SearchResult result = this.dbClient.doReadByQueryJsonData(Entity.Userdata.getName(), + QueryBuilders.matchQuery("_id", username)); + String json = result.getHits().size() > 0 ? result.getHits().get(0).getSourceAsString() : "{}"; + if (USERDATA_DEFAULTS_CONTENT != null) { + JSONObject merge = mergeData(new JSONObject(json), USERDATA_DEFAULTS_CONTENT); + json = merge.toString(); + } + return json; + } + + @Override + public String getUserdata(String username, String key) { + JSONObject o = new JSONObject(this.getUserdata(username)); + return o.has(key) ? o.get(key).toString() : "{}"; + } + + @Override + public boolean setUserdata(String username, String data) { + JSONObject o = new JSONObject(this.getUserdata(username)); + JSONObject merge = mergeData(o, new JSONObject(data)); + return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, merge.toString()) != null; + } + + @Override + public boolean setUserdata(String username, String key, String data) { + JSONObject o = new JSONObject(this.getUserdata(username)); + o = mergeData(o, key, new JSONObject(data)); + return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, o.toString()) != null; + } + + @Override + public boolean removeUserdata(String username) { + return this.dbClient.doRemove(Entity.Userdata.getName(), username); + } + + @Override + public boolean removeUserdata(String username, String key) { + JSONObject o = new JSONObject(this.getUserdata(username)); + if (o.has(key)) { + o.remove(key); + return this.setUserdata(username, o.toString()); + } + return true; + } + + private static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) { + if (!o.has(key)) { + o.put(key, subObject); + } else { + JSONObject tmp = new JSONObject(); + tmp.put(key, subObject); + o = mergeData(tmp, o); + } + return o; + } + + private static JSONObject mergeData(JSONObject source, JSONObject target) throws JSONException { + String[] keys = JSONObject.getNames(source); + if (keys == null) { + return target; + } + for (String key : keys) { + Object value = source.get(key); + if (!target.has(key)) { + // new value for "key": + target.put(key, value); + } else { + // existing value for "key" - recursively deep merge: + if (value instanceof JSONObject) { + JSONObject valueJson = (JSONObject) value; + mergeData(valueJson, target.getJSONObject(key)); + } else { + target.put(key, value); + } + } + } + return target; + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java index 91d469700..05e6d2f13 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java @@ -91,15 +91,6 @@ public class DataTreeChildObject { } } } else { - // if(this.children!=null) { - // for(DataTreeChildObject child:this.children.values()) { - // itemValue=(String) child.getProperty(childKey, null); - // if(itemValue!=null && itemValue.equals(itemValueToMatch)) { - // child.children.put(id, data); - // return true; - // } - // } - // } itemValue = this.getProperty(childKey, null); if (itemValue != null && itemValue.equals(itemValueToMatch)) { this.children.put(id, data); @@ -157,8 +148,8 @@ public class DataTreeChildObject { } } o.put("children", c); - // o.put("ownSeverity", null); - // o.put("childrenSeveritySummary", null); + //o.put("ownSeverity", null); + //o.put("childrenSeveritySummary", null); return o; } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java index 725256b17..103dec70d 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java @@ -25,9 +25,9 @@ import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.onap.ccsdk.features.sdnr.wt.common.http.BaseServlet; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.MediatorServerDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMediatorserver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -102,8 +102,8 @@ public class MsServlet extends BaseServlet { trustAll = trust; } - public void setDataProvider(MediatorServerDataProvider mediatorServerDataProvider) { - entryProvider = mediatorServerDataProvider; + public void setDataProvider(HtDatabaseMediatorserver entryProvider2) { + entryProvider = new MediatorServerDataProvider(entryProvider2); } @Override @@ -115,4 +115,11 @@ public class MsServlet extends BaseServlet { protected boolean isCorsEnabled() { return false; } + + public void triggerReloadSync() { + if(entryProvider!=null) { + entryProvider.triggerReloadSync(); + } + + } } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java deleted file mode 100644 index 284365021..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.http; - -import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.karaf.bundle.core.BundleInfo; -import org.apache.karaf.bundle.core.BundleService; -import org.apache.karaf.bundle.core.BundleState; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.MarkdownTable; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReadyHttpServlet extends HttpServlet { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static final Logger LOG = LoggerFactory.getLogger(ReadyHttpServlet.class); - private static boolean status; - - - private BundleService bundleService = null; - - public void setBundleService(BundleService bundleService) { - this.bundleService = bundleService; - } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - - if (isReady() && this.getBundleStatesReady()) { - resp.setStatus(HttpServletResponse.SC_OK); - } else { - - try { - resp.sendError(HttpServletResponse.SC_NOT_FOUND); - } catch (IOException | IllegalStateException e) { - LOG.warn("unable to write out 404 res not found: {}", e); - } - } - } - - private static boolean isReady() { - return status; - } - - public static void setStatus(boolean s) { - status = s; - LOG.info("status is set to ready: {}", status); - } - - private boolean getBundleStatesReady() { - Bundle thisbundle = FrameworkUtil.getBundle(this.getClass()); - BundleContext context = thisbundle ==null?null:thisbundle.getBundleContext(); - if (context == null) { - LOG.debug("no bundle context available"); - return true; - } - Bundle[] bundles = context.getBundles(); - if (bundles == null || bundles.length <= 0) { - LOG.debug("no bundles found"); - return true; - } - LOG.debug("found {} bundles", bundles.length); - MarkdownTable table = new MarkdownTable(); - table.setHeader(new String[] {"Bundle-Id","Version","Symbolic-Name","Status"}); - int cntNotActive=0; - - for (Bundle bundle : bundles) { - if(this.bundleService!=null) { - BundleInfo info = this.bundleService.getInfo(bundle); - if(info.getState()==BundleState.Active ) { - continue; - } - if(info.getState()==BundleState.Resolved ) { - if(!this.isBundleImportant(bundle.getSymbolicName())) { - LOG.trace("ignore not important bundle {} with state {}",bundle.getSymbolicName(),info.getState()); - continue; - } - } - - LOG.trace("bundle {} is in state {}",bundle.getSymbolicName(),info.getState()); - } - else { - LOG.warn("bundle service is null"); - } - cntNotActive++; - } - - return cntNotActive==0; - } - - private boolean isBundleImportant(String symbolicName) { - symbolicName = symbolicName.toLowerCase(); - if(symbolicName.contains("mdsal")) { - return true; - } - if(symbolicName.contains("netconf")) { - return true; - } - if(symbolicName.contains("ccsdk")) { - return true; - } - if(symbolicName.contains("devicemanager")) { - return true; - } - if(symbolicName.contains("restconf")) { - return true; - } - - return false; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java index 90b5fd9af..64b5fab9f 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java @@ -33,6 +33,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.http.HttpHeaders; //import org.apache.karaf.bundle.core.BundleInfo; //import org.apache.karaf.bundle.core.BundleService; import org.onap.ccsdk.features.sdnr.wt.common.Resources; @@ -71,22 +72,27 @@ public class AboutHttpServlet extends HttpServlet { private static final String PLACEHOLDER_KARAF_INFO = "{karaf-info}"; private static final String PLACEHOLDER_DEVICEMANAGER_TABLE = "{devicemanagers}"; private static final String README_FILE = "README.md"; + private static final String JSON_FILE = "README.json"; private static final String NO_DEVICEMANAGERS_RUNNING_MESSAGE = null; + private static final String MIMETYPE_JSON = "application/json"; + private static final String MIMETYPE_MARKDOWN = "text/markdown"; private final String groupId = this.getGroupIdOrDefault("org.onap.ccsdk.features.sdnr.wt"); private final String artifactId = "sdnr-wt-data-provider-provider"; - private final Map BUNDLESTATE_LUT; + private final Map BUNDLESTATE_LUT; private final Map data; private final String readmeContent; // private BundleService bundleService; + private String jsonContent; public AboutHttpServlet() { this.data = new HashMap<>(); this.collectStaticData(); - this.readmeContent = this.render(this.getResourceFileContent(README_FILE)); + this.readmeContent = this.render(ContentType.MARKDOWN, this.getResourceFileContent(README_FILE)); + this.jsonContent = this.render(ContentType.MARKDOWN, this.getResourceFileContent(JSON_FILE)); this.BUNDLESTATE_LUT = new HashMap<>(); this.BUNDLESTATE_LUT.put(Bundle.UNINSTALLED, "uninstalled"); this.BUNDLESTATE_LUT.put(Bundle.INSTALLED, "installed"); @@ -98,17 +104,17 @@ public class AboutHttpServlet extends HttpServlet { } protected String getGroupIdOrDefault(String def) { - String symbolicName = this.getManifestValue("Bundle-SymbolicName"); - if(symbolicName!=null) { - int idx = symbolicName.indexOf(this.artifactId); - if(idx>0) { - return symbolicName.substring(0, idx-1); - } - } - return def; - } - - // public void setBundleService(BundleService bundleService) { + String symbolicName = this.getManifestValue("Bundle-SymbolicName"); + if (symbolicName != null) { + int idx = symbolicName.indexOf(this.artifactId); + if (idx > 0) { + return symbolicName.substring(0, idx - 1); + } + } + return def; + } + + // public void setBundleService(BundleService bundleService) { // this.bundleService = bundleService; // } @@ -136,15 +142,16 @@ public class AboutHttpServlet extends HttpServlet { String uri = req.getRequestURI().substring(URI_PRE.length()); LOG.debug("request for {}", uri); if (uri.length() <= 0 || uri.equals("/")) { + ContentType ctype = this.detectContentType(req, ContentType.MARKDOWN); // collect data - this.collectData(); + this.collectData(ctype); // render readme - String content = this.render(); + String content = this.render(ctype); byte[] output = content != null ? content.getBytes() : new byte[0]; // output resp.setStatus(HttpServletResponse.SC_OK); resp.setContentLength(output.length); - resp.setContentType("text/plain"); + resp.setContentType(ctype.getMimeType()); ServletOutputStream os = null; try { os = resp.getOutputStream(); @@ -194,11 +201,11 @@ public class AboutHttpServlet extends HttpServlet { /** * collect dynamic data for about.md */ - private void collectData() { + private void collectData(ContentType ctype) { LOG.info("collecting dynamic data"); try { this.data.put(PLACEHOLDER_KARAF_INFO, SystemInfo.get()); - this.data.put(PLACEHOLDER_DEVICEMANAGER_TABLE, this.getDevicemanagerBundles()); + this.data.put(PLACEHOLDER_DEVICEMANAGER_TABLE, this.getDevicemanagerBundles(ctype)); } catch (Exception e) { LOG.warn("problem collecting system data: {}", e); } @@ -248,29 +255,6 @@ public class AboutHttpServlet extends HttpServlet { return null; } - /** - * get value for key out of /META-INF/maven/groupId/artifactId/pom.xml in properties section - * - * @param key - * @return - */ - private String getPomProperty(String key) { - LOG.info("try to get pom property for {}", key); - URL url = Resources.getUrlForRessource(AboutHttpServlet.class, - METAINF_MAVEN + groupId + "/" + artifactId + "/pom.xml"); - if (url == null) { - return null; - } - PomFile pomfile; - try { - pomfile = new PomFile(url.openStream()); - return pomfile.getProperty(key); - } catch (Exception e) { - LOG.warn(EXCEPTION_FORMAT_UNABLE_TO_READ_INNER_POMFILE, e); - } - return null; - } - /** * get parent pom version out of /META-INF/maven/groupId/artifactId/pom.xml * @@ -293,35 +277,35 @@ public class AboutHttpServlet extends HttpServlet { return null; } - private String getDevicemanagerBundles() { + private String getDevicemanagerBundles(ContentType ctype) { Bundle thisbundle = FrameworkUtil.getBundle(this.getClass()); - BundleContext context = thisbundle ==null?null:thisbundle.getBundleContext(); + BundleContext context = thisbundle == null ? null : thisbundle.getBundleContext(); if (context == null) { LOG.debug("no bundle context available"); - return ""; + return ctype==ContentType.MARKDOWN?"":"[]"; } Bundle[] bundles = context.getBundles(); if (bundles == null || bundles.length <= 0) { LOG.debug("no bundles found"); - return NO_DEVICEMANAGERS_RUNNING_MESSAGE; + return ctype==ContentType.MARKDOWN?NO_DEVICEMANAGERS_RUNNING_MESSAGE:"[]"; } LOG.debug("found {} bundles", bundles.length); MarkdownTable table = new MarkdownTable(); - table.setHeader(new String[] {"Bundle-Id","Version","Symbolic-Name","Status"}); + table.setHeader(new String[] {"Bundle-Id", "Version", "Symbolic-Name", "Status"}); String name; for (Bundle bundle : bundles) { name = bundle.getSymbolicName(); - if(!(name.contains("devicemanager") && name.contains("provider"))) { + if (!(name.contains("devicemanager") && name.contains("provider"))) { continue; } - if(name.equals("org.onap.ccsdk.features.sdnr.wt.sdnr-wt-devicemanager-core-provider")) { + if (name.equals("org.onap.ccsdk.features.sdnr.wt.sdnr-wt-devicemanager-provider")) { continue; } table.addRow(new String[] {String.valueOf(bundle.getBundleId()), bundle.getVersion().toString(), name, - BUNDLESTATE_LUT.getOrDefault(bundle.getState(),"unknown")}); + BUNDLESTATE_LUT.getOrDefault(bundle.getState(), "unknown")}); } - return table.toMarkDown(); + return ctype==ContentType.MARKDOWN?table.toMarkDown():table.toJson(); } /** @@ -382,10 +366,12 @@ public class AboutHttpServlet extends HttpServlet { /** * render this.readmeContent with this.data * + * @param ctype + * * @return */ - private String render() { - return this.render(null); + private String render(ContentType ctype) { + return this.render(ctype, null); } /** @@ -394,9 +380,9 @@ public class AboutHttpServlet extends HttpServlet { * @param content * @return */ - private String render(String content) { + private String render(ContentType ctype, String content) { if (content == null) { - content = this.readmeContent; + content = ctype==ContentType.MARKDOWN? this.readmeContent:this.jsonContent; } if (content == null) { return null; @@ -413,4 +399,30 @@ public class AboutHttpServlet extends HttpServlet { public void setClusterSize(String value) { this.data.put(PLACEHOLDER_CLUSTER_SIZE, value); } + + private ContentType detectContentType(HttpServletRequest req, ContentType def) { + String accept = req.getHeader(HttpHeaders.ACCEPT); + if (accept != null) { + if (accept.equals(MIMETYPE_JSON)) { + return ContentType.JSON; + } else if (accept.equals(MIMETYPE_MARKDOWN)) { + return ContentType.MARKDOWN; + } + } + return def; + } + + private enum ContentType { + MARKDOWN(MIMETYPE_MARKDOWN), JSON(MIMETYPE_JSON); + + private String mimeType; + + ContentType(String mimeType) { + this.mimeType = mimeType; + } + + String getMimeType() { + return this.mimeType; + } + } } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java index ac9cb44fe..1580a0fe3 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java @@ -23,6 +23,8 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about; import java.util.ArrayList; import java.util.List; +import org.json.JSONArray; +import org.json.JSONObject; /** * @author Michael Dürre @@ -48,7 +50,7 @@ public class MarkdownTable { public String toMarkDown() { StringBuilder sb = new StringBuilder(); final int cols = - this.columns != null ? this.columns.length : !this.rows.isEmpty() ? this.rows.get(0).length : 0; + this.columns != null ? this.columns.length : this.rows.size() > 0 ? this.rows.get(0).length : 0; if (cols > 0) { sb.append("|"); for (int i = 0; i < cols; i++) { @@ -67,9 +69,23 @@ public class MarkdownTable { } sb.append("\n"); } - - } return sb.toString(); } + + public String toJson() { + JSONArray a = new JSONArray(); + final int cols = + this.columns != null ? this.columns.length : this.rows.size() > 0 ? this.rows.get(0).length : 0; + if (cols > 0) { + for (String[] row : this.rows) { + JSONObject o = new JSONObject(); + for (int i = 0; i < cols; i++) { + o.put(this.columns[i], row[i]); + } + a.put(o); + } + } + return a.toString(); + } } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java index 491775eb0..0e43cd251 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java @@ -32,6 +32,9 @@ public class ODLVersionLUT { if (onapCCSDKVersion == null) { return def; } + if (onapCCSDKVersion.startsWith("2.2.")) { + return "ONAP Istanbul"; + } if (onapCCSDKVersion.startsWith("2.1.")) { return "ONAP Honolulu"; } @@ -60,6 +63,10 @@ public class ODLVersionLUT { } if(odlMdsalVersionLUT==null) { odlMdsalVersionLUT = new HashMap<>(); + odlMdsalVersionLUT.put("7.0.7","silicon-SR1 (0.14.1)"); + odlMdsalVersionLUT.put("7.0.6","silicon-SR0 (0.14.0)"); + odlMdsalVersionLUT.put("6.0.8","aluminium-SR3 (0.13.3)"); + //odlMdsalVersionLUT.put("6.0.7","aluminium-SR2 (0.13.2)"); odlMdsalVersionLUT.put("6.0.7","aluminium-SR1 (0.13.1)"); odlMdsalVersionLUT.put("6.0.4","aluminium-SR0 (0.13.0)"); odlMdsalVersionLUT.put("5.0.14","magnesium-SR2 (0.12.2)"); diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java index 0d46ad098..c6758e240 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java @@ -33,10 +33,8 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; - import javax.annotation.Nonnull; import javax.annotation.Nullable; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,22 +69,21 @@ public class YangFileProvider { } private List findYangFiles(String module) { + LOG.debug("try to find yang files for {}", module); List list = new ArrayList<>(); String[] files = this.mainSourcePath.toFile().list(yangFilenameFilter); YangFilename yangfile; - for (String file : files) { - files = this.mainSourcePath.toFile().list(yangFilenameFilter); - for (String fn : files) { - try { - yangfile = new YangFilename(this.mainSourcePath.resolve(fn).toString()); - if (yangfile.getModule().equals(module)) { - list.add(yangfile); - } - } catch (ParseException e) { - LOG.warn("unable to handle yangfile {}: {}", file, e); + for (String fn : files) { + try { + yangfile = new YangFilename(this.mainSourcePath.resolve(fn).toString()); + if (yangfile.getModule().equals(module)) { + list.add(yangfile); } + } catch (ParseException e) { + LOG.warn("unable to handle yangfile {}: {}", fn, e); } } + for (Path addPath : this.additionalSources) { files = addPath.toFile().list(yangFilenameFilter); for (String file : files) { @@ -105,7 +102,7 @@ public class YangFileProvider { /** * get yang file from source with specified version or least newer one if version is null then the latest one - * + * * @param module * @param version * @return @@ -140,7 +137,7 @@ public class YangFileProvider { /** * write filestream directly to output stream easier for http handling - * + * * @param module * @param version * @param outputStream diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java new file mode 100644 index 000000000..5e8dc92fc --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java @@ -0,0 +1,74 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType; + +public class DataProviderConfig implements Configuration { + + private static final String PROPERTY_KEY_DBTYPE = "dbType"; + private static final Object DEFAULT_DBTYPE = "${SDNRDBTYPE}"; + private static final SdnrDbType DEFAULT_DBTYPE_VALUE = SdnrDbType.ELASTICSEARCH; + private final EsConfig esConfig; + private final SqlDBConfig maridadbConfig; + private ConfigurationFileRepresentation configuration; + + public DataProviderConfig(ConfigurationFileRepresentation configuration) { + this.configuration = configuration; + defaults(); + this.esConfig = new EsConfig(configuration); + this.maridadbConfig = new SqlDBConfig(configuration); + } + + public EsConfig getEsConfig() { + return this.esConfig; + } + + public SqlDBConfig getMariadbConfig() { + return this.maridadbConfig; + } + + @Override + public void defaults() { + + configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_DBTYPE, DEFAULT_DBTYPE); + } + + @Override + public String getSectionName() { + return ConfigurationFileRepresentation.SECTIONNAME_ROOT; + } + + public SdnrDbType getDbType() { + String value = this.configuration.getProperty(this.getSectionName(), PROPERTY_KEY_DBTYPE); + if (value.isEmpty()) { + return DEFAULT_DBTYPE_VALUE; + } + return SdnrDbType.valueOf(value); + } + + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java index 190c78904..e06a1a9a2 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java @@ -25,7 +25,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClientException; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; @@ -36,6 +35,7 @@ import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.StatusChangedHandler.StatusKey; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,6 +52,7 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable { private DataTreeHttpServlet treeServlet; private UserdataHttpServlet userdataServlet; private HtDatabaseClient dbClient; + private DataBroker dataBroker; // Blueprint 1 public DataProviderImpl() { @@ -77,12 +78,15 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable { public void setUserdataServlet(UserdataHttpServlet userdataServlet) { this.userdataServlet = userdataServlet; } + public void setDataBroker(DataBroker dataBroker) { + this.dataBroker = dataBroker; + } public void init() throws Exception { LOG.info("Session Initiated start {}", APPLICATION_NAME); try { // Start RPC Service - this.rpcApiService = new DataProviderServiceImpl(rpcProviderService, this.mediatorServerServlet); + this.rpcApiService = new DataProviderServiceImpl(rpcProviderService, this.mediatorServerServlet, this.dataBroker); this.treeServlet.setDatabaseClient(this.rpcApiService.getRawClient()); this.userdataServlet.setDatabaseClient(this.rpcApiService.getHtDatabaseUserManager()); LOG.info("Session Initiated end. Initialization done"); @@ -136,11 +140,6 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable { return NetconfTimeStampImpl.getConverter(); } - @Override - public void setReadyStatus(boolean status) { - ReadyHttpServlet.setStatus(status); - } - @Override public void setStatus(StatusKey key, String value) { if (this.aboutServlet != null) { diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java index 9e7fc18bc..ad712847f 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java @@ -25,19 +25,31 @@ import com.google.common.util.concurrent.ListenableFuture; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.Arrays; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType; +import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcProviderService; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredential; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredentialKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput; @@ -92,9 +104,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,24 +118,30 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class); public static final String CONFIGURATIONFILE = "etc/dataprovider.properties"; private static final long DATABASE_TIMEOUT_MS = 120 * 1000L; + private static final @NonNull InstanceIdentifier KEYSTORE_IIF = InstanceIdentifier.create(Keystore.class); + private static final long DEFAULT_PAGESIZE = 20; + private static final long DEFAULT_PAGE = 1; private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg; - private final ElasticSearchDataProvider dataProvider; + private final DatabaseDataProvider dataProvider; private final ConfigurationFileRepresentation configuration; - private final EsConfig esConfig; - private final MediatorServerDataProvider mediatorServerDataProvider; + private final DataProviderConfig dbConfig; private final HtUserdataManager dbUserManager; - - DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet) - throws Exception { + private final DataBroker dataBroker; + private final MsServlet mediatorServerServlet; + public DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet, + DataBroker dataBroker) throws Exception { this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE); - this.esConfig = new EsConfig(configuration); - this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(), esConfig.getBasicAuthUsername(), - esConfig.getBasicAuthPassword(), esConfig.trustAllCerts()); + this.dbConfig = new DataProviderConfig(configuration); + this.dataBroker = dataBroker; + this.mediatorServerServlet = mediatorServerServlet; + if (this.dbConfig.getDbType() == SdnrDbType.ELASTICSEARCH) { + this.dataProvider = new ElasticSearchDataProvider(this.dbConfig.getEsConfig()); + } else { + this.dataProvider = new SqlDBDataProvider(this.dbConfig.getMariadbConfig()); + } this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS); - this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(), - esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts()); - mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider); + mediatorServerServlet.setDataProvider(this.dataProvider.getHtDatabaseMediatorServer()); this.dbUserManager = new HtUserdataManagerImpl(this.dataProvider.getRawClient()); // Register ourselves as the REST API RPC implementation LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName()); @@ -128,7 +149,7 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab } private void sendResyncCallbackToApiGateway() { - mediatorServerDataProvider.triggerReloadSync(); + this.mediatorServerServlet.triggerReloadSync(); } /** @@ -153,7 +174,7 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab * @return configuration object */ public IEsConfig getEsConfig() { - return esConfig; + return dbConfig.getEsConfig(); } @@ -385,7 +406,6 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab read(() -> DataProviderServiceImpl.this.dataProvider.readGuiCutThroughEntry(input)); return result.buildFuture(); } - // -- private classes and functions private static String assembleExceptionMessage(Exception e) { StringWriter sw = new StringWriter(); @@ -420,4 +440,6 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab return this.dbUserManager; } + + } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java index b44906289..cb62e3326 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java @@ -70,12 +70,6 @@ public class DataTreeProviderImpl { if (nodeId != null) { bquery.must(QueryBuilders.matchQuery(nodeKey, nodeId)); } - // if (parentKey != null && parentValue != null) { - // bquery.must(QueryBuilders.matchQuery(parentKey, parentValue)); - // } - // if (childKey != null && childValue != null) { - // bquery.must(QueryBuilders.matchQuery(childKey, childValue)); - // } query = bquery; } @@ -134,7 +128,7 @@ public class DataTreeProviderImpl { public DataTreeObject readInventoryTree(List tree, String filter) throws IOException { //root nodes will be node-information -> below inventory - if (tree == null || tree.isEmpty()) { + if (tree == null || tree.size() <= 0) { return this.readInventoryTreeWithNode(filter); } //root node will be inventory on tree-level if sliced treePath @@ -155,7 +149,7 @@ public class DataTreeProviderImpl { throws IOException { DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID); final String parentUuid = list.size() > 1 ? list.get(list.size() - 2) : null; - final String uuid = list.isEmpty() ? null : list.get(list.size() - 1); + final String uuid = list.size() > 0 ? list.get(list.size() - 1) : null; List matches = this.search(Entity.Inventoryequipment, filter, INVENTORY_PROPERTY_NODEID, nodeId, INVENTORY_PROPERTY_PARENTUUID, parentUuid, INVENTORY_PROPERTY_UUID, uuid, INVENTORY_PROPERTY_TREELEVEL); @@ -163,13 +157,13 @@ public class DataTreeProviderImpl { List others = this.search(Entity.Inventoryequipment, (String) null, INVENTORY_PROPERTY_NODEID, nodeId, null, null, null, null, INVENTORY_PROPERTY_TREELEVEL); if (matches.size() > 0) { - int treeLevelToStart = (list == null || list.isEmpty()) ? 0 : list.size() - 1; + int treeLevelToStart = (list == null || list.size() <= 0) ? 0 : list.size() - 1; //build tree JSONObject hitData; //fill root elems for (SearchHit hit : matches) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") == treeLevelToStart) { + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == treeLevelToStart) { tree.put(hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true) .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID)) @@ -179,7 +173,7 @@ public class DataTreeProviderImpl { } for (SearchHit hit : others) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") == treeLevelToStart) { + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == treeLevelToStart) { tree.putIfNotExists(hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false) .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID)) @@ -190,8 +184,8 @@ public class DataTreeProviderImpl { //fill child elems for (SearchHit hit : matches) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") > treeLevelToStart) { - tree.put(hitData.getLong("tree-level") - treeLevelToStart - 1, hit.getId(), + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > treeLevelToStart) { + tree.put(hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) - treeLevelToStart - 1, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true) .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID)) .setProperty(INVENTORY_PROPERTY_PARENTUUID, @@ -200,8 +194,8 @@ public class DataTreeProviderImpl { } for (SearchHit hit : others) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") > treeLevelToStart) { - tree.putIfNotExists(hitData.getLong("tree-level") - treeLevelToStart - 1, hit.getId(), + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > treeLevelToStart) { + tree.putIfNotExists(hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) - treeLevelToStart - 1, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false) .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID)) .setProperty(INVENTORY_PROPERTY_PARENTUUID, @@ -255,7 +249,7 @@ public class DataTreeProviderImpl { //fill root elems for (SearchHit hit : matches) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") == 0) { + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == 0) { tree.put(0, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true) .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID)) @@ -266,7 +260,7 @@ public class DataTreeProviderImpl { if (others != null) { for (SearchHit hit : others) { hitData = hit.getSource(); - if (hitData.getLong("tree-level") == 0) { + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == 0) { tree.putIfNotExists(0, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false) .setProperty(INVENTORY_PROPERTY_UUID, @@ -279,7 +273,7 @@ public class DataTreeProviderImpl { //fill child elements for (SearchHit hit : matches) { hitData = hit.getSource(); - long treeLevel = hitData.getLong("tree-level"); + long treeLevel = hitData.getLong(INVENTORY_PROPERTY_TREELEVEL); if (treeLevel > 0) { tree.put(treeLevel, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL_CHILD), true) @@ -291,8 +285,8 @@ public class DataTreeProviderImpl { if (others != null) { for (SearchHit hit : others) { hitData = hit.getSource(); - long treeLevel = hitData.getLong("tree-level"); - if (hitData.getLong("tree-level") > 0) { + long treeLevel = hitData.getLong(INVENTORY_PROPERTY_TREELEVEL); + if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > 0) { tree.putIfNotExists(treeLevel, hit.getId(), new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL_CHILD), false) .setProperty(INVENTORY_PROPERTY_UUID, diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java deleted file mode 100644 index 44751ffd0..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP : ccsdk features - * ================================================================================ - * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. - * All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - */ -package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; -import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; -import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; -import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; -import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EsConfig implements Configuration, IEsConfig { - - private static final Logger LOG = LoggerFactory.getLogger(EsConfig.class); - - public static final String SECTION_MARKER_ES = "es"; - - private static final String PROPERTY_KEY_DBHOSTS = "esHosts"; - private static final String PROPERTY_KEY_TRUSTALLCERTS = "esTrustAllCerts"; - private static final String PROPERTY_KEY_ARCHIVE_LIMIT = "esArchiveLifetimeSeconds"; - private static final String PROPERTY_KEY_CLUSTER = "esCluster"; - private static final String PROPERTY_KEY_ARCHIVE_INTERVAL = "esArchiveCheckIntervalSeconds"; - private static final String PROPERTY_KEY_NODE = "esNode"; - private static final String PROPERTY_KEY_AUTH_USERNAME = "esAuthUsername"; - private static final String PROPERTY_KEY_AUTH_PASSWORD = "esAuthPassword"; - - - private static String defaultHostinfo = "${SDNRDBURL}"; - private static final String DEFAULT_VALUE_CLUSTER = ""; - /** check db data in this interval [in seconds] 0 deactivated */ - private static final String DEFAULT_ARCHIVE_INTERVAL_SEC = "0"; - /** keep data for this time [in seconds] 30 days */ - private static final String DEFAULT_ARCHIVE_LIMIT_SEC = String.valueOf(60L * 60L * 24L * 30L); - private static final String DEFAULT_VALUE_NODE = "elasticsearchnode"; - private static final String DEFAULT_VALUE_DBUSERNAME = "${SDNRDBUSERNAME}"; - private static final String DEFAULT_VALUE_DBPASSWORD = "${SDNRDBPASSWORD}"; - private static final String DEFAULT_VALUE_TRUSTALLCERTS = "${SDNRDBTRUSTALLCERTS}"; - - private final ConfigurationFileRepresentation configuration; - - public EsConfig(ConfigurationFileRepresentation configuration) { - - this.configuration = configuration; - this.configuration.addSection(SECTION_MARKER_ES); - defaults(); - } - - /* - * Setter - */ - - public void setNode(String nodeName) { - configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_NODE, nodeName); - } - - /* - * Getter - */ - - public String getNode() { - return configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_NODE); - } - - public HostInfo[] getHosts() { - String dbHosts = configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS); - return parseHosts(dbHosts); - } - - public void setHosts(HostInfo[] hosts) { - this.configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS, printHosts(hosts)); - } - - @Override - public String getCluster() { - return configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL); - } - - public void setCluster(String cluster) { - configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_CLUSTER, cluster); - } - - public boolean hasBasicAuthCredentials() { - return this.getBasicAuthUsername() != null && this.getBasicAuthPassword() != null - && !this.getBasicAuthUsername().isEmpty() && !this.getBasicAuthPassword().isEmpty(); - } - - public String getBasicAuthUsername() { - return this.configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_USERNAME); - } - - public String getBasicAuthPassword() { - return this.configuration.getProperty(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_PASSWORD); - } - - @Override - public long getArchiveCheckIntervalSeconds() { - return configuration.getPropertyLong(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL).orElse(0L); - } - - public boolean trustAllCerts() { - return configuration.getPropertyBoolean(SECTION_MARKER_ES, PROPERTY_KEY_TRUSTALLCERTS); - } - - public void setArchiveCheckIntervalSeconds(long seconds) { - configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL, seconds); - } - - @Override - public long getArchiveLifetimeSeconds() { - return configuration.getPropertyLong(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT).orElse(0L); - } - - public void setArchiveLimit(long seconds) { - configuration.setProperty(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT, seconds); - } - - @Override - public String getSectionName() { - return SECTION_MARKER_ES; - } - - @Override - public synchronized void defaults() { - // Add default if not available - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_DBHOSTS, defaultHostinfo); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_LIMIT, - DEFAULT_ARCHIVE_LIMIT_SEC); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_CLUSTER, DEFAULT_VALUE_CLUSTER); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_ARCHIVE_INTERVAL, - DEFAULT_ARCHIVE_INTERVAL_SEC); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_NODE, DEFAULT_VALUE_NODE); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_USERNAME, - DEFAULT_VALUE_DBUSERNAME); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_AUTH_PASSWORD, - DEFAULT_VALUE_DBPASSWORD); - configuration.setPropertyIfNotAvailable(SECTION_MARKER_ES, PROPERTY_KEY_TRUSTALLCERTS, - DEFAULT_VALUE_TRUSTALLCERTS); - - } - - @Override - public void unregisterConfigChangedListener(IConfigChangedListener archiveCleanService) { - configuration.unregisterConfigChangedListener(archiveCleanService); - } - - @Override - public void registerConfigChangedListener(IConfigChangedListener archiveCleanService) { - configuration.registerConfigChangedListener(archiveCleanService); - } - - /** @TODO Shift to own class **/ - private static String printHosts(HostInfo[] h) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < h.length; i++) { - sb.append(h[i].toUrl()); - if (i != h.length - 1) { - sb.append(","); - } - } - return sb.toString(); - } - - /** @TODO Shift to own class **/ - private static HostInfo[] parseHosts(String string) { - List infos = new ArrayList<>(); - String[] list = string.split(","); - if (list.length > 0) { - for (String item : list) { - try { - URL url = new URL(item); - infos.add(new HostInfo(url.getHost(), url.getPort(), Protocol.getValueOf(url.getProtocol()))); - } catch (MalformedURLException e) { - LOG.warn("problem parsing url {} : {}", item, e.getMessage()); - } - } - } - HostInfo[] a = new HostInfo[infos.size()]; - return infos.toArray(a); - } - - @Override - public String toString() { - return "EsConfig [getNode()=" + getNode() + ", getHosts()=" + Arrays.toString(getHosts()) + ", getCluster()=" - + getCluster() + ", getArchiveCheckIntervalSeconds()=" + getArchiveCheckIntervalSeconds() - + ", getArchiveLifetimeSeconds()=" + getArchiveLifetimeSeconds() + ", getSectionName()=" - + getSectionName() + "]"; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java new file mode 100644 index 000000000..7ae7a7d40 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java @@ -0,0 +1,92 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMediatorserver; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MediatorServerDataProvider implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(MediatorServerDataProvider.class); + + private final HtDatabaseMediatorserver dbClient; + private final int REFRESH_INTERVAL = 60; + private final Map entries; + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private boolean isRunning; + + public MediatorServerDataProvider(HtDatabaseMediatorserver entryProvider) { + this.entries = new HashMap<>(); + this.dbClient = entryProvider; + this.scheduler.scheduleAtFixedRate(onTick, this.REFRESH_INTERVAL, this.REFRESH_INTERVAL, TimeUnit.SECONDS); + LOG.info("Start {}", this.getClass().getName()); + } + + + private final Runnable onTick = new Runnable() { + + @Override + public void run() { + isRunning = true; + runIt(); + isRunning = false; + } + + }; + + private void runIt() { + List result = this.dbClient.getAll(); + for (MediatorServerEntity item : result) { + MediatorServerDataProvider.this.entries.put(item.getId(), item); + } + } + + /** + * + * @param dbServerId + * @return url or null if not exists + */ + public String getHostUrl(String dbServerId) { + MediatorServerEntity info = this.entries.getOrDefault(dbServerId, null); + return info == null ? null : info.getUrl(); + } + + public boolean triggerReloadSync() { + if (!isRunning) { + runIt(); + } + return true; + } + + @Override + public void close() throws Exception { + this.scheduler.shutdown(); + } +} diff --git a/sdnr/wt/data-provider/provider/src/main/resources/about/README.json b/sdnr/wt/data-provider/provider/src/main/resources/about/README.json new file mode 100644 index 000000000..f39a4c233 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/resources/about/README.json @@ -0,0 +1,16 @@ +{ + "version-info":{ + "ONAP-release":"{release-name}", + "ONAP-release-version":"{release-version}", + "Opendaylight-release":"{odl-version}", + "ONAP-CCSDK-version":"{ccsdk-version}", + "Build-timestamp":"{build-time}", + "Yangtools-version":"{yangtools-version}", + "MD-SAL-version":"{mdsal-version}", + "SDN-R packages version":"{package-version} ({package-githash})", + "Cluster size":"{cluster-size}" + }, + "device-managers":{devicemanagers}, + "system-info":{} + +} \ No newline at end of file diff --git a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml index 686af61d6..d5f8a991a 100644 --- a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml +++ b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -28,23 +28,10 @@ - - - - - - - - - - - + + - @@ -87,6 +74,7 @@ + 0); } diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java index 5a8c549d8..c407859d5 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java @@ -39,8 +39,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.BaseRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; @@ -125,7 +126,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro public class TestCRUDforDatabase { - private static ElasticSearchDataProvider dbProvider; + private static DatabaseDataProvider dbProvider; private static HtDatabaseClient dbRawProvider; @BeforeClass diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java index 9a96986c0..8c62ec9d5 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java @@ -31,7 +31,7 @@ import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section; import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java index d06486550..dd285754a 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java @@ -27,7 +27,7 @@ import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConfigurationException; import org.onap.ccsdk.features.sdnr.wt.common.util.ResourceFileLoader; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig; public class TestConfiguration { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java index b83034d90..dc5e049fd 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java @@ -37,8 +37,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; @@ -70,7 +71,7 @@ import org.opendaylight.yangtools.yang.common.Uint32; * */ public class TestEventService { - private static ElasticSearchDataProvider dbProvider; + private static DatabaseDataProvider dbProvider; private static HtDatabaseClient dbRawProvider; private static HtDatabaseEventsService service = null; @@ -154,7 +155,7 @@ public class TestEventService { service.writeFaultLog(createFaultLog(NODEID2, OBJECTREFID2, "problem", SeverityType.Major, 1)); TestCRUDforDatabase.trySleep(100); now = new Date(); - int numOlds = service.getNumberOfOldObjects(now); + long numOlds = service.getNumberOfOldObjects(now); assertEquals(5, numOlds); TestCRUDforDatabase.trySleep(100); service.writeFaultLog(createFaultLog(NODEID, OBJECTREFID2, "problem", SeverityType.Major, 3)); @@ -205,11 +206,12 @@ public class TestEventService { clearDbEntity(Entity.NetworkelementConnection); List nes = service.getNetworkElementConnections(); assertEquals(0, nes.size()); - service.updateNetworkConnection22(createNeConnection(NODEID, NetworkElementDeviceType.Unknown), NODEID); - service.updateNetworkConnection22(createNeConnection(NODEID2, NetworkElementDeviceType.ORAN), NODEID2); + service.updateNetworkConnection22(createNeConnection(NODEID, NetworkElementDeviceType.Unknown, null), NODEID); + service.updateNetworkConnection22(createNeConnection(NODEID, NetworkElementDeviceType.Unknown, "old"), NODEID); + service.updateNetworkConnection22(createNeConnection(NODEID2, NetworkElementDeviceType.ORAN, "old"), NODEID2); nes = service.getNetworkElementConnections(); assertEquals(2, nes.size()); - service.updateNetworkConnectionDeviceType(createNeConnection(NODEID, NetworkElementDeviceType.Wireless), + service.updateNetworkConnectionDeviceType(createNeConnection(NODEID, NetworkElementDeviceType.Wireless,"old"), NODEID); nes = service.getNetworkElementConnections(); assertEquals(2, nes.size()); @@ -278,12 +280,13 @@ public class TestEventService { /** * @param devType + * @param mountMethod * @param nodename3 * @return */ - private static NetworkElementConnectionEntity createNeConnection(String nodeId, NetworkElementDeviceType devType) { + private static NetworkElementConnectionEntity createNeConnection(String nodeId, NetworkElementDeviceType devType, String mountMethod) { return new NetworkElementConnectionBuilder().setNodeId(nodeId).setHost("host") - .setPort(YangHelper2.getLongOrUint32(1234L)).setCoreModelCapability("123") + .setPort(YangHelper2.getLongOrUint32(1234L)).setCoreModelCapability("123")//.setMountMethod(mountMethod) .setStatus(ConnectionLogStatus.Connected).setDeviceType(devType).setIsRequired(true).build(); } diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java index 68d367668..8a4e3e202 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java @@ -29,7 +29,7 @@ import java.util.List; import org.junit.Test; import org.mockito.Mockito; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder; @@ -66,7 +66,7 @@ public class TestFilterConversion extends Mockito { List filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY).setFiltervalue("si?ba").build()); when(input.getFilter()).thenReturn(YangHelper2.getListOrMap(FilterKey.class, filters)); try { - new QueryByFilter(input).getSearchRequestByFilter("test1", "test2", "test3", "test4"); + new QueryByFilter(input).getSearchRequestByFilter("test1", "test2", "test3", "test4", false); fail(); } catch (IllegalArgumentException e) { // fails if type not correct diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java index 16dfa0ec6..3c983e7a7 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java @@ -81,7 +81,6 @@ public class TestImplementation { } impl.setStatus(StatusKey.CLUSTER_SIZE, "3"); - impl.setReadyStatus(true); try { impl.close(); } catch (Exception e) { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java index ed8eac949..ce1bd78fa 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java @@ -28,10 +28,10 @@ import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.BeforeClass; import org.junit.Test; -import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory; @@ -39,16 +39,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro public class TestInventoryConsistency { private static final String TEST1NODEID = "sim1"; - private static String resourceDirectoryPath = "/" + TestTree.class.getSimpleName() + "/"; - private static ElasticSearchDataProvider dbProvider; - private static HtDatabaseClient dbRawProvider; + private static DatabaseDataProvider dbProvider; @BeforeClass public static void init() throws Exception { HostInfo[] hosts = HostInfoForTest.get(); dbProvider = new ElasticSearchDataProvider(hosts); dbProvider.waitForYellowDatabaseStatus(30, TimeUnit.SECONDS); - dbRawProvider = HtDatabaseClient.getClient(hosts); } @Test diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java index b9516b363..e85ed8cdd 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java @@ -33,7 +33,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; @@ -45,7 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro */ public class TestMaintenanceServiceData { - private static ElasticSearchDataProvider dbProvider; + private static DatabaseDataProvider dbProvider; private static HtDatabaseClient dbRawProvider; private static HtDatabaseMaintenance service = null; diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java index 5b4bc3e0f..408f6a636 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java @@ -32,8 +32,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.MediatorServerDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutputBuilder; @@ -43,7 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro * @author Michael Dürre */ public class TestMediatorServerService { - private static ElasticSearchDataProvider dbProvider; + private static DatabaseDataProvider dbProvider; private static HtDatabaseClient dbRawProvider; private static MediatorServerDataProvider service = null; @@ -54,7 +55,7 @@ public class TestMediatorServerService { dbProvider = new ElasticSearchDataProvider(hosts); dbProvider.waitForYellowDatabaseStatus(30, TimeUnit.SECONDS); dbRawProvider = HtDatabaseClient.getClient(hosts); - service = new MediatorServerDataProvider(hosts); + service = new MediatorServerDataProvider(dbProvider.getHtDatabaseMediatorServer()); } @Test diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java index ad525b910..4a36262fd 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java @@ -30,7 +30,7 @@ import org.json.JSONObject; import org.junit.Test; import org.mockito.Mockito; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter; diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java index 28f7d49fe..29f35560e 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java @@ -35,7 +35,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest; import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet.EntityWithTree; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeObject; @@ -46,7 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro public class TestTree { private static String resourceDirectoryPath = "/" + TestTree.class.getSimpleName() + "/"; - private static ElasticSearchDataProvider dbProvider; + private static DatabaseDataProvider dbProvider; private static HtDatabaseClient dbRawProvider; @BeforeClass diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java index fd397840e..3fcbdb84c 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java @@ -30,7 +30,7 @@ import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; public class TestUserdata { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java index 524659e99..611533ba1 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java @@ -37,7 +37,7 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder; import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest; import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest; -import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsDataObjectReaderWriter2; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2; import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper; diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java new file mode 100644 index 000000000..276bcf4a1 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java @@ -0,0 +1,169 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util; + +import static org.junit.Assert.fail; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper.UnableToMapClassException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata15mEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata24hEntity; +import ch.vorburger.exec.ManagedProcessException; +import ch.vorburger.mariadb4j.DB; +import ch.vorburger.mariadb4j.DBConfigurationBuilder; + +public class MariaDBTestBase { + + private final SqlDBDataProvider dbProvider; + private final DB db; + private static final Map envDefaultValues = initEnvDefaultValues(); + + public MariaDBTestBase() throws ManagedProcessException { + this(new Random().nextInt(1000) + 50000); + } + + private static Map initEnvDefaultValues() { + Map defaults = new HashMap<>(); + defaults.put("SDNRDBHOST", "localhost"); + defaults.put("SDNRDBDATABASE", "test"); + + return defaults; + } + + public MariaDBTestBase(String host, int port) { + EnvGetter env = Section.getEnvGetter(); + envDefaultValues.put("SDNRDBPORT", String.valueOf(port)); + envDefaultValues.put("SDNRDBHOST", host); + envDefaultValues.put("SDNRDBDATABASE", "sdnrdb"); + envDefaultValues.put("SDNRDBUSERNAME", "sdnrdb"); + envDefaultValues.put("SDNRDBPASSWORD", "sdnrdb"); + Section.setEnvGetter((envname) -> { + return envDefaultValues.getOrDefault(envname, env.getenv(envname)); + }); + SqlDBConfig config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties")); + this.db = null; + this.dbProvider = new SqlDBDataProvider(config); + testCreateTable(this.dbProvider.getDBService()); + } + + public MariaDBTestBase(int port) throws ManagedProcessException { + EnvGetter env = Section.getEnvGetter(); + envDefaultValues.put("SDNRDBPORT", String.valueOf(port)); + Section.setEnvGetter((envname) -> { + return envDefaultValues.getOrDefault(envname, env.getenv(envname)); + }); + SqlDBConfig config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties")); + //start db server + this.db = startDatabase(port); + //create db with name sdnrdb + this.dbProvider = new SqlDBDataProvider(config); + testCreateTable(this.dbProvider.getDBService()); + } + + public void close() throws ManagedProcessException { + if (db != null) { + this.db.stop(); + } + + } + + public SqlDBDataProvider getDbProvider() { + return dbProvider; + } + + public DB getDb() { + return db; + } + + private static DB startDatabase(int port) throws ManagedProcessException { + // Start MariaDB4j database + DBConfigurationBuilder dbconfig = DBConfigurationBuilder.newBuilder(); + dbconfig.setPort(port); // 0 => autom. detect free port + DB db = DB.newEmbeddedDB(dbconfig.build()); + db.start(); + return db; + } + public static void testCreateTable(SqlDBClient dbService) { + createTableOdl(dbService); + createTable(dbService, ConnectionlogEntity.class, Entity.Connectionlog, true); + createTable(dbService, EventlogEntity.class, Entity.Eventlog, true); + createTable(dbService, FaultcurrentEntity.class, Entity.Faultcurrent, false); + createTable(dbService, FaultlogEntity.class, Entity.Faultlog, true); + createTable(dbService, GuicutthroughEntity.class, Entity.Guicutthrough, true); + createTable(dbService, Pmdata15mEntity.class, Entity.Historicalperformance15min, false); + createTable(dbService, Pmdata24hEntity.class, Entity.Historicalperformance24h, false); + createTable(dbService, InventoryEntity.class, Entity.Inventoryequipment, false); + createTable(dbService, MaintenanceEntity.class, Entity.Maintenancemode, false); + createTable(dbService, MediatorServerEntity.class, Entity.MediatorServer, true); + createTable(dbService, NetworkElementConnectionEntity.class, Entity.NetworkelementConnection, false); + } + public static boolean createTableOdl(SqlDBClient dbService) { + String createStatement = null; + createStatement = SqlDBMapper.createTableOdl(); + System.out.println(createStatement); + try { + return dbService.write(createStatement); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + } + return false; + } + + public static boolean createTable(SqlDBClient dbService, Class cls, Entity entity, boolean autoIndex) { + String createStatement = null; + try { + createStatement = SqlDBMapper.createTable(cls, entity, "", autoIndex); + } catch (UnableToMapClassException e) { + fail(e.getMessage()); + } + System.out.println(createStatement); + try { + return dbService.write(createStatement); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + } + return false; + } +} diff --git a/sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json b/sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json new file mode 100644 index 000000000..30a4e0a45 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json @@ -0,0 +1,40 @@ +{ + "key-credential": [ + { + "key-id": "ODL_private_key_0", + "passphrase": "jKNzkicDKmVrpOehbo/Jtw==", + "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd" + }, + { + "key-id": "ODL_private_key_1", + "passphrase": "jKNzkicDKmVrpOehbo/Jtw==", + "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd" + }, + { + "key-id": "ODL_private_key_2", + "passphrase": "jKNzkicDKmVrpOehbo/Jtw==", + "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd" + }, + { + "key-id": "ODL_private_key_3", + "passphrase": "jKNzkicDKmVrpOehbo/Jtw==", + "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd" + } + ], + "trusted-certificate": [ + { + "name": "xNF_CA_certificate_0_0", + "certificate": "MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYD\nVQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEP\nMA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUg\nQ0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0\nMTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgM\nDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEM\nMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkB\nFhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTS\nL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12\nuOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCU\nbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3Q\naDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyW\ncm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZ\nsHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/\nIKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fT\nUhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKi\nh+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyV\nhBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D\n8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/\n9g==" + } + ], + "private-key": [ + { + "name": "ODL_private_key_0", + "data": "MIIEpAIBAAKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68\nSfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt\n6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4\nVDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuH\nQwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UE\nFI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABAoIBAQCZN9kR8DGu6V7y\nt0Ax68asL8O5B/OKaHWKQ9LqpVrXmikZJOxkbzoGldow/CIFoU+q+Zbwu9aDa65a\n0wiP7Hoa4Py3q5XNNUrOQDyU/OYC7cI0I83WS0lJ2zOJGYj8wKae5Z81IeQFKGHK\n4lsy1OGPAvPRGh7RjUUgRavA2MCwe07rWRuDb/OJFe4Oh56UMEjwMiNBtMNtncog\nj1vr/qgRJdf9tf0zlJmLvUJ9+HSFFV9I/97LJyFhb95gAfHkjdVroLVgT3Cho+4P\nWtZaKCIGD0OwfOG2nLV4leXvRUk62/LMlB8NI9+JF7Xm+HCKbaWHNWC7mvWSLV58\nZl4AbUWRAoGBANyJ6SFHFRHSPDY026SsdMzXR0eUxBAK7G70oSBKKhY+O1j0ocLE\njI2krHJBhHbLlnvJVyMUaCUOTS5m0uDw9hgSsAqeSL3hL38kxVZw+KNG9Ouno1Fl\nKnE/xXHlPQyeGs/P8nAMzHZxQtEsQdQayJEhK2XXHTsy7Q3MxDisfVJ1AoGBANfD\n34gB+OMx6pwj7zk3qWbYXSX8xjCZMR0ciko+h4xeMP2N8B0oyoqC+v1ABMAtJ3wG\nsGZd0hV9gwM7OUM3SEwkn6oeg1GemWLcn4rlSmTnZc4aeVwrEWlnSNFX3s4g9l4u\nk8Ugu4MVJYqH8HuDQ5Ggl6/QAwPzMSEdCW0O+jOfAoGAIBRbegC5+t6m7Yegz4Ja\ndxV1g98K6f58x+MDsQu4tYWV4mmrQgaPH2dtwizvlMwmdpkh+LNWNtWuumowkJHc\nakIFo3XExQIFg6wYnGtQb4e5xrGa2xMpKlIJaXjb+YLiCYqJDG2ALFZrTrvuU2kV\n9a5qfqTc1qigvNolTM0iaaUCgYApmrZWhnLUdEKV2wP813PNxfioI4afxlpHD8LG\nsCn48gymR6E+Lihn7vuwq5B+8fYEH1ISWxLwW+RQUjIneNhy/jjfV8TgjyFqg7or\n0Sy4KjpiNI6kLBXOakELRNNMkeSPopGR2E7v5rr3bGD9oAD+aqX1G7oJH/KgPPYd\nVl7+ZwKBgQDcHyWYrimjyUgKaQD2GmoO9wdcJYQ59ke9K+OuGlp4ti5arsi7N1tP\nB4f09aeELM2ASIuk8Q/Mx0jQFnm8lzRFXdewgvdPoZW/7VufM9O7dGPOc41cm2Dh\nyrTcXx/VmUBb+/fnXVEgCv7gylp/wtdTGHQBQJHR81jFBz0lnLj+gg==", + "certificate-chain": [ + "MIIECTCCAvGgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCQ1ox\nFjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoM\nBkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJ\nKoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MB4XDTE1MDczMDA3MjcxOFoX\nDTM1MDcyNTA3MjcxOFowgYUxCzAJBgNVBAYTAkNaMRYwFAYDVQQIDA1Tb3V0aCBN\nb3JhdmlhMQ8wDQYDVQQKDAZDRVNORVQxDDAKBgNVBAsMA1RNQzEXMBUGA1UEAwwO\nZXhhbXBsZSBjbGllbnQxJjAkBgkqhkiG9w0BCQEWF2V4YW1wbGVjbGllbnRAbG9j\nYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueCQaNQWoNmF\nK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68SfFNaY06zZl8QB9W02nr5kWeeMY0\nVA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt6jAWZDzVfopwpJPAzRPxACDftIqF\nGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4VDUHSNVbglc+u4UbEzNIFXMdEFsJ\nZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuHQwAHdubuB07ObM2z01UhyEdDvEYG\nHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UEFI1yTYw+xZ42HgFx3uGwApCImxhb\nj69GBYWFqwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu\nU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUXGpLeLnh2cSDARAV\nA7KrBxGYpo8wHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gwDQYJKoZI\nhvcNAQELBQADggEBAJPV3RTXFRtNyOU4rjPpYeBAIAFp2aqGc4t2J1c7oPp/1n+l\nZvjnwtlJpZHxMM783e2ryDQ6dkvXDf8kpwKlg3U3mkJ3xKkDdWrM4QwghXdCN519\naa9qmu0zdFL+jUAaWlQ5tsceOrvbusCcbMqiFGk/QfpHqPv52SVWbYyUx7IX7DE+\nUjgsLHycfV/tlcx4ZE6soTzl9VdgSL/zmzG3rjsr58J80rXckLgBhvijgBlIAJvW\nfC7D0vaouvBInSFXymdPVoUDZ30cdGLf+hI/i/TfsEMOinLrXVdkSGNo6FXAHKSv\nXeB9oFKSzhQ7OPyRyqvEPycUSw/qD6FVr80oDDc=", + "MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYD\nVQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEP\nMA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUg\nQ0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0\nMTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgM\nDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEM\nMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkB\nFhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTS\nL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12\nuOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCU\nbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3Q\naDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyW\ncm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZ\nsHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/\nIKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fT\nUhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKi\nh+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyV\nhBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D\n8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/\n9g==\n" + ] + } + ] +} \ No newline at end of file -- cgit 1.2.3-korg