Support for MariaDB 46/122846/8
authorRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Mon, 26 Jul 2021 07:12:00 +0000 (12:42 +0530)
committerKAPIL SINGAL <ks220y@att.com>
Wed, 28 Jul 2021 16:08:00 +0000 (16:08 +0000)
Support for MariaDB

Issue-ID: CCSDK-3384
Signed-off-by: Ravi Pendurty <ravi.pendurty@highstreet-technologies.com>
Change-Id: Ic93ad33257a091f2cd208cdf02d1d7400c256bf0
Signed-off-by: Ravi Pendurty <ravi.pendurty@highstreet-technologies.com>
130 files changed:
sdnr/wt/common-yang/openroadm-pm-types/pom.xml
sdnr/wt/common-yang/utils/pom.xml
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DatabaseVersion.java [moved from sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsVersion.java with 87% similarity]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java
sdnr/wt/data-provider/dblib/pom.xml [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/DatabaseDataProvider.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBClient.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBConfig.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerImpl.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java with 98% similarity]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBDataProvider.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBIndicesEntry.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/DatabaseIdGenerator.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/FaultEntityManager.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseEventsService.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseMaintenanceService.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/QueryResult.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/SqlDBQueryByFilter.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBMapper.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriter.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterFault.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterPm.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBStatusReader.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/CountQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/DeleteQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/InsertQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SelectQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SqlQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpdateQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpsertQuery.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBFilterKeyValuePair.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBKeyValuePair.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RangeSqlDBFilter.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RegexSqlDBFilter.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/SqlDBFilter.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestCRUDMariaDB.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestMariaDataProvider.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestQuerySyntax.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/util/MariaDBTestBase.java [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/resources/inventory.json [new file with mode: 0644]
sdnr/wt/data-provider/dblib/src/test/resources/pmdata15m.json [new file with mode: 0644]
sdnr/wt/data-provider/feature/pom.xml
sdnr/wt/data-provider/installer/pom.xml
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtDatabaseMediatorserver.java [new file with mode: 0644]
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/SdnrDbType.java [new file with mode: 0644]
sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
sdnr/wt/data-provider/pom.xml
sdnr/wt/data-provider/provider/pom.xml
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java [deleted file]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java with 94% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java with 97% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java with 78% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java with 87% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java with 89% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java with 97% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java with 93% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java with 97% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java with 95% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java with 98% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java with 96% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java with 89% similarity]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java [deleted file]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java with 65% similarity]
sdnr/wt/data-provider/provider/src/main/resources/about/README.json [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json [new file with mode: 0644]
sdnr/wt/data-provider/setup/pom.xml
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/MariaDBTableInfo.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/ElasticsearchDataMigrationProvider.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/MariaDbDataMigrationProvider.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java
sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java
sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/MariaDBTestBase.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBIstanbul.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBMapper.java [new file with mode: 0644]
sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java
sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java
sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java

index aa8ebd3..0467039 100755 (executable)
     <packaging>bundle</packaging>
 
     <name>ccsdk-features :: ${project.artifactId}</name>
-    <dependencies>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-    </dependencies>
+       <dependencies>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.core</groupId>
+                   <artifactId>jackson-databind</artifactId>
+               </dependency>
+       </dependencies>
 </project>
index ef3c22b..2fa1021 100644 (file)
             <artifactId>rfc6991-ietf-yang-types</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-dom-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 
 </project>
index 3086167..c50e321 100644 (file)
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.Nullable;
+import org.opendaylight.mdsal.dom.api.DOMEvent;
+import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.EventInstantAware;
@@ -264,6 +266,9 @@ public class YangToolsMapperHelper {
     public static boolean hasTime(Notification notification) {
         return notification instanceof EventInstantAware;
     }
+    public static boolean hasTime(DOMNotification notification) {
+        return notification instanceof DOMEvent;
+    }
     public static DateAndTime getTime(Notification notification, Instant defaultValue) {
         Instant time;
         if (hasTime(notification)) { // If notification class extends/implements the EventInstantAware
@@ -275,4 +280,16 @@ public class YangToolsMapperHelper {
         }
         return DateAndTime.getDefaultInstance(ZonedDateTime.ofInstant(time, ZoneOffset.UTC).format(formatterOutput));
     }
+
+    public static DateAndTime getTime(DOMNotification notification, Instant defaultValue) {
+        Instant time;
+        if (hasTime(notification)) { // If notification class extends/implements the EventInstantAware
+            time = ((DOMEvent) notification).getEventInstant();
+            LOG.debug("Event time {}", time);
+        } else {
+            time = defaultValue;
+            LOG.debug("Defaulting to actual time of processing the notification - {}", time);
+        }
+        return DateAndTime.getDefaultInstance(ZonedDateTime.ofInstant(time, ZoneOffset.UTC).format(formatterOutput));
+    }
 }
index 46c9660..7dde2ef 100644 (file)
@@ -99,15 +99,15 @@ public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationInt
         Class<?> p2 = setter2.getRawParameterType(0);
         AnnotatedMethod res = null;
 
-        if (this.isAssignable(p1, p2, Map.class, List.class)) {
+        if (isAssignable(p1, p2, Map.class, List.class)) {
                        res = p1.isAssignableFrom(List.class) ? setter1 : setter2; //prefer List setter
-        } else if (this.isAssignable(p1, p2, Uint64.class, BigInteger.class)) {
+        } else if (isAssignable(p1, p2, Uint64.class, BigInteger.class)) {
             res = setter1;
-        } else if (this.isAssignable(p1, p2, Uint32.class, Long.class)) {
+        } else if (isAssignable(p1, p2, Uint32.class, Long.class)) {
             res = setter1;
-        } else if (this.isAssignable(p1, p2, Uint16.class, Integer.class)) {
+        } else if (isAssignable(p1, p2, Uint16.class, Integer.class)) {
             res = setter1;
-        } else if (this.isAssignable(p1, p2, Uint8.class, Short.class)) {
+        } else if (isAssignable(p1, p2, Uint8.class, Short.class)) {
             res = setter1;
         }
         if (res == null) {
@@ -123,7 +123,7 @@ public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationInt
         return res;
     }
 
-    private boolean isAssignable(Class<?> p1, Class<?> p2, Class<?> c1, Class<?> c2) {
+    public static boolean isAssignable(Class<?> p1, Class<?> p2, Class<?> c1, Class<?> c2) {
         return ((p1.isAssignableFrom(c1) && p2.isAssignableFrom(c2))
                 || (p2.isAssignableFrom(c1) && p1.isAssignableFrom(c2)));
 
index c12d17e..58e75bd 100644 (file)
@@ -33,6 +33,7 @@ import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.NoSuchElementException;
+import java.util.Optional;
 import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
 import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.BaseIdentityDeserializer;
 import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.ClassDeserializer;
@@ -48,7 +49,25 @@ import org.slf4j.LoggerFactory;
 public class YangToolsDeserializerModifier extends BeanDeserializerModifier {
 
     private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier.class);
-    private static final String getEnumMethodName="valueOf";
+    private static final String getEnumMethodName = "valueOf";
+    private static final String getEnumMethodName2 = "forName";
+
+    @SuppressWarnings("unchecked")
+    public static Enum<?> parseEnum(String value, Class<?> clazz) throws IllegalAccessException,
+            IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+        try {
+            Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
+            Enum<?> result = (Enum<?>) method.invoke(null, value);
+            LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+            return result;
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
+                | NoSuchElementException | SecurityException e) {
+            Method method = clazz.getDeclaredMethod(getEnumMethodName2, String.class);
+            Optional<Enum<?>> result = (Optional<Enum<?>>) method.invoke(null, value);
+            LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+            return result.orElseThrow();
+        }
+    }
 
     @Override
     public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
@@ -60,10 +79,7 @@ public class YangToolsDeserializerModifier extends BeanDeserializerModifier {
                 Class<?> clazz = type.getRawClass();
 
                 try {
-                    Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
-                    Enum<?> result = (Enum<?>) method.invoke(null, jp.getValueAsString());
-                    LOG.debug("Deserialize '{}' with class '{}' to '{}'", jp.getValueAsString(), clazz.getName(), result);
-                    return result;
+                    return parseEnum(jp.getValueAsString(), clazz);
                 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
                         | NoSuchMethodException | NoSuchElementException | SecurityException e) {
                     LOG.warn("problem deserializing enum for {} with value {}: {}", clazz.getName(),
index 96bfa07..54a5172 100644 (file)
@@ -46,7 +46,7 @@ public class ConfigurationFileRepresentation implements IConfigChangedListener {
     private static final Logger LOG = LoggerFactory.getLogger(ConfigurationFileRepresentation.class);
 
     private static final long FILE_POLL_INTERVAL_MS = 1000;
-    private static final String SECTIONNAME_ROOT = "";
+    public static final String SECTIONNAME_ROOT = "";
     private static final String LR = "\n";
     private static final String EMPTY = "";
     // end of constants
index 1f67e5e..8b2dbb0 100644 (file)
@@ -44,7 +44,7 @@ import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
 import org.json.JSONException;
 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.common.database.data.EsVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterHealthRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateAliasRequest;
@@ -150,9 +150,9 @@ public class ExtRestClient {
         this.client = RestClient.builder(get(hosts))
                 .setHttpClientConfigCallback(new BasicAuthHttpClientConfigCallback(username, password, trustAll))
                 .build();
-        EsVersion tmp = autoDetectVersion();
+        DatabaseVersion tmp = autoDetectVersion();
         LOG.info("working with sdnrdb version {}", tmp.toString());
-        this.isES7 = tmp.isNewerOrEqualThan(new EsVersion(7, 0, 0));
+        this.isES7 = tmp.isNewerOrEqualThan(new DatabaseVersion(7, 0, 0));
     }
 
     /**
@@ -160,7 +160,7 @@ public class ExtRestClient {
      * @throws IOException
      * @throws Exception
      */
-    private EsVersion autoDetectVersion() throws IOException, Exception {
+    private DatabaseVersion autoDetectVersion() throws IOException, Exception {
         GetInfoResponse infoResponse = this.getInfo();
         return infoResponse.getVersion();
 
index 232b68c..e4b8893 100644 (file)
@@ -60,6 +60,7 @@ public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, A
     private static final long TIMOUT_MS_DEFAULT = 30000;
     private static final long READ_MAX_SIZE = 9999;
     private final static long SLEEPTIMEMS = 5000;
+    private static final boolean FULLSIZEREQUEST_DEFAULT = false;
 
     private final Logger LOG = LoggerFactory.getLogger(HtDatabaseClient.class);
 
@@ -90,7 +91,7 @@ public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, A
     }
 
     static public HtDatabaseClient getClient(HostInfo[] hosts, String username, String password, boolean trustAll,
-            long timeoutms) throws HtDatabaseClientException {
+            boolean doFullsizeRequests, long timeoutms) throws HtDatabaseClientException {
         return getClient(hosts, REFRESH_AFTER_REWRITE_DEFAULT, username, password, trustAll, TIMOUT_MS_DEFAULT);
     }
 
@@ -261,7 +262,8 @@ public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, A
             total = response.getTotal();
 
         } catch (IOException e) {
-            LOG.warn("Possible Database connection failure. If this error persists, please check Database connectivity");
+            LOG.warn(
+                    "Possible Database connection failure. If this error persists, please check Database connectivity");
             LOG.warn("error do search {}: {}", queryBuilder, e);
         }
         return new SearchResult<SearchHit>(response != null ? response.getHits() : new SearchHit[] {}, total);
index d55e66d..118cf02 100644 (file)
@@ -45,6 +45,10 @@ public class AliasesEntry {
     private final String alias;
     private final String index;
 
+    public AliasesEntry(String index, String alias) {
+        this.alias = alias;
+        this.index = index;
+    }
     public AliasesEntry(String line) throws ParseException {
         final Matcher matcher = pattern.matcher(line);
         if (!matcher.find() || matcher.groupCount() < 2) {
@@ -29,14 +29,14 @@ import org.eclipse.jdt.annotation.NonNull;
  * @author Michael Dürre
  *
  */
-public class EsVersion {
+public class DatabaseVersion {
 
     private final String raw;
     private final int major;
     private final int minor;
     private final int revision;
 
-    public EsVersion(@NonNull String version) throws ParseException {
+    public DatabaseVersion(@NonNull String version) throws ParseException {
         String[] hlp = version.split("\\.");
         if (hlp.length < 3) {
             throw new ParseException("unable to parse version string: " + version, 0);
@@ -57,7 +57,7 @@ public class EsVersion {
      * @param minor
      * @param revision
      */
-    public EsVersion(int major, int minor, int revision) {
+    public DatabaseVersion(int major, int minor, int revision) {
         this.raw = String.format("%d.%d.%d", major, minor, revision);
         this.major = major;
         this.minor = minor;
@@ -87,10 +87,10 @@ public class EsVersion {
 
     @Override
     public boolean equals(Object obj) {
-        if (!(obj instanceof EsVersion)) {
+        if (!(obj instanceof DatabaseVersion)) {
             return false;
         }
-        EsVersion esobj = (EsVersion) obj;
+        DatabaseVersion esobj = (DatabaseVersion) obj;
         return this.major == esobj.major && this.minor == esobj.minor && this.revision == esobj.revision;
     }
 
@@ -99,13 +99,13 @@ public class EsVersion {
         return this.raw.hashCode();
     }
 
-    public boolean isNewerOrEqualThan(EsVersion v) {
+    public boolean isNewerOrEqualThan(DatabaseVersion v) {
         if (this.equals(v)) {
             return true;
         }
         return this.isNewerThan(v);
     }
-    public boolean isNewerThan(EsVersion v) {
+    public boolean isNewerThan(DatabaseVersion v) {
         if (this.major > v.major) {
             return true;
         } else if (this.major < v.major) {
@@ -122,14 +122,14 @@ public class EsVersion {
         return false;
     }
 
-    public boolean isOlderOrEqualThan(EsVersion v) {
+    public boolean isOlderOrEqualThan(DatabaseVersion v) {
         if (this.equals(v)) {
             return true;
         }
         return this.isOlderThan(v);
     }
 
-    public boolean isOlderThan(EsVersion v) {
+    public boolean isOlderThan(DatabaseVersion v) {
         if (this.major < v.major) {
             return true;
         } else if (this.major > v.major) {
index b31ff43..cc7fafb 100644 (file)
@@ -29,7 +29,7 @@ import java.util.regex.Pattern;
  * @author Michael Dürre
  *
  *         Entry of list indices http request (/_cat/indices)
- * 
+ *
  *         yellow open inventoryequipment-v1 5nNPRbJ3T9arMxqxBbJKyQ 5 1 0 0 1.2kb 1.2kb
  */
 public class IndicesEntry {
@@ -93,6 +93,20 @@ public class IndicesEntry {
         return size2;
     }
 
+    protected IndicesEntry(String name, String status, String status2, String hash, int shards, int replicas, int c1,
+            int c2, String size1, String size2) {
+        this.name = name;
+        this.status = status;
+        this.status2 = status2;
+        this.hash = hash;
+        this.shards = shards;
+        this.replicas = replicas;
+        this.c1 = c1;
+        this.c2 = c2;
+        this.size1 = size1;
+        this.size2 = size2;
+    }
+
     public IndicesEntry(String line) throws ParseException {
         Matcher matcher = pattern.matcher(line.trim());
         if (!matcher.find() || matcher.groupCount() < 10) {
index 519502e..265c6f5 100644 (file)
@@ -100,4 +100,17 @@ public class QueryBuilder {
     public QueryBuilder aggregations(String key) {
         return this.aggregations(key, null);
     }
+
+    public void doFullsizeRequest() {
+        this.setFullsizeRequest(true);
+    }
+
+    public QueryBuilder setFullsizeRequest(boolean doFullsizeRequest) {
+        if (doFullsizeRequest) {
+            this.outerQuery.put("track_total_hits", doFullsizeRequest);
+        } else {
+            this.outerQuery.remove("track_total_hits");
+        }
+        return this;
+    }
 }
index 946a8fb..79172e0 100644 (file)
@@ -23,7 +23,7 @@ package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
 
 import org.elasticsearch.client.Response;
 import org.json.JSONObject;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.EsVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
 
 public class GetInfoResponse extends BaseResponse {
 
@@ -37,7 +37,7 @@ public class GetInfoResponse extends BaseResponse {
     private final String clusterName;
     private final String name;
 
-    private final EsVersion version;
+    private final DatabaseVersion version;
 
     public GetInfoResponse(Response response) throws Exception {
         super(response);
@@ -47,7 +47,7 @@ public class GetInfoResponse extends BaseResponse {
         }
         this.name = o.getString("name");
         this.clusterName = o.getString("cluster_name");
-        this.version = new EsVersion(o.getJSONObject("version").getString("number"));
+        this.version = new DatabaseVersion(o.getJSONObject("version").getString("number"));
     }
 
     public String getClusterName() {
@@ -58,7 +58,7 @@ public class GetInfoResponse extends BaseResponse {
         return name;
     }
 
-    public EsVersion getVersion() {
+    public DatabaseVersion getVersion() {
         return version;
     }
 
index c19cea0..2e07012 100644 (file)
@@ -41,8 +41,10 @@ public class PomFile {
 
     public PomFile(InputStream is) throws ParserConfigurationException, SAXException, IOException {
         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-        // Remediate XML external entity vulnerabilty - prohibit the use of all protocols by external entities:
-        documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+        //             documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+        //             documentBuilderFactory.setFeature(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+        //             documentBuilderFactory.setFeature(XMLInputFactory.SUPPORT_DTD, false);
+
         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
         this.xmlDoc = documentBuilder.parse(is);
     }
index ffb31c6..de878a5 100644 (file)
@@ -113,7 +113,12 @@ public class BaseHTTPClient {
     @Nonnull
     public BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers)
             throws IOException {
-        return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers);
+        return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers, 0);
+    }
+    @Nonnull
+    public BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers, int timeoutMs)
+            throws IOException {
+        return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers, timeoutMs);
     }
     public BaseHTTPResponse sendRequest(HttpServletRequest req) throws IOException {
         final String method = req.getMethod();
@@ -125,7 +130,7 @@ public class BaseHTTPClient {
             is.close();
 
         }
-        return this.sendRequest(req.getRequestURI(), method, buffer,mapHeaders(req));
+        return this.sendRequest(req.getRequestURI(), method, buffer,mapHeaders(req), 0);
     }
 
     private Map<String, String> mapHeaders(HttpServletRequest req) {
@@ -138,8 +143,10 @@ public class BaseHTTPClient {
         }
         return headers;
     }
-
-    protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers)
+    protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers) throws IOException {
+       return this.sendRequest(uri, method, body, headers, 0);
+    }
+    protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers, int timeoutMs)
             throws IOException {
         if (uri == null) {
             uri = "";
@@ -156,7 +163,7 @@ public class BaseHTTPClient {
         LOG.trace("body:" + (body == null ? "null" : new String(body, CHARSET)));
         URL url = new URL(surl);
         URLConnection http = url.openConnection();
-        http.setConnectTimeout(this.timeout);
+        http.setConnectTimeout(timeoutMs>0?timeoutMs:this.timeout);
         if (surl.toString().startsWith("https")) {
             if (sc != null) {
                 ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory());
index 883d48a..c2471f5 100644 (file)
@@ -32,7 +32,7 @@ import java.text.ParseException;
 import org.junit.Test;
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntry;
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.EsVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntry;
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
 
@@ -45,9 +45,9 @@ public class TestEsData {
 
     @Test
     public void testVersion() {
-        EsVersion version = null;
+        DatabaseVersion version = null;
         try {
-            version = new EsVersion("2.3.4");
+            version = new DatabaseVersion("2.3.4");
         } catch (ParseException e) {
             fail(e.getMessage());
         }
@@ -56,8 +56,8 @@ public class TestEsData {
         assertEquals(3, version.getMinor());
         assertEquals(4, version.getRevision());
 
-        EsVersion versionNewer = new EsVersion(5, 0, 0);
-        EsVersion versionOlder = new EsVersion(2, 2, 0);
+        DatabaseVersion versionNewer = new DatabaseVersion(5, 0, 0);
+        DatabaseVersion versionOlder = new DatabaseVersion(2, 2, 0);
 
         assertTrue(version.isOlderOrEqualThan(versionNewer));
         assertTrue(version.isNewerOrEqualThan(versionOlder));
diff --git a/sdnr/wt/data-provider/dblib/pom.xml b/sdnr/wt/data-provider/dblib/pom.xml
new file mode 100644 (file)
index 0000000..c4c3d86
--- /dev/null
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ ============LICENSE_START=======================================================
+  ~ ONAP : ccsdk features
+  ~ ================================================================================
+  ~ Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
+  ~ All rights reserved.
+  ~ ================================================================================
+  ~ Update Copyright (C) 2020 AT&T 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=======================================================
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>2.2.0-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-data-provider-dblib</artifactId>
+    <version>1.2.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>ccsdk-features :: ${project.artifactId}</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-yang-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-data-provider-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+       <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.netconf</groupId>
+            <artifactId>sal-netconf-connector</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc6991-ietf-yang-types</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>yang-binding</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-singleton-common-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <!--  MariaDB start -->
+        <dependency> <!-- Not part of ODL karaf standard delivery -->
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-jdbc</artifactId>
+        </dependency>
+        <dependency> <!--  Not part of ODL karaf standard delivery -->
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.vorburger.mariaDB4j</groupId>
+            <artifactId>mariaDB4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!--  MariaDB end -->
+    </dependencies>
+
+</project>
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/DatabaseDataProvider.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/DatabaseDataProvider.java
new file mode 100644 (file)
index 0000000..9d4beb7
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * ============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;
+
+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.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.EntityInput;
+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;
+
+
+public interface DatabaseDataProvider {
+
+    HtDatabaseClient getRawClient();
+
+    ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input);
+
+    ReadFaultlogListOutputBuilder readFaultLogList(EntityInput input);
+
+    ReadMaintenanceListOutputBuilder readMaintenanceList(EntityInput input);
+
+    ReadMediatorServerListOutputBuilder readMediatorServerList(EntityInput input);
+
+    ReadNetworkElementConnectionListOutputBuilder readNetworkElementConnectionList(EntityInput input);
+
+    ReadInventoryListOutputBuilder readInventoryList(EntityInput input);
+
+    ReadConnectionlogListOutputBuilder readConnectionlogList(EntityInput input);
+
+    ReadEventlogListOutputBuilder readEventlogList(EntityInput input) throws IOException;
+
+    ReadPmdata15mListOutputBuilder readPmdata15mList(EntityInput input);
+
+    ReadPmdata24hListOutputBuilder readPmdata24hList(EntityInput input);
+
+    ReadPmdata15mLtpListOutputBuilder readPmdata15mLtpList(EntityInput input) throws IOException;
+
+    ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException;
+
+    ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException;
+
+    ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input) throws IOException;
+
+    ReadStatusOutputBuilder readStatus() throws IOException;
+
+    boolean waitForYellowDatabaseStatus(long timeout, TimeUnit unit);
+
+    CreateNetworkElementConnectionOutputBuilder createNetworkElementConnection(NetworkElementConnectionEntity input)
+            throws IOException;
+
+    UpdateNetworkElementConnectionOutputBuilder updateNetworkElementConnection(
+            UpdateNetworkElementConnectionInput input) throws IOException;
+
+    DeleteNetworkElementConnectionOutputBuilder deleteNetworkElementConnection(
+            DeleteNetworkElementConnectionInput input) throws IOException;
+
+    DeleteMediatorServerOutputBuilder deleteMediatorServer(DeleteMediatorServerInput input) throws IOException;
+
+    DeleteMaintenanceOutputBuilder deleteMaintenance(DeleteMaintenanceInput input) throws IOException;
+
+    UpdateMaintenanceOutputBuilder updateMaintenance(UpdateMaintenanceInput input) throws IOException;
+
+    UpdateMediatorServerOutputBuilder updateMediatorServer(UpdateMediatorServerInput input) throws IOException;
+
+    CreateMaintenanceOutputBuilder createMaintenance(CreateMaintenanceInput input) throws IOException;
+
+    CreateMediatorServerOutputBuilder createMediatorServer(CreateMediatorServerInput input) throws IOException;
+
+    ReadGuiCutThroughEntryOutputBuilder readGuiCutThroughEntry(EntityInput input);
+
+    DataProvider getDataProvider();
+
+    HtDatabaseMaintenance getHtDatabaseMaintenance();
+
+    HtDatabaseMediatorserver getHtDatabaseMediatorServer();
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBClient.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBClient.java
new file mode 100644 (file)
index 0000000..f16eadd
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * ============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.sqldb;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.onap.ccsdk.features.sdnr.wt.common.database.Portstatus;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntry;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBIndicesEntry;
+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.Entity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SqlDBClient {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlDBClient.class);
+
+    // matches:
+    //  1=>type, e.g. mariadb, mysql, ...
+    //  2=>host
+    //  3=>port
+    //  4=>dbname
+    private static final String DBURL_REGEX = "^jdbc:([^:]+):\\/\\/([^:]+):([0-9]+)\\/(.+)$";
+    private static final Pattern DBURL_PATTERN = Pattern.compile(DBURL_REGEX);
+    private static final String DBVERSION_REGEX = "^([\\d]+\\.[\\d]+\\.[\\d]+)";
+    private static final Pattern DBVERSION_PATTERN = Pattern.compile(DBVERSION_REGEX);
+    private static final String SELECT_VERSION_QUERY = "SELECT @@version as version";
+
+    private static final String DBNAME_DEFAULT = "sdnrdb";
+    private final String dbConnectionString;
+    private final String dbName;
+    private final String dbHost;
+    private final int dbPort;
+
+    /**
+     *
+     * @param dbUrl e.g. jdbc:mysql://sdnrdb:3306/sdnrdb
+     * @param username
+     * @param password
+     */
+    public SqlDBClient(String dbUrl, String username, String password) throws IllegalArgumentException {
+        this.dbConnectionString = String.format("%s?user=%s&password=%s", dbUrl, username, password);
+        final Matcher matcher = DBURL_PATTERN.matcher(dbUrl);
+        if(!matcher.find()) {
+            throw new IllegalArgumentException("unable to parse databaseUrl "+dbUrl);
+        }
+        this.dbHost = matcher.group(2);
+        this.dbPort = Integer.parseInt(matcher.group(3));
+        this.dbName = matcher.group(4);
+    }
+
+    public AliasesEntryList readViews() {
+        return this.readViews(DBNAME_DEFAULT);
+    }
+
+    public AliasesEntryList readViews(String dbName) {
+        AliasesEntryList list = new AliasesEntryList();
+        final String query = "SELECT v.`TABLE_NAME` AS vn, t.`TABLE_NAME` AS tn\n"
+                + "FROM `information_schema`.`TABLES` AS v\n"
+                + "LEFT JOIN `information_schema`.`TABLES` AS t ON t.`TABLE_NAME` LIKE CONCAT(v.`TABLE_NAME`,'%')"
+                + " AND t.`TABLE_TYPE`='BASE TABLE'\n" + "WHERE v.`TABLE_SCHEMA`='" + dbName
+                + "' AND v.`TABLE_TYPE`='VIEW'";
+        ResultSet data = this.read(query);
+        try {
+            while (data.next()) {
+                list.add(new AliasesEntry(data.getString(2), data.getString(1)));
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem reading views: ", e);
+        }
+        return list;
+    }
+
+    public IndicesEntryList readTables() {
+        final String query = "SHOW FULL TABLES WHERE `Table_type` = 'BASE TABLE'";
+        IndicesEntryList list = new IndicesEntryList();
+        ResultSet data = this.read(query);
+        try {
+            while (data.next()) {
+                list.add(new SqlDBIndicesEntry(data.getString(1)));
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem reading tables: ", e);
+        }
+        return list;
+    }
+
+    public void waitForYellowStatus(long timeoutms) {
+        Portstatus.waitSecondsTillAvailable(timeoutms/1000, this.dbHost, this.dbPort);
+    }
+
+    public DatabaseVersion readActualVersion() throws SQLException, ParseException {
+        ResultSet data;
+        try {
+            data = this.read(SELECT_VERSION_QUERY);
+            if (data.next()) {
+                final String s = data.getString(1);
+                final Matcher matcher = DBVERSION_PATTERN.matcher(s);
+                data.afterLast();
+                data.close();
+                if (matcher.find()) {
+                    return new DatabaseVersion(matcher.group(1));
+                } else {
+                    throw new ParseException(String.format("unable to extract version out of string '%s'", s), 0);
+                }
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem reading tables: ", e);
+        }
+        throw new SQLException("unable to read version from database");
+    }
+
+    public boolean createTable(Entity entity, Class<?> clazz, String suffix) throws UnableToMapClassException {
+        String createStatement = SqlDBMapper.createTable(clazz, entity, suffix);
+        return this.createTable(createStatement);
+    }
+
+    public boolean createTable(String tableName, String tableMappings) {
+        final String createStatement = String.format("CREATE TABLE IF NOT EXISTS `%s` (%s)", tableName, tableMappings);
+        return this.createTable(createStatement);
+    }
+
+    public boolean createTable(String query) {
+        try {
+            Connection connection = this.getConnection();
+            PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
+            stmt.execute();
+            connection.close();
+            return true;
+        } catch (SQLException e) {
+            LOG.warn("problem creating table:", e);
+        }
+        return false;
+    }
+
+    public boolean createView(String tableName, String viewName) throws SQLException {
+        try {
+            this.write(String.format("CREATE VIEW IF NOT EXISTS `%s` AS SELECT * FROM `%s`", viewName, tableName));
+            return true;
+        } catch (SQLException e) {
+            LOG.warn("problem deleting table:", e);
+        }
+        return false;
+    }
+
+    public boolean deleteView(String viewName) throws SQLException {
+        try {
+            this.write(String.format("DROP VIEW IF EXISTS `%s`", viewName));
+            return true;
+        } catch (SQLException e) {
+            LOG.warn("problem deleting view:", e);
+        }
+        return false;
+    }
+
+    public boolean update(String query) throws SQLException {
+        boolean result = false;
+        Connection connection = null;
+        connection = DriverManager.getConnection(this.dbConnectionString);
+        Statement stmt = connection.createStatement();
+        result = stmt.execute(query);
+        return stmt.getUpdateCount() > 0 ? stmt.getUpdateCount() > 0 : result;
+    }
+
+    public boolean write(String query) throws SQLException {
+        Connection connection = this.getConnection();
+        PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
+        boolean result = stmt.execute();
+        connection.close();
+        return stmt.getUpdateCount() > 0 ? stmt.getUpdateCount() > 0 : result;
+    }
+
+    public String writeAndReturnId(String query) throws SQLException {
+        Connection connection = this.getConnection();
+        PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
+        stmt.execute();
+        ResultSet generatedKeys = stmt.getGeneratedKeys();
+        connection.close();
+        if (generatedKeys.next()) {
+            return String.valueOf(generatedKeys.getLong(1));
+        }
+        return null;
+    }
+
+    public boolean deleteTable(String tableName) throws SQLException {
+        try {
+            this.write(String.format("DROP TABLE IF EXISTS `%s`", tableName));
+            return true;
+        } catch (SQLException e) {
+            LOG.warn("problem deleting table:", e);
+        }
+        return false;
+    }
+
+    public String getDatabaseName() {
+        return this.dbName;
+    }
+
+    public ResultSet read(String query) {
+        ResultSet data = null;
+        Connection connection = null;
+        Statement stmt = null;
+        try {
+            connection = DriverManager.getConnection(this.dbConnectionString);
+            stmt = connection.createStatement();
+            data = stmt.executeQuery(query);
+        } catch (SQLException e) {
+            LOG.warn("problem reading tables: ", e);
+        } finally {
+            try {
+                if (connection != null) {
+                    connection.close();
+                }
+            } catch (SQLException e) {
+                LOG.warn("problem closing connection: ", e);
+            }
+        }
+
+        return data;
+    }
+
+    public Connection getConnection() throws SQLException {
+        return DriverManager.getConnection(this.dbConnectionString);
+    }
+
+    public boolean delete(String query) throws SQLException {
+        this.write(query);
+        return true;
+    }
+
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBConfig.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBConfig.java
new file mode 100644 (file)
index 0000000..8c7e7b1
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * ============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.database.sqldb;
+
+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.sqldb.data.entity.DatabaseIdGenerator;
+
+public class SqlDBConfig implements Configuration {
+
+    private static final String SECTION_MARKER_MARIADB = "mariadb";
+
+    private static final String PROPERTY_KEY_DBURL = "url";
+    private static final String PROPERTY_KEY_USERNAME = "username";
+    private static final String PROPERTY_KEY_PASSWORD = "password";
+    private static final String PROPERTY_KEY_CONTROLLERID = "controllerId";
+    private static final String PROPERTY_KEY_DBSUFFIX = "suffix";
+
+
+    private static final String DEFAULT_VALUE_DBURL = "${SDNRDBURL}";
+    private static final String DEFAULT_VALUE_DBUSERNAME = "${SDNRDBUSERNAME}";
+    private static final String DEFAULT_VALUE_DBPASSWORD = "${SDNRDBPASSWORD}";
+    private static final String DEFAULT_VALUE_CONTROLLERID = DatabaseIdGenerator.getControllerId();
+    private static final String DEFAULT_VALUE_DBSUFFIX = "-v6";
+
+    private final ConfigurationFileRepresentation configuration;
+
+    public SqlDBConfig(ConfigurationFileRepresentation configuration) {
+
+        this.configuration = configuration;
+        this.configuration.addSection(SECTION_MARKER_MARIADB);
+        defaults();
+    }
+
+
+    /*
+     * Getter
+     */
+
+    public String getUrl() {
+        return configuration.getProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBURL);
+    }
+
+    public void setUrl(String url) {
+        configuration.setProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBURL, url);
+
+    }
+
+    public String getUsername() {
+        return this.configuration.getProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_USERNAME);
+    }
+
+    public String getPassword() {
+        return this.configuration.getProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_PASSWORD);
+    }
+
+    public String getControllerId() {
+        String v = this.configuration.getProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_CONTROLLERID);
+        return (v == null || v.equals("null") || v.isEmpty()) ? null : v;
+    }
+
+    public String getDbSuffix() {
+        return this.configuration.getProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBSUFFIX);
+    }
+
+    @Override
+    public String getSectionName() {
+        return SECTION_MARKER_MARIADB;
+    }
+
+    @Override
+    public synchronized void defaults() {
+        // Add default if not available
+        configuration.setPropertyIfNotAvailable(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBURL, DEFAULT_VALUE_DBURL);
+        configuration.setPropertyIfNotAvailable(SECTION_MARKER_MARIADB, PROPERTY_KEY_USERNAME,
+                DEFAULT_VALUE_DBUSERNAME);
+        configuration.setPropertyIfNotAvailable(SECTION_MARKER_MARIADB, PROPERTY_KEY_PASSWORD,
+                DEFAULT_VALUE_DBPASSWORD);
+        configuration.setPropertyIfNotAvailable(SECTION_MARKER_MARIADB, PROPERTY_KEY_CONTROLLERID,
+                DEFAULT_VALUE_CONTROLLERID);
+        configuration.setPropertyIfNotAvailable(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBSUFFIX, DEFAULT_VALUE_DBSUFFIX);
+
+    }
+
+
+    public void setControllerId(String id) {
+        configuration.setProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_CONTROLLERID, id);
+    }
+
+    public void setDbSuffix(String suffix) {
+        configuration.setProperty(SECTION_MARKER_MARIADB, PROPERTY_KEY_DBSUFFIX, suffix);
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBDataProvider.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBDataProvider.java
new file mode 100644 (file)
index 0000000..94c7dcf
--- /dev/null
@@ -0,0 +1,509 @@
+/*
+ * ============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.database.sqldb.data;
+
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+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.entity.HtDatabaseEventsService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.entity.HtDatabaseMaintenanceService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.rpctypehelper.QueryResult;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBStatusReader;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.DeleteQuery;
+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.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.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.read.mediator.server.list.output.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class SqlDBDataProvider extends HtDatabaseEventsService implements DatabaseDataProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlDBDataProvider.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 HtDatabaseMediatorserver dbMediatorServerService;
+    private final HtDatabaseMaintenance dbMaintenanceService;
+    private final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data> mediatorserverRW;
+    private final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data> maintenanceRW;
+    private final SqlDBStatusReader readStatus;
+
+    public SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data> getMaintenanceReaderWriter() {
+        return this.maintenanceRW;
+    }
+
+    public SqlDBReaderWriter<Data> getMediatorServerReaderWriter() {
+        return this.mediatorserverRW;
+    }
+
+    public SqlDBDataProvider(SqlDBConfig config) {
+        this(config, true);
+    }
+    public SqlDBDataProvider(SqlDBConfig config, boolean initControllerId) {
+        super(config);
+
+        this.mediatorserverRW = new SqlDBReaderWriter<>(this.dbClient, Entity.MediatorServer, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId).setWriteInterface(MediatorServerEntity.class);
+
+        this.maintenanceRW = new SqlDBReaderWriter<>(this.dbClient, Entity.Maintenancemode, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId).setWriteInterface(MaintenanceEntity.class);
+
+        this.readStatus = new SqlDBStatusReader(this.dbClient, this.controllerId);
+
+        this.dbMediatorServerService = new HtDatabaseMediatorserver() {
+
+            @Override
+            public List<MediatorServerEntity> getAll() {
+                return SqlDBDataProvider.this.mediatorserverRW.readAll(MediatorServerEntity.class);
+            }
+        };
+        this.dbMaintenanceService = new HtDatabaseMaintenanceService(this);
+        if(initControllerId) {
+            try {
+                this.setControllerId();
+            } catch (SQLException e) {
+                LOG.warn("problem setting controllerId: ", e);
+            }
+        }
+
+    }
+
+    /*-------------------------
+     * Provide access to model API
+     */
+
+    @Override
+    public ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input) {
+
+        ReadFaultcurrentListOutputBuilder outputBuilder = new ReadFaultcurrentListOutputBuilder();
+
+        QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data> result =
+                this.eventRWFaultCurrent.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data> result =
+                this.eventRWFaultLog.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data> result =
+                this.maintenanceRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.mediator.server.list.output.Data> result =
+                this.mediatorserverRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data> result =
+                this.networkelementConnectionRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data> result =
+                this.equipmentRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data> result =
+                this.connectionlogRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data> result =
+                this.eventlogRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data> result =
+                this.pm15mRW.getData(input);
+        LOG.debug("Read data: readPmdata15mList: {}", result);
+        outputBuilder.setData(result.getResult());
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data> result =
+                this.pm24hRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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<String> result = this.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());
+        return outputBuilder;
+    }
+
+    @Override
+    public ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException {
+        ReadPmdata15mDeviceListOutputBuilder outputBuilder = new ReadPmdata15mDeviceListOutputBuilder();
+        QueryResult<String> result = this.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());
+        return outputBuilder;
+    }
+
+    @Override
+    public ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException {
+
+        QueryResult<String> result = this.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());
+        return outputBuilder;
+    }
+
+    @Override
+    public ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input) throws IOException {
+
+        QueryResult<String> 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());
+        return outputBuilder;
+    }
+
+    @Override
+    public ReadStatusOutputBuilder readStatus() throws IOException {
+        QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data> result =
+                readStatus.getDataStatus();
+
+        ReadStatusOutputBuilder outputBuilder = new ReadStatusOutputBuilder();
+        outputBuilder.setData(result.getResult());
+        return outputBuilder;
+    }
+
+    @Override
+    public CreateNetworkElementConnectionOutputBuilder createNetworkElementConnection(
+            NetworkElementConnectionEntity input) throws IOException {
+        String id = this.networkelementConnectionRW.write(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()) > 0;
+        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()) > 0;
+        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()) > 0;
+        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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data> result =
+                this.guicutthroughRW.getData(input);
+        outputBuilder.setData(result.getResult());
+        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 boolean waitForYellowDatabaseStatus(long timeout, TimeUnit unit) {
+        return true;
+    }
+
+    @Override
+    public DataProvider getDataProvider() {
+        return this;
+    }
+
+    @Override
+    public HtDatabaseMaintenance getHtDatabaseMaintenance() {
+        return this.dbMaintenanceService;
+    }
+
+    @Override
+    public HtDatabaseMediatorserver getHtDatabaseMediatorServer() {
+        return this.dbMediatorServerService;
+    }
+
+    public boolean delete(Entity e, List<Filter> filters) throws SQLException {
+        DeleteQuery query = new DeleteQuery(e, filters);
+        return this.dbClient.write(query.toSql());
+
+    }
+
+    public SqlDBClient getDBService() {
+        return this.dbClient;
+    }
+
+    public boolean setControllerId() throws SQLException {
+        if (this.controllerId == null) {
+            return true;
+        }
+        LOG.info("set controllerId {}", this.controllerId);
+        String query = String.format("SELECT * FROM `%s` WHERE `id`='%s';", this.controllerTableName,
+                this.controllerId);
+        LOG.info(query);
+        ResultSet data = this.dbClient.read(query);
+
+        if (!data.next()) {
+            query = String.format("INSERT INTO `%s` (`id`,`desc`) VALUES ('%s','%s')",
+                    this.controllerTableName, this.controllerId, "");
+            LOG.info(query);
+            return this.dbClient.write(query);
+        }
+        else {
+            LOG.info("controllerId already set");
+        }
+        return true;
+    }
+
+    public void waitForDatabaseReady(int i, TimeUnit unit) {
+        this.dbClient.waitForYellowStatus(unit.convert(i, TimeUnit.MILLISECONDS));
+    }
+
+    public String getControllerId() {
+        return this.controllerId;
+    }
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBIndicesEntry.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBIndicesEntry.java
new file mode 100644 (file)
index 0000000..fdea87c
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * ============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.sqldb.data;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntry;
+
+public class SqlDBIndicesEntry extends IndicesEntry{
+
+    public SqlDBIndicesEntry(String name) {
+        super(name,"","","",0,0,0,0,"","");
+    }
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/DatabaseIdGenerator.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/DatabaseIdGenerator.java
new file mode 100644 (file)
index 0000000..5a9e58c
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * ============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.database.sqldb.data.entity;
+
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+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.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.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;
+
+/**
+ * Database id generator for those classes which need manual id generation by object
+ * implementation for this spec: https://wiki.onap.org/display/DW/SDN-R+Database+for+Instanbul
+ * @author jack
+ *
+ */
+public class DatabaseIdGenerator {
+
+    private static final Pattern FAULTPATTERN = Pattern.compile(".*\\[layerProtocol=(.*)\\]");
+
+    public static String getMaintenanceId(String nodeId) {
+        return nodeId;
+    }
+
+    public static String getMaintenanceId(MaintenanceEntity object) {
+        return object == null ? null : object.getNodeId();
+    }
+
+    public static String getControllerId() {
+        return UUID.randomUUID().toString();
+    }
+
+    public static String getFaultcurrentId(String nodeId, String objectId, String problemName) {
+        String uuId;
+
+        Matcher matcher = FAULTPATTERN.matcher(objectId);
+        if (matcher.matches() && matcher.groupCount() == 1) {
+            uuId = matcher.group(1);
+        } else {
+            uuId = objectId;
+        }
+        return String.format("%s/%s/%s", nodeId, uuId, problemName);
+    }
+
+    public static String getFaultcurrentId(FaultcurrentEntity object) {
+        return object == null ? null : getFaultcurrentId(object.getNodeId(), object.getObjectId(), object.getProblem());
+    }
+
+    public static String getNetworkelementConnectionId(String nodeId) {
+        return nodeId;
+    }
+
+    public static String getNetworkelementConnectionId(NetworkElementConnectionEntity object) {
+        return object == null ? null : object.getNodeId();
+    }
+
+    public static String getPmData15mId(String nodeId, String uuidInterface, String timestamp) {
+        return String.format("%s/%s/%s", nodeId, uuidInterface, timestamp);
+    }
+
+    public static String getPmData15mId(Pmdata15mEntity object) {
+        return object == null ? null
+                : getPmData15mId(object.getNodeName(), object.getUuidInterface(), object.getTimeStamp().getValue());
+    }
+    public static String getPmData24hId(String nodeId, String uuidInterface, String timestamp) {
+        return String.format("%s/%s/%s", nodeId, uuidInterface, timestamp);
+    }
+
+    public static String getPmData24hId(Pmdata24hEntity object) {
+        return object == null ? null
+                : getPmData24hId(object.getNodeName(), object.getUuidInterface(), object.getTimeStamp().getValue());
+    }
+
+    public static String getInventoryId(InventoryEntity object) {
+        return getInventoryId(object.getNodeId(),object.getUuid());
+    }
+
+    private static String getInventoryId(String nodeId, String uuid) {
+        return String.format("%s/%s", nodeId, uuid);
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/FaultEntityManager.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/FaultEntityManager.java
new file mode 100644 (file)
index 0000000..8371b9c
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * ============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.sqldb.data.entity;
+
+import java.util.Date;
+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.SeverityType;
+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.FilterBuilder;
+
+public class FaultEntityManager {
+
+    /**
+     * 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());
+    }
+
+    public static Filter getOlderOrEqualFilter(Date olderAreOutdated) {
+        return new FilterBuilder().setProperty("timestamp").setFiltervalue("<").build();
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseEventsService.java
new file mode 100644 (file)
index 0000000..84786b0
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * ============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.sqldb.data.entity;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.mariadb.jdbc.Driver;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+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.database.SqlDBMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriterFault;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriterPm;
+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.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.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.Inventory;
+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.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterBuilder;
+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 DataProvider {
+    private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
+
+    private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();;
+
+    protected final SqlDBClient dbClient;
+    protected final String controllerId;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data> connectionlogRW;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data> eventlogRW;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data> eventRWFaultLog;
+    protected final SqlDBReaderWriterFault<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data> eventRWFaultCurrent;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data> equipmentRW;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data> guicutthroughRW;
+    protected final SqlDBReaderWriter<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data> networkelementConnectionRW;
+    protected final SqlDBReaderWriterPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data> pm15mRW;
+    protected final SqlDBReaderWriterPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data> pm24hRW;
+    protected final String controllerTableName;
+
+    public HtDatabaseEventsService(SqlDBConfig config) {
+        LOG.debug("Creating dummy instance of org.mariadb.jdbc.Driver");
+        @SuppressWarnings("unused")
+        Driver dvr = new org.mariadb.jdbc.Driver();
+        dvr = null;
+        this.controllerId = config.getControllerId();
+        this.controllerTableName = SqlDBMapper.TABLENAME_CONTROLLER + config.getDbSuffix();
+        this.dbClient = new SqlDBClient(config.getUrl(), config.getUsername(), config.getPassword());
+        this.connectionlogRW = new SqlDBReaderWriter<>(dbClient, Entity.Connectionlog, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.eventlogRW = new SqlDBReaderWriter<>(dbClient, Entity.Eventlog, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.eventRWFaultLog = new SqlDBReaderWriter<>(dbClient, Entity.Faultlog, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.eventRWFaultCurrent = new SqlDBReaderWriterFault<>(dbClient, Entity.Faultcurrent, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultcurrent.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.equipmentRW = new SqlDBReaderWriter<>(dbClient, Entity.Inventoryequipment, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.guicutthroughRW = new SqlDBReaderWriter<>(dbClient,
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity.Guicutthrough,
+                config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId).setWriteInterface(Guicutthrough.class);
+        this.networkelementConnectionRW = new SqlDBReaderWriter<>(dbClient, Entity.NetworkelementConnection,
+                config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+        this.networkelementConnectionRW.setWriteInterface(NetworkElementConnectionEntity.class);
+
+        this.pm15mRW = new SqlDBReaderWriterPm<>(dbClient, Entity.Historicalperformance15min, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+
+        this.pm24hRW = new SqlDBReaderWriterPm<>(dbClient, Entity.Historicalperformance24h, config.getDbSuffix(),
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data.class,
+                this.dbClient.getDatabaseName(), this.controllerId);
+
+    }
+
+    @Override
+    public void writeConnectionLog(ConnectionlogEntity event) {
+        this.connectionlogRW.write(event, event.getId());
+    }
+
+    @Override
+    public void writeEventLog(EventlogEntity event) {
+        this.eventlogRW.write(event, event.getId());
+
+    }
+
+    @Override
+    public void writeFaultLog(FaultlogEntity fault) {
+        this.eventRWFaultLog.write(fault, fault.getId());
+    }
+
+    @Override
+    public void updateFaultCurrent(FaultcurrentEntity fault) {
+        final String id = fault.getId() != null ? fault.getId() : DatabaseIdGenerator.getFaultcurrentId(fault);
+        if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
+            if (FaultEntityManager.isNoAlarmIndication(fault)) {
+                LOG.debug("Remove from currentFaults: {}", fault.toString());
+                this.eventRWFaultCurrent.remove(id);
+            } else {
+                LOG.debug("Write to currentFaults: {}", fault.toString());
+                this.eventRWFaultCurrent.updateOrInsert(fault, id);
+            }
+        } else {
+            LOG.debug("Ingnore for currentFaults: {}", fault.toString());
+        }
+    }
+
+    @Override
+    public int clearFaultsCurrentOfNode(String nodeName) {
+        return this.eventRWFaultCurrent
+                .remove(Arrays.asList(new FilterBuilder().setProperty("node-id").setFiltervalue(nodeName).build()));
+    }
+
+    @Override
+    public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
+        return this.eventRWFaultCurrent
+                .remove(Arrays.asList(new FilterBuilder().setProperty("node-id").setFiltervalue(nodeName).build(),
+                        new FilterBuilder().setProperty("object-id").setFiltervalue(objectId).build()));
+    }
+
+    @Override
+    public List<String> getAllNodesWithCurrentAlarms() {
+        return this.eventRWFaultCurrent.getAllNodes();
+    }
+
+    @Override
+    public void writeInventory(String nodeId, List<Inventory> list) {
+        for (Inventory internalEquipment : list) {
+            this.equipmentRW.updateOrInsert(internalEquipment,
+                    internalEquipment.getId() != null ? internalEquipment.getId()
+                            : DatabaseIdGenerator.getInventoryId(internalEquipment));
+        }
+    }
+
+    @Override
+    public void writeGuiCutThroughData(Guicutthrough gcData, String nodeId) {
+        this.guicutthroughRW.write(gcData, nodeId);
+    }
+
+    @Override
+    public int clearGuiCutThroughEntriesOfNode(String nodeName) {
+        this.guicutthroughRW.remove(nodeName);
+        return 0;
+    }
+
+    @Override
+    public boolean updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy,
+            String nodeId) {
+        return this.networkelementConnectionRW.updateOrInsert(networkElementConnectionEntitiy, nodeId) != null;
+    }
+
+    @Override
+    public boolean updateNetworkConnection22(NetworkElementConnectionEntity ne, String nodeId) {
+        return this.networkelementConnectionRW.updateOrInsert(ne, nodeId) != null;
+    }
+
+    @Override
+    public void removeNetworkConnection(String nodeId) {
+        this.networkelementConnectionRW.remove(nodeId);
+
+    }
+
+    @Override
+    public int doIndexClean(Date olderAreOutdated) {
+        String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
+        List<Filter> filter = new ArrayList<>();
+        filter.add(new FilterBuilder().setProperty("timestamp").setFiltervalue(String.format("<%s", netconfTimeStamp))
+                .build());
+        if (this.controllerId != null) {
+            filter.add(
+                    new FilterBuilder().setProperty(SqlDBMapper.ODLID_DBCOL).setFiltervalue(this.controllerId).build());
+        }
+        int removed = 0;
+
+        removed += this.eventlogRW.remove(filter);
+        removed += this.eventRWFaultLog.remove(filter);
+        return removed;
+    }
+
+    @Override
+    public long getNumberOfOldObjects(Date olderAreOutdated) {
+        List<Filter> filter = Arrays.asList(FaultEntityManager.getOlderOrEqualFilter(olderAreOutdated));
+        try {
+            return this.eventRWFaultLog.count(filter, this.controllerId);
+        } catch (SQLException e) {
+            LOG.warn("problem counting faults older than {}: ", olderAreOutdated, e);
+        }
+        return 0;
+    }
+
+    @Override
+    public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
+        return this.networkelementConnectionRW.readAll(NetworkElementConnectionEntity.class);
+    }
+
+    @Override
+    public void doWritePerformanceData(List<PmdataEntity> list) {
+        list.stream().forEach((pmData) -> {
+            GranularityPeriodType granularityPeriod =
+                    pmData.getGranularityPeriod() != null ? pmData.getGranularityPeriod()
+                            : GranularityPeriodType.Unknown;
+            switch (granularityPeriod) {
+                case Period15Min:
+                    this.pm15mRW.write(pmData);
+                    break;
+                case Period24Hours:
+                    this.pm24hRW.write(pmData);
+                    break;
+                case Unknown:
+                default:
+                    LOG.debug("Unknown granularity {}", granularityPeriod);
+                    break;
+            }
+        });
+
+    }
+
+    @Override
+    public HtDatabaseClient getRawClient() {
+        return null;
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseMaintenanceService.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseMaintenanceService.java
new file mode 100644 (file)
index 0000000..dbbb89c
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * ============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.sqldb.data.entity;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jdt.annotation.Nullable;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBReaderWriter;
+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.CreateMaintenanceInputBuilder;
+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.DeleteMaintenanceInputBuilder;
+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.ReadMaintenanceListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutput;
+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.FilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HtDatabaseMaintenanceService implements HtDatabaseMaintenance {
+
+    private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseMaintenanceService.class);
+    private final SqlDBReaderWriter<Data> maintenanceRw;
+    private final SqlDBDataProvider dbProvider;
+
+    public HtDatabaseMaintenanceService(SqlDBDataProvider dbProvider) {
+        this.dbProvider = dbProvider;
+        this.maintenanceRw = dbProvider.getMaintenanceReaderWriter();
+    }
+
+
+    @Override
+    public MaintenanceEntity createIfNotExists(String nodeId) {
+
+        MaintenanceEntity e = this.getMaintenance(nodeId);
+        if (e == null) {
+            try {
+                CreateMaintenanceOutputBuilder createResult = this.dbProvider
+                        .createMaintenance(new CreateMaintenanceInputBuilder().setNodeId(nodeId).build());
+                e = createResult.build();
+            } catch (IOException e1) {
+                LOG.warn("problem writing initial maintenance entry for {} : ", nodeId, e);
+            }
+        }
+        return e;
+    }
+
+    private static Map<FilterKey, Filter> getFilterInput(String key, String value) {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter f = new FilterBuilder().setProperty(key).setFiltervalue(value).build();
+        filterMap.put(f.key(), f);
+        return filterMap;
+    }
+
+    @Override
+    public void deleteIfNotRequired(String nodeId) {
+        ReadNetworkElementConnectionListOutput result = this.dbProvider.readNetworkElementConnectionList(
+                new ReadNetworkElementConnectionListInputBuilder().setFilter(getFilterInput("node-id", nodeId)).build())
+                .build();
+        if (result.getData() != null && result.getData().size() > 0) {
+            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.network.element.connection.list.output.Data entry =
+                    result.getData().get(0);
+            if (entry.isIsRequired()) {
+                return;
+
+            }
+        }
+        try {
+            this.dbProvider.deleteMaintenance(
+                    new DeleteMaintenanceInputBuilder().setId(DatabaseIdGenerator.getMaintenanceId(nodeId)).build());
+        } catch (IOException e) {
+            LOG.warn("problem deleting maintenance entry for node {}: ", nodeId, e);
+        }
+    }
+
+    @Override
+    public List<MaintenanceEntity> getAll() {
+        return this.maintenanceRw.readAll(MaintenanceEntity.class);
+    }
+
+    @Override
+    public MaintenanceEntity getMaintenance(@Nullable String nodeId) {
+        ReadMaintenanceListOutput result = this.dbProvider
+                .readMaintenanceList(
+                        new ReadMaintenanceListInputBuilder().setFilter(getFilterInput("node-id", nodeId)).build())
+                .build();
+
+        return result.getData() != null ? result.getData().size() > 0 ? result.getData().get(0) : null : null;
+    }
+
+    @Override
+    public MaintenanceEntity setMaintenance(MaintenanceEntity m) {
+
+        this.maintenanceRw.updateOrInsert(m, DatabaseIdGenerator.getMaintenanceId(m));
+        return this.getMaintenance(m.getNodeId());
+    }
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/QueryResult.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/QueryResult.java
new file mode 100644 (file)
index 0000000..ca90e84
--- /dev/null
@@ -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.sqldb.data.rpctypehelper;
+
+import java.util.List;
+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;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+
+public class QueryResult<T> {
+
+    private List<T> result;
+    private PaginationOutputG pagination;
+
+    public QueryResult( List<T> result,long page, long pageSize,long total) {
+        this.result = result;
+
+        PaginationBuilder x = new PaginationBuilder();
+        x.setPage(Uint64.valueOf(page));
+        x.setSize(Uint32.valueOf(pageSize));
+        x.setTotal(Uint64.valueOf(total));
+        pagination = x.build();
+    }
+
+    public List<T> 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/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/SqlDBQueryByFilter.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/SqlDBQueryByFilter.java
new file mode 100644 (file)
index 0000000..4354b16
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ * ============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.sqldb.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.queries.RangeQueryBuilder;
+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 SqlDBQueryByFilter {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlDBQueryByFilter.class);
+    private static final List<String> timestampValueNames = Arrays.asList("timestamp", "time-stamp", "start", "end");
+
+    private static List<Sortorder> emptySortOrderList = new ArrayList<>();
+    private static List<Filter> emptyFilterList = new ArrayList<>();
+
+    // Derived from input
+    private long page;
+    private long pageSize;
+    private long fromPage;
+    private List<Filter> filterList;
+    private List<Sortorder> sortOrder;
+
+    /**
+     * Process input from RPC into Queries to database
+     *
+     * @param input Input from RPC, for test it could be null
+     */
+    public SqlDBQueryByFilter(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 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> 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 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<Filter> 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(handlePrefix(prefix, p), v);
+                if (q != null) {
+                    return q;
+                } else {
+                    return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
+                }
+            } else {
+                return QueryBuilders.matchQuery(handlePrefix(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(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
+                        }
+                    } else {
+                        query.must(QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
+                    }
+                } else if (DbFilter.isComparisonValid(v)) {
+                    RangeQueryBuilder q = DbFilter.getRangeQuery(handlePrefix(prefix, p), v);
+                    if (q != null) {
+                        query.must(q);
+                    } else {
+                        query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
+                    }
+                } else {
+                    query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
+                }
+            }
+            LOG.trace("Query result. {}", query.toJSON());
+            return query;
+        }
+    }
+
+    private static String handlePrefix(String prefix, String p) {
+        return (prefix != null ? prefix : "") + p;
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBMapper.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBMapper.java
new file mode 100644 (file)
index 0000000..85d3cfe
--- /dev/null
@@ -0,0 +1,536 @@
+/*
+ * ============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.database.sqldb.database;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigInteger;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.sql.rowset.CachedRowSet;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsDeserializerModifier;
+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.yangtools.concepts.Builder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Enumeration;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SqlDBMapper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlDBMapper.class);
+
+    private static final Map<Class<?>, String> mariaDBTypeMap = initTypeMap();
+    private static final String ODLID_DBTYPE = "VARCHAR(40)";
+    private static final String STRING_DBTYPE = "VARCHAR(255)";
+    private static final String ENUM_DBTYPE = "VARCHAR(100)";
+    public static final String ODLID_DBCOL = "controller-id";
+    private static List<Class<?>> numericClasses = Arrays.asList(Byte.class, Integer.class, Long.class,
+            BigInteger.class, Uint8.class, Uint16.class, Uint32.class, Uint64.class);
+    private static final YangToolsMapper mapper = new YangToolsMapper();
+    public static final String TABLENAME_CONTROLLER = "controller";
+    private static final String DEFAULTID_DBTYPE = "int(11)";
+
+    public static String createTableOdl() {
+        return "CREATE TABLE IF NOT EXISTS " + TABLENAME_CONTROLLER + " (" + "`id` " + ODLID_DBTYPE + " "
+                + getColumnOptions("id", ODLID_DBTYPE) + "," + "`desc` " + STRING_DBTYPE + " "
+                + getColumnOptions("description", STRING_DBTYPE) + "," + "primary key(id))";
+    }
+
+    public static <T> String createTable(Class<T> clazz, Entity e) throws UnableToMapClassException {
+        return createTable(clazz, e, "", false);
+    }
+
+    public static <T> String createTable(Class<T> clazz, Entity e, String suffix) throws UnableToMapClassException {
+        return createTable(clazz, e, suffix, false);
+    }
+
+    public static <T> String createTable(Class<T> clazz, Entity e, boolean autoIndex) throws UnableToMapClassException {
+        return createTable(clazz, e, "", false);
+    }
+
+    public static <T> String createTable(Class<T> clazz, Entity e, String suffix, boolean autoIndex)
+            throws UnableToMapClassException {
+        StringBuilder sb = new StringBuilder();
+        sb.append("CREATE TABLE IF NOT EXISTS `" + e.getName() + suffix + "` (\n");
+        if (autoIndex) {
+            sb.append("`id` " + DEFAULTID_DBTYPE + " " + getColumnOptions("id", DEFAULTID_DBTYPE) + ",\n");
+        } else {
+            sb.append("`id` " + STRING_DBTYPE + " " + getColumnOptions("id", STRING_DBTYPE) + ",\n");
+        }
+        sb.append("`" + ODLID_DBCOL + "` " + ODLID_DBTYPE + " " + getColumnOptions(ODLID_DBCOL, ODLID_DBTYPE) + ",\n");
+        for (Method method : getFilteredMethods(clazz, true)) {
+            Class<?> valueType = method.getReturnType();
+            String colName = getColumnName(method);
+            if (colName.equals("id")) {
+                continue;
+            }
+            String dbType = getDBType(valueType);
+            String options = getColumnOptions(colName, dbType);
+            sb.append("`" + colName + "` " + dbType + " " + options + ",\n");
+        }
+        sb.append("primary key(id),");
+        sb.append("foreign key(`" + ODLID_DBCOL + "`) references " + TABLENAME_CONTROLLER + "(id)");
+
+        sb.append(");");
+        return sb.toString();
+    }
+
+    private static String getColumnOptions(String colName, String dbType) {
+        StringBuilder options = new StringBuilder();
+        if (dbType.contains("VARCHAR")) {
+            options.append("CHARACTER SET utf8 ");
+        }
+        if (colName.equals("id") || colName.equals(ODLID_DBCOL)) {
+            if (dbType.equals(DEFAULTID_DBTYPE)) {
+                options.append("NOT NULL AUTO_INCREMENT");
+            } else {
+                options.append("NOT NULL");
+            }
+        }
+        return options.toString();
+    }
+
+    public static List<Method> getFilteredMethods(Class<?> clazz, boolean getterOrSetter) {
+        Method[] methods = clazz.getMethods();
+        List<Method> list = new ArrayList<>();
+        for (Method method : methods) {
+            if (getterOrSetter) {
+                if (!isGetter(method)) {
+                    continue;
+                }
+            } else {
+                if (!isSetter(method)) {
+                    continue;
+                }
+            }
+            if (ignoreMethod(method, methods, getterOrSetter)) {
+                continue;
+            }
+            list.add(method);
+        }
+        return list;
+    }
+
+
+    private static Map<Class<?>, String> initTypeMap() {
+        Map<Class<?>, String> map = new HashMap<>();
+        map.put(String.class, STRING_DBTYPE);
+        map.put(Boolean.class, "BOOLEAN");
+        map.put(Byte.class, "TINYINT");
+        map.put(Integer.class, "INTEGER");
+        map.put(Long.class, "BIGINT");
+        map.put(BigInteger.class, "BIGINT");
+        map.put(Uint8.class, "SMALLINT");
+        map.put(Uint16.class, "INTEGER");
+        map.put(Uint32.class, "BIGINT");
+        map.put(Uint64.class, "BIGINT"); //????
+        map.put(DateAndTime.class, "DATETIME(3)");
+        return map;
+    }
+
+    private static boolean ignoreMethod(Method method, Method[] classMehtods, boolean getterOrSetter) {
+        final String name = method.getName();
+        if (name.equals("getAugmentations") || name.equals("getImplementedInterface")
+                || name.equals("implementedInterface") || name.equals("getClass")) {
+            return true;
+        }
+        for (Method cm : classMehtods) {
+            if (!cm.equals(method) && cm.getName().equals(name)) {
+                //resolve conflict
+                return !resolveConflict(method, cm, getterOrSetter);
+            }
+            //silicon fix
+            if (method.getReturnType().equals(Boolean.class) && getterOrSetter) {
+                if (name.startsWith("get") && cm.getName().startsWith("is")
+                        && cm.getName().endsWith(name.substring(3))) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private static boolean resolveConflict(Method m1, Method m2, boolean getterOrSetter) {
+        Class<?> p1 = getterOrSetter ? m1.getReturnType() : m1.getParameterTypes()[0];
+        Class<?> p2 = getterOrSetter ? m2.getReturnType() : m2.getParameterTypes()[0];
+        if (YangToolsBuilderAnnotationIntrospector.isAssignable(p1, p2, Map.class, List.class)) {
+            return p1.isAssignableFrom(List.class); //prefer List setter
+        } else if (YangToolsBuilderAnnotationIntrospector.isAssignable(p1, p2, Uint64.class, BigInteger.class)) {
+            return p1.isAssignableFrom(Uint64.class);
+        } else if (YangToolsBuilderAnnotationIntrospector.isAssignable(p1, p2, Uint32.class, Long.class)) {
+            return p1.isAssignableFrom(Uint32.class);
+        } else if (YangToolsBuilderAnnotationIntrospector.isAssignable(p1, p2, Uint16.class, Integer.class)) {
+            return p1.isAssignableFrom(Uint16.class);
+        } else if (YangToolsBuilderAnnotationIntrospector.isAssignable(p1, p2, Uint8.class, Short.class)) {
+            return p1.isAssignableFrom(Uint8.class);
+        }
+        return false;
+    }
+
+    public static String getColumnName(Method method) {
+        String camelName = (method.getName().startsWith("get") || method.getName().startsWith("set"))
+                ? method.getName().substring(3)
+                : method.getName().substring(2);
+        return convertCamelToKebabCase(camelName);
+    }
+
+    private static String getDBType(Class<?> valueType) throws UnableToMapClassException {
+        String type = mariaDBTypeMap.getOrDefault(valueType, null);
+        if (type == null) {
+            if (implementsInterface(valueType, DataObject.class) || implementsInterface(valueType, List.class)
+                    || implementsInterface(valueType, Map.class)) {
+                return "JSON";
+            }
+            if (implementsInterface(valueType, Enumeration.class)) {
+                return ENUM_DBTYPE;
+            }
+            throw new UnableToMapClassException("no mapping for " + valueType.getName() + " found");
+        }
+        return type;
+    }
+
+    private static boolean implementsInterface(Class<?> valueType, Class<?> iftoImpl) {
+        return iftoImpl.isAssignableFrom(valueType);
+    }
+
+    private static boolean isGetter(Method method) {
+        return method.getName().startsWith("get") || method.getName().startsWith("is")
+                || method.getName().startsWith("do");
+    }
+
+    private static boolean isSetter(Method method) {
+        return method.getName().startsWith("set");
+    }
+
+    /**
+     * @param input string in Camel Case
+     * @return String in Kebab case Inspiration from KebabCaseStrategy class of com.fasterxml.jackson.databind with an
+     *         additional condition to handle numbers as well Using QNAME would have been a more fool proof solution,
+     *         however it can lead to performance problems due to usage of Java reflection
+     */
+    private static String convertCamelToKebabCase(String input) {
+        if (input == null)
+            return input; // garbage in, garbage out
+        int length = input.length();
+        if (length == 0) {
+            return input;
+        }
+
+        StringBuilder result = new StringBuilder(length + (length >> 1));
+
+        int upperCount = 0;
+
+        for (int i = 0; i < length; ++i) {
+            char ch = input.charAt(i);
+            char lc = Character.toLowerCase(ch);
+
+            if (lc == ch) { // lower-case letter means we can get new word
+                // but need to check for multi-letter upper-case (acronym), where assumption
+                // is that the last upper-case char is start of a new word
+                if ((upperCount > 1)) {
+                    // so insert hyphen before the last character now
+                    result.insert(result.length() - 1, '-');
+                } else if ((upperCount == 1) && Character.isDigit(ch) && i != length - 1) {
+                    result.append('-');
+                }
+                upperCount = 0;
+            } else {
+                // Otherwise starts new word, unless beginning of string
+                if ((upperCount == 0) && (i > 0)) {
+                    result.append('-');
+                }
+                ++upperCount;
+            }
+            result.append(lc);
+        }
+        return result.toString();
+    }
+
+    public static class UnableToMapClassException extends Exception {
+
+        private static final long serialVersionUID = 1L;
+
+        public UnableToMapClassException(String message) {
+            super(message);
+        }
+
+    }
+
+    public static String escape(Object o) {
+        return escape(o.toString());
+    }
+
+    public static String escape(String o) {
+        return o.replace("'", "\'");
+    }
+
+    public static boolean isComplex(Class<?> valueType) {
+        return DataObject.class.isAssignableFrom(valueType) || List.class.isAssignableFrom(valueType);
+    }
+
+    public static Object getNumericValue(Object value, Class<?> valueType) {
+        if (valueType.equals(Byte.class) || valueType.equals(Integer.class) || valueType.equals(Long.class)) {
+            return value;
+        }
+        if (valueType.equals(Uint8.class) || valueType.equals(Uint16.class) || valueType.equals(Uint32.class)
+                || valueType.equals(Uint64.class)) {
+            return ((Number) value).longValue();
+        }
+        return value;
+    }
+
+    public static Object bool2int(Object invoke) {
+        return Boolean.TRUE.equals(invoke) ? 1 : 0;
+    }
+
+    public static boolean isBoolean(Class<?> valueType) {
+        return valueType.equals(Boolean.class);
+    }
+
+    public static boolean isNumeric(Class<?> valueType) {
+        return numericClasses.contains(valueType);
+
+    }
+
+    private static boolean isDateTime(Class<?> valueType) {
+        return valueType.equals(DateAndTime.class);
+    }
+
+    private static boolean isYangEnum(Class<?> valueType) {
+        return YangToolsMapperHelper.implementsInterface(valueType, Enumeration.class);
+    }
+
+    public static <T extends DataObject> List<T> read(CachedRowSet data, Class<T> clazz)
+            throws JsonMappingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
+            InstantiationException, SecurityException, NoSuchMethodException, JsonProcessingException, SQLException {
+        return read(data, clazz, null);
+    }
+
+    public static <T extends DataObject> List<T> read(ResultSet data, Class<T> clazz)
+            throws JsonMappingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
+            InstantiationException, SecurityException, NoSuchMethodException, JsonProcessingException, SQLException {
+        return read(data, clazz, null);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> List<T> read(CachedRowSet data, Class<T> clazz, String column) throws IllegalAccessException,
+            IllegalArgumentException, InvocationTargetException, SQLException, InstantiationException,
+            SecurityException, NoSuchMethodException, JsonMappingException, JsonProcessingException {
+
+        List<T> list = new ArrayList<>();
+        while (data.next()) {
+            if (column == null) {
+                Builder<T> builder = findPOJOBuilder(clazz);
+                Class<?> argType;
+                String col;
+                for (Method m : getFilteredMethods(builder.getClass(), false)) {
+                    argType = m.getParameterTypes()[0];
+                    col = getColumnName(m);
+                    m.setAccessible(true);
+                    m.invoke(builder, getValueOrDefault(data, col, argType, null));
+                }
+                list.add(builder.build());
+            } else {
+                Object value = getValueOrDefault(data, column, clazz, null);
+                if (value != null) {
+                    list.add((T) value);
+                }
+            }
+        }
+        return list;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> List<T> read(ResultSet data, Class<T> clazz, String column) throws IllegalAccessException,
+            IllegalArgumentException, InvocationTargetException, SQLException, InstantiationException,
+            SecurityException, NoSuchMethodException, JsonMappingException, JsonProcessingException {
+
+        List<T> list = new ArrayList<>();
+        while (data.next()) {
+            if (column == null) {
+                Builder<T> builder = findPOJOBuilder(clazz);
+                Class<?> argType;
+                String col;
+                for (Method m : getFilteredMethods(builder.getClass(), false)) {
+                    argType = m.getParameterTypes()[0];
+                    col = getColumnName(m);
+                    m.setAccessible(true);
+                    m.invoke(builder, getValueOrDefault(data, col, argType, null));
+                }
+                list.add(builder.build());
+            } else {
+                Object value = getValueOrDefault(data, column, clazz, null);
+                if (value != null) {
+                    list.add((T) value);
+                }
+            }
+        }
+        return list;
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> Builder<T> findPOJOBuilder(Class<T> ac) throws InstantiationException, IllegalAccessException,
+            IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException {
+        try {
+            String builder = null;
+
+            if (ac.isInterface()) {
+                String clsName = ac.getName();
+                if (clsName.endsWith("Entity")) {
+                    clsName = clsName.substring(0, clsName.length() - 6);
+                }
+                builder = clsName + "Builder";
+            }
+            if (builder != null) {
+                Class<?> innerBuilder = YangToolsMapperHelper.findClass(builder);
+                Class<Builder<T>> builderClass = (Class<Builder<T>>) innerBuilder;
+                return builderClass.getDeclaredConstructor().newInstance();
+            }
+        } catch (ClassNotFoundException e) {
+
+        }
+        return null;
+    }
+
+    private static Object getValueOrDefault(CachedRowSet data, String col, Class<?> dstType, Object defaultValue)
+            throws SQLException, JsonMappingException, JsonProcessingException {
+        if (isBoolean(dstType)) {
+            return data.getBoolean(col);
+        } else if (isNumeric(dstType)) {
+            return getNumeric(dstType, data.getLong(col));
+        } else if (String.class.equals(dstType)) {
+            return data.getString(col);
+        } else if (isYangEnum(dstType)) {
+            return getYangEnum(data.getString(col), dstType);
+        } else if (isDateTime(dstType)) {
+            String v = data.getString(col);
+            return v == null || v.equals("null") ? null : DateAndTime.getDefaultInstance(v.replace(" ", "T") + "Z");
+        } else if (isComplex(dstType)) {
+            String v = data.getString(col);
+
+            return (v == null || v.toLowerCase().equals("null")) ? null : mapper.readValue(v, dstType);
+        }
+        return defaultValue;
+    }
+
+    private static Object getValueOrDefault(ResultSet data, String col, Class<?> dstType, Object defaultValue)
+            throws SQLException, JsonMappingException, JsonProcessingException {
+        if (isBoolean(dstType)) {
+            return data.getBoolean(col);
+        } else if (isNumeric(dstType)) {
+            return getNumeric(dstType, data.getLong(col));
+        } else if (String.class.equals(dstType)) {
+            return data.getString(col);
+        } else if (isYangEnum(dstType)) {
+            return getYangEnum(data.getString(col), dstType);
+        } else if (isDateTime(dstType)) {
+            String v = data.getString(col);
+            return v == null || v.equals("null") ? null : DateAndTime.getDefaultInstance(v.replace(" ", "T") + "Z");
+        } else if (isComplex(dstType)) {
+            String v = data.getString(col);
+
+            return (v == null || v.toLowerCase().equals("null")) ? null : mapper.readValue(v, dstType);
+        }
+        return defaultValue;
+    }
+
+
+
+    private static Object getYangEnum(String value, Class<?> dstType) {
+        if (value == null || value.equals("null")) {
+            return null;
+        }
+        try {
+            return YangToolsDeserializerModifier.parseEnum(value, dstType);
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
+                | SecurityException e) {
+            LOG.warn("unable to parse enum value '{}' to class {}: ", value, dstType, e);
+        }
+        return null;
+    }
+
+    private static Object getNumeric(Class<?> dstType, long value) {
+        if (dstType.equals(Uint64.class)) {
+            return Uint64.valueOf(value);
+        } else if (dstType.equals(Uint32.class)) {
+            return Uint32.valueOf(value);
+        } else if (dstType.equals(Uint16.class)) {
+            return Uint16.valueOf(value);
+        } else if (dstType.equals(Uint16.class)) {
+            return Uint8.valueOf(value);
+        } else if (dstType.equals(Long.class)) {
+            return Long.valueOf(value);
+        } else if (dstType.equals(Integer.class)) {
+            return Long.valueOf(value).intValue();
+        } else if (dstType.equals(Byte.class)) {
+            return Long.valueOf(value).byteValue();
+        }
+        return null;
+    }
+
+    public static DBKeyValuePair<String> getEscapedKeyValue(Method m, String col, Object value)
+            throws JsonProcessingException {
+        Class<?> valueType = m.getReturnType();
+        String svalue = null;
+        if (isBoolean(valueType)) {
+            svalue = String.valueOf(bool2int(value));
+        } else if (isNumeric(valueType)) {
+            svalue = String.valueOf(getNumericValue(value, valueType));
+        } else if (isDateTime(valueType)) {
+            svalue = "'" + getDateTimeValue((DateAndTime) value) + "'";
+        } else if (isComplex(valueType)) {
+            svalue = "'" + escape(mapper.writeValueAsString(value)) + "'";
+        } else {
+            svalue = "'" + escape(value) + "'";
+        }
+        return new DBKeyValuePair<String>("`" + col + "`", svalue);
+    }
+
+    private static String getDateTimeValue(DateAndTime value) {
+        String s = value.getValue();
+        if (s.endsWith("Z")) {
+            s = s.substring(0, s.length() - 1).replace("T", " ");
+        } else if (s.contains("+")) {
+            s = s.substring(0, s.indexOf("+")).replace("T", " ");
+        }
+        return s;
+    }
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriter.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriter.java
new file mode 100644 (file)
index 0000000..d033e45
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * ============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.database.sqldb.database;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.lang.reflect.InvocationTargetException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.Nullable;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.rpctypehelper.QueryResult;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.DeleteQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.InsertQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.SelectQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.SqlQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.UpdateQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.UpsertQuery;
+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.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SqlDBReaderWriter<T extends DataObject> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlDBReaderWriter.class);
+
+    protected final Entity entity;
+    private final Class<T> clazz;
+    protected final SqlDBClient dbService;
+    private final String dbName;
+    protected final String controllerId;
+    protected final String tableName;
+
+    public SqlDBReaderWriter(SqlDBClient dbService, Entity e, String dbSuffix, Class<T> clazz, String dbName,
+            String controllerId) {
+        this.dbService = dbService;
+        this.entity = e;
+        this.clazz = clazz;
+        this.dbName = dbName;
+        this.tableName = this.entity.getName() + dbSuffix;
+        this.controllerId = controllerId;
+    }
+
+    public long count(List<Filter> filter) throws SQLException {
+        String query;
+        if (filter == null || filter.isEmpty()) {
+            query = String.format("SELECT table_rows FROM `information_schema`.`tables` "
+                    + "WHERE `table_schema` = '%s' AND `table_name` = '%s'", this.dbName, this.tableName);
+        } else {
+            query = String.format("SELECT COUNT(`id`) FROM `%s` %s", this.tableName,
+                    SqlQuery.getWhereExpression(filter));
+        }
+        ResultSet data = this.dbService.read(query);
+        long cnt = 0;
+        if (data.next()) {
+            cnt = data.getLong(1);
+        }
+        return cnt;
+    }
+
+    public long count(List<Filter> list, String controllerId) throws SQLException {
+        if (list == null) {
+            list = new ArrayList<>();
+        }
+        Optional<Filter> cFilter =
+                list.stream().filter(e -> SqlDBMapper.ODLID_DBCOL.equals(e.getProperty())).findFirst();
+        if (!cFilter.isEmpty()) {
+            list.remove(cFilter.get());
+        }
+        if (controllerId != null) {
+            list.add(new FilterBuilder().setProperty(SqlDBMapper.ODLID_DBCOL).setFiltervalue(this.controllerId)
+                    .build());
+        }
+        return this.count(list);
+    }
+
+    public QueryResult<T> getData(EntityInput input) {
+        SelectQuery query = new SelectQuery(this.tableName, input, this.controllerId);
+        LOG.info("query={}", query.toSql());
+        try {
+            ResultSet data = this.dbService.read(query.toSql());
+            List<T> mappedData = SqlDBMapper.read(data, clazz);
+            long total = this.count(input.getFilter() != null ? new ArrayList<>(input.getFilter().values()) : null,
+                    this.controllerId);
+            return new QueryResult<T>(mappedData, query.getPage(), query.getPageSize(), total);
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            LOG.warn("problem reading data {}: ", this.entity, e);
+        }
+        return null;
+    }
+
+
+
+    public <S extends DataObject> String write(S object, String id) {
+        if (id == null) {
+            return this.writeWithoutId(object);
+        }
+        InsertQuery<S> query = new InsertQuery<S>(this.entity, object, this.controllerId);
+        query.setId(id);
+        boolean success = false;
+        try {
+            success = this.dbService.write(query.toSql());
+        } catch (SQLException e) {
+            LOG.warn("problem writing data into db: ", e);
+        }
+
+        return success ? id : null;
+    }
+
+    private <S extends DataObject> String writeWithoutId(S object) {
+
+        InsertQuery<S> query = new InsertQuery<S>(this.entity, object, this.controllerId);
+        try {
+            return this.dbService.writeAndReturnId(query.toSql());
+        } catch (SQLException e) {
+            LOG.warn("problem writing data into db: ", e);
+        }
+        return null;
+    }
+
+    public <S extends DataObject> String update(S object, String id) {
+        UpdateQuery<S> query = new UpdateQuery<S>(this.entity, object, this.controllerId);
+        query.setId(id);
+        String insertedId = null;
+        try {
+            Connection connection = this.dbService.getConnection();
+            PreparedStatement stmt = connection.prepareStatement(query.toSql());
+            stmt.execute();
+
+            int affectedRows = stmt.getUpdateCount();
+            connection.close();
+            if (affectedRows > 0) {
+                insertedId = id;
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem writing data into db: ", e);
+        }
+
+        return insertedId;
+    }
+
+    public <S extends DataObject> String updateOrInsert(S object, String id) {
+        UpsertQuery<S> query = new UpsertQuery<S>(this.entity, object, this.controllerId);
+        query.setId(id);
+        String insertedId = null;
+        LOG.info("query={}", query.toSql());
+        try {
+            Connection connection = this.dbService.getConnection();
+            PreparedStatement stmt = connection.prepareStatement(query.toSql());
+            stmt.execute();
+
+            int affectedRows = stmt.getUpdateCount();
+            connection.close();
+            if (affectedRows > 0) {
+                insertedId = id;
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem writing data into db: ", e);
+        }
+        return insertedId;
+    }
+
+    public SqlDBReaderWriter<T> setWriteInterface(Class<? extends DataObject> writeInterfaceClazz) {
+        LOG.debug("Set write interface to {}", writeInterfaceClazz);
+        if (writeInterfaceClazz == null) {
+            throw new IllegalArgumentException("Null not allowed here.");
+        }
+
+        //      this.writeInterfaceClazz = writeInterfaceClazz;
+        return this;
+    }
+
+    public int remove(List<Filter> filters) {
+        DeleteQuery query = new DeleteQuery(this.entity, filters);
+        int affectedRows = 0;
+        try {
+            Connection connection = this.dbService.getConnection();
+            PreparedStatement stmt = connection.prepareStatement(query.toSql());
+            stmt.execute();
+            affectedRows = stmt.getUpdateCount();
+            connection.close();
+        } catch (SQLException e) {
+            LOG.warn("problem execute delete query: ", e);
+        }
+        return affectedRows;
+    }
+
+    public int remove(@Nullable String id) {
+        return this.remove(Arrays.asList(new FilterBuilder().setProperty("id").setFiltervalue(id).build()));
+    }
+
+    public <S extends DataObject> List<S> readAll(Class<S> clazz) {
+        SelectQuery query = new SelectQuery(this.tableName);
+        try {
+            ResultSet data = this.dbService.read(query.toSql());
+            List<S> mappedData = SqlDBMapper.read(data, clazz);
+            return mappedData;
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            LOG.warn("problem reading data {}: ", this.entity, e);
+        }
+        return null;
+    }
+
+    public List<String> readAll(String key) {
+        SelectQuery query = new SelectQuery(this.tableName, key, this.controllerId).groupBy(key);
+        try {
+            ResultSet data = this.dbService.read(query.toSql());
+            List<String> mappedData = SqlDBMapper.read(data, String.class, key);
+            return mappedData;
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            LOG.warn("problem reading data {}: ", this.entity, e);
+        }
+        return null;
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterFault.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterFault.java
new file mode 100644 (file)
index 0000000..2d4e26e
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * ============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.database.sqldb.database;
+
+import java.util.List;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+public class SqlDBReaderWriterFault<T extends DataObject> extends SqlDBReaderWriter<T> {
+
+    private static final String NODE_KEY = "node-id";
+
+    public SqlDBReaderWriterFault(SqlDBClient dbService, Entity e, String dbSuffix, Class<T> clazz, String dbName,
+            String controllerId) {
+        super(dbService, e, dbSuffix, clazz, dbName, controllerId);
+    }
+
+    public List<String> getAllNodes() {
+
+        return this.readAll(NODE_KEY);
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterPm.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterPm.java
new file mode 100644 (file)
index 0000000..f0ce268
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * ============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.database.sqldb.database;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.rpctypehelper.QueryResult;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.SelectQuery;
+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.EntityInput;
+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.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SqlDBReaderWriterPm<T extends DataObject> extends SqlDBReaderWriter<T> {
+
+    private final Logger LOG = LoggerFactory.getLogger(SqlDBReaderWriterPm.class);
+
+    private static final String UUID_KEY = "uuid-interface";
+    private static final String NODE_KEY = "node-name";
+    private static final String KEY = "node-name";
+
+    private static final FilterKey FILTERKEY = new FilterKey(KEY);
+
+    public SqlDBReaderWriterPm(SqlDBClient dbService, Entity e, String dbSuffix, Class<T> clazz, String dbName,
+            String controllerId) {
+        super(dbService, e, dbSuffix, clazz, dbName, controllerId);
+    }
+
+    /**
+     * get aggregated list of ltps for filter NODE_KEY
+     *
+     * @param input
+     * @return
+     * @throws IOException
+     */
+    public QueryResult<String> getDataLtpList(EntityInput input) throws IOException {
+
+        SelectQuery query = new SelectQuery(this.tableName, UUID_KEY, this.controllerId).groupBy(UUID_KEY);
+        query.setPagination(input.getPagination());
+        Map<FilterKey, Filter> filter = input.nonnullFilter();
+        if (!filter.containsKey(FILTERKEY)) {
+            String msg = "no node-name in filter found ";
+            LOG.debug(msg);
+            throw new IllegalArgumentException(msg);
+        }
+        for (Filter f : filter.values()) {
+            query.addFilter(f.getProperty(), f.getFiltervalue());
+        }
+
+
+        try {
+            ResultSet data = this.dbService.read(query.toSql());
+            List<String> mappedData = SqlDBMapper.read(data, String.class, UUID_KEY);
+            long total = this.count(input.getFilter() != null ? new ArrayList<>(input.getFilter().values()) : null,
+                    this.controllerId);
+            return new QueryResult<String>(mappedData, query.getPage(), query.getPageSize(), total);
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            LOG.warn("problem reading ltp list: ", e);
+        }
+        return null;
+    }
+
+    /**
+     * get aggregated devices list
+     *
+     * @param input filter should be empty/no filter handled, only sortorder for KEY ('node-name')
+     * @return
+     * @throws IOException
+     */
+    public QueryResult<String> getDataDeviceList(EntityInput input) throws IOException {
+
+        SelectQuery query = new SelectQuery(this.tableName, NODE_KEY, this.controllerId).groupBy(NODE_KEY);
+        query.setPagination(input.getPagination());
+        Map<FilterKey, Filter> filter = input.getFilter();
+        if (filter != null) {
+            for (Filter f : filter.values()) {
+                query.addFilter(f.getProperty(), f.getFiltervalue());
+            }
+        }
+
+        try {
+            ResultSet data = this.dbService.read(query.toSql());
+            List<String> mappedData = SqlDBMapper.read(data, String.class, NODE_KEY);
+            long total = this.count(input.getFilter() != null ? new ArrayList<>(input.getFilter().values()) : null,
+                    this.controllerId);
+            return new QueryResult<String>(mappedData, query.getPage(), query.getPageSize(), total);
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            LOG.warn("problem reading device list: ", e);
+        }
+        return null;
+    }
+
+    public void write(PmdataEntity pmData) {
+        DateAndTime date = pmData.getTimeStamp();
+        final String id = String.format("%s/%s/%s", pmData.getNodeName(), pmData.getUuidInterface(),
+                date != null ? date.getValue() : "null");
+        this.updateOrInsert(pmData, id);
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBStatusReader.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBStatusReader.java
new file mode 100644 (file)
index 0000000..c98ba38
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * ============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.database.sqldb.database;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Arrays;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.rpctypehelper.QueryResult;
+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.SeverityType;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SqlDBStatusReader {
+
+    private final Logger LOG = LoggerFactory.getLogger(SqlDBStatusReader.class);
+
+    private final SqlDBClient dbClient;
+    private final String controllerId;
+
+    public SqlDBStatusReader(SqlDBClient dbClient, String controllerId) {
+        this.dbClient = dbClient;
+        this.controllerId = controllerId;
+    }
+
+    public QueryResult<Data> getDataStatus() {
+        String selectQuery = createCountQuery("severity", Entity.Faultcurrent, this.controllerId);
+        long criticalCount = 0;
+        long majorCount = 0;
+        long minorCount = 0;
+        long warningCount = 0;
+        ResultSet data;
+        try {
+            data = this.dbClient.read(selectQuery);
+            String severity;
+            while (data.next()) {
+                severity = data.getString(1);
+                if (severity != null) {
+                    if (severity.equals(SeverityType.Critical.getName())) {
+                        criticalCount = data.getLong(2);
+                    } else if (severity.equals(SeverityType.Major.getName())) {
+                        majorCount = data.getLong(2);
+                    } else if (severity.equals(SeverityType.Minor.getName())) {
+                        minorCount = data.getLong(2);
+                    } else if (severity.equals(SeverityType.Warning.getName())) {
+                        warningCount = data.getLong(2);
+                    }
+
+                }
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem reading status:", e);
+        }
+        DataBuilder builder = new DataBuilder().setFaults(
+                new FaultsBuilder().setCriticals(Uint32.valueOf(criticalCount)).setMajors(Uint32.valueOf(majorCount))
+                        .setMinors(Uint32.valueOf(minorCount)).setWarnings(Uint32.valueOf(warningCount)).build());
+        selectQuery = createCountQuery("status", Entity.NetworkelementConnection, this.controllerId);
+        NetworkElementConnectionsBuilder neBuilder = new NetworkElementConnectionsBuilder();
+        String state;
+        long connectedCount = 0, connectingCount = 0, disconnectedCount = 0, mountedCount = 0, unableToConnectCount = 0,
+                undefinedCount = 0, unmountedCount = 0;
+        long cnt;
+        try {
+            data = this.dbClient.read(selectQuery);
+            while (data.next()) {
+                state = data.getString(1);
+                cnt = data.getLong(2);
+                if (state != null) {
+                    if (state.equals(ConnectionLogStatus.Connected.getName())) {
+                        connectedCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.Connecting.getName())) {
+                        connectingCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.Disconnected.getName())) {
+                        disconnectedCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.Mounted.getName())) {
+                        mountedCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.UnableToConnect.getName())) {
+                        unableToConnectCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.Undefined.getName())) {
+                        undefinedCount = cnt;
+                    } else if (state.equals(ConnectionLogStatus.Unmounted.getName())) {
+                        unmountedCount = cnt;
+                    }
+                }
+            }
+        } catch (SQLException e) {
+            LOG.warn("problem reading status:", e);
+        }
+        neBuilder.setConnected(Uint32.valueOf(connectedCount)).setConnecting(Uint32.valueOf(connectingCount))
+                .setDisconnected(Uint32.valueOf(disconnectedCount)).setMounted(Uint32.valueOf(mountedCount))
+                .setTotal(Uint32.valueOf(connectedCount + connectingCount + disconnectedCount + mountedCount
+                        + unableToConnectCount + undefinedCount + unmountedCount))
+                .setUnableToConnect(Uint32.valueOf(unableToConnectCount)).setUndefined(Uint32.valueOf(undefinedCount))
+                .setUnmounted(Uint32.valueOf(unmountedCount));
+        builder.setNetworkElementConnections(neBuilder.build());
+        return new QueryResult<Data>(Arrays.asList(builder.build()), 1, 1, 1);
+    }
+
+    private static String createCountQuery(String key, Entity e, String controllerId) {
+        return String.format("SELECT `%s`, COUNT(`%s`) " + "FROM `%s` " + "%s " + "GROUP BY `%s`;", key, key,
+                e.getName(),
+                controllerId != null ? String.format("WHERE `%s`='%s'", SqlDBMapper.ODLID_DBCOL, controllerId) : "",
+                key);
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/CountQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/CountQuery.java
new file mode 100644 (file)
index 0000000..c499fef
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * ============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.database.sqldb.query;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
+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.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+
+public class CountQuery implements SqlQuery {
+
+    private final Entity entity;
+    private final List<Filter> filters;
+    private final String countField;
+    public CountQuery(Entity e) {
+        this(e, "*", null);
+    }
+    public CountQuery(Entity e, String controllerId) {
+        this(e, "*", controllerId);
+    }
+    public CountQuery(Entity e, String countField, String controllerId) {
+        this.entity = e;
+        this.countField = countField;
+        this.filters = new ArrayList<>();
+        if (controllerId != null) {
+            this.addFilter(SqlDBMapper.ODLID_DBCOL, controllerId);
+        }
+    }
+
+    public CountQuery(Entity e, EntityInput input) {
+        this(e, input, null);
+    }
+
+    public CountQuery(Entity e, EntityInput input, String controllerId) {
+        this(e);
+        Map<FilterKey, Filter> filter = input != null ? input.getFilter() : null;
+        if (filter != null && filter.size() > 0) {
+           this.filters.addAll(filters);
+        }
+        if (controllerId != null) {
+            this.addFilter(SqlDBMapper.ODLID_DBCOL, controllerId);
+        }
+    }
+
+    public void addFilter(String property, String filtervalue) {
+        this.filters.add(new FilterBuilder().setProperty(property).setFiltervalue(filtervalue).build());
+
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(String.format("SELECT COUNT(`%s`) FROM `%s`", this.countField, this.entity.getName()));
+        sb.append(SqlQuery.getWhereExpression(this.filters));
+        return sb.toString();
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/DeleteQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/DeleteQuery.java
new file mode 100644 (file)
index 0000000..f49c78a
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * ============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.database.sqldb.query;
+
+import java.util.List;
+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.entity.input.Filter;
+
+public class DeleteQuery implements SqlQuery {
+
+
+    private final Entity entity;
+    private final List<Filter> filters;
+
+    public DeleteQuery(Entity e, List<Filter> filters) {
+        this.entity = e;
+        this.filters = filters;
+    }
+
+    @Override
+    public String toSql() {
+        return String.format("DELETE FROM `%s` %s", this.entity.getName(), SqlQuery.getWhereExpression(this.filters));
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/InsertQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/InsertQuery.java
new file mode 100644 (file)
index 0000000..108888a
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * ============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.database.sqldb.query;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
+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 InsertQuery<T extends DataObject> implements SqlQuery {
+
+    private final Logger LOG = LoggerFactory.getLogger(InsertQuery.class);
+
+    protected final Entity entity;
+    private final String controllerId;
+    private final T object;
+    private final boolean ignoreNull;
+    private String id;
+
+    public InsertQuery(Entity e, T object, String controllerId) {
+        this.entity = e;
+        this.controllerId = controllerId;
+        this.object = object;
+        this.ignoreNull = true;
+        this.id = null;
+
+    }
+
+    @Override
+    public String toSql() {
+        try {
+            return this.toSqlWithError();
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | JsonProcessingException e) {
+            LOG.warn("unable to create insert statement for table {} from object {}: ", this.entity, this.object, e);
+        }
+        return null;
+    }
+
+    protected String toSqlWithError() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
+            JsonProcessingException {
+        Class<?> cls = this.object.getClass();
+        List<DBKeyValuePair<String>> kvps = new ArrayList<>();
+        List<String> cols = new ArrayList<>();
+        List<String> args = new ArrayList<>();
+        Object value;
+        String col;
+        StringBuilder sb = new StringBuilder();
+        sb.append("INSERT INTO `" + entity.getName() + "` (");
+        for (Method m : SqlDBMapper.getFilteredMethods(cls, true)) {
+
+            m.setAccessible(true);
+            value = m.invoke(this.object);
+            col = SqlDBMapper.getColumnName(m);
+            if (col.equals("id") && this.id != null) {
+                value = this.id;
+            }
+            if (ignoreNull && value == null) {
+                continue;
+            }
+            DBKeyValuePair<String> kvp = SqlDBMapper.getEscapedKeyValue(m,col, value);
+            cols.add(kvp.getKey());
+            args.add(kvp.getValue());
+            kvps.add(kvp);
+        }
+        if (this.id != null && !cols.contains("`id`")) {
+            cols.add("`id`");
+            args.add("'"+this.id+"'");
+        }
+        args.add("'"+this.controllerId+"'");
+        sb.append( String.join(",", cols));
+        sb.append(",`" + SqlDBMapper.ODLID_DBCOL + "`) VALUES (");
+        sb.append( String.join(",", args)+" )");
+        this.appendAdditionalToQuery(sb,kvps);
+        return sb.toString();
+    }
+
+    protected void appendAdditionalToQuery(StringBuilder sb, List<DBKeyValuePair<String>> keyValues) {
+
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SelectQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SelectQuery.java
new file mode 100644 (file)
index 0000000..8001508
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * ============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.database.sqldb.query;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jdt.annotation.Nullable;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
+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.FilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.SortorderKey;
+
+public class SelectQuery implements SqlQuery {
+
+    private static final long DEFAULT_PAGESIZE = 20;
+    private static final long DEFAULT_PAGE = 1;
+    private static final List<String> TIMESTAMPPROPERTYNAMES = Arrays.asList("timestamp", "time-stamp", "start", "end");
+    private final String tableName;
+    private final List<Filter> filters;
+    private final List<String> sortExpressions;
+    private long page;
+    private long pageSize;
+    private final List<String> fields;
+    private final List<String> groups;
+
+    public SelectQuery(String tableName) {
+        this(tableName, Arrays.asList("*"), null);
+    }
+
+    public SelectQuery(String tableName, List<String> fields, String controllerId) {
+        this.tableName = tableName;
+        this.fields = fields;
+        this.filters = new ArrayList<>();
+        this.sortExpressions = new ArrayList<>();
+        this.groups = new ArrayList<>();
+        this.page = DEFAULT_PAGE;
+        this.pageSize = DEFAULT_PAGESIZE;
+        if (controllerId != null) {
+            this.addFilter(SqlDBMapper.ODLID_DBCOL, controllerId);
+        }
+    }
+
+    public SelectQuery(String tableName, String field, String controllerId) {
+        this(tableName, Arrays.asList(field), controllerId);
+    }
+
+    public SelectQuery(String tableName, EntityInput input) {
+        this(tableName, input, null);
+    }
+
+    public SelectQuery(String tableName, EntityInput input, String controllerId) {
+        this(tableName);
+        Map<FilterKey, Filter> filter = input != null ? input.getFilter() : null;
+        if (filter != null && filter.size() > 0) {
+            for (Filter f : filter.values()) {
+                this.addFilter(f.getProperty(), f.getFiltervalue());
+            }
+        }
+        if (controllerId != null) {
+            this.addFilter(SqlDBMapper.ODLID_DBCOL, controllerId);
+        }
+
+        Map<SortorderKey, Sortorder> so = input.getSortorder();
+        if (so != null && so.size() > 0) {
+            for (Sortorder s : so.values()) {
+                this.addSortOrder(s.getProperty(),
+                        s.getSortorder() == SortOrder.Ascending ? "ASC" : "DESC");
+            }
+        }
+        Pagination pagination = input.getPagination();
+        if (pagination != null) {
+            this.setPagination(pagination.getPage().longValue(), pagination.getSize().longValue());
+        } else {
+            this.setPagination(1, 30);
+        }
+
+    }
+
+    public void addFilter(String property, String filtervalue) {
+        this.filters.add(new FilterBuilder().setProperty(property).setFiltervalue(filtervalue).build());
+
+    }
+
+    public void addSortOrder(String col, String order) {
+        this.sortExpressions.add(String.format("`%s` %s", col, order));
+    }
+
+    public void setPagination(long page, long pageSize) {
+        this.page = page;
+        this.pageSize = pageSize;
+    }
+
+    public void setPagination(@Nullable Pagination pagination) {
+        long page = DEFAULT_PAGE;
+        long pageSize = DEFAULT_PAGESIZE;
+        if(pagination!=null) {
+            if(pagination.getPage()!=null) {
+                page = pagination.getPage().longValue();
+            }
+            if(pagination.getSize()!=null) {
+                pageSize = pagination.getSize().longValue();
+            }
+        }
+        this.setPagination(page, pageSize);
+
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+        if (this.fields.size() == 1 && this.fields.contains("*")) {
+            sb.append(String.format("SELECT * FROM `%s`", this.tableName));
+        } else {
+            sb.append(String.format("SELECT `%s` FROM `%s`", String.join("`,`", this.fields), this.tableName));
+        }
+        sb.append(SqlQuery.getWhereExpression(this.filters));
+        if (this.groups.size() > 0) {
+            sb.append(String.format(" GROUP BY `%s`", String.join("`,`", this.groups)));
+        }
+        if (this.sortExpressions.size() > 0) {
+            sb.append(" ORDER BY " + String.join(",", this.sortExpressions));
+        }
+        sb.append(String.format(" LIMIT %d,%d;", (this.page - 1) * this.pageSize, this.pageSize));
+        return sb.toString();
+    }
+
+    public long getPage() {
+        return this.page;
+    }
+
+    public long getPageSize() {
+        return this.pageSize;
+    }
+
+    public SelectQuery groupBy(String group) {
+        this.groups.add(group);
+        return this;
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SqlQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SqlQuery.java
new file mode 100644 (file)
index 0000000..95e3605
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * ============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.database.sqldb.query;
+
+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.database.data.DbFilter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBFilterKeyValuePair;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.RangeSqlDBFilter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.RegexSqlDBFilter;
+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.entity.input.Filter;
+
+public interface SqlQuery {
+
+    String toSql();
+
+    static final List<String> TIMESTAMPPROPERTYNAMES = Arrays.asList("timestamp", "time-stamp", "start", "end");
+    static final String MARIADB_TIMESTAMP_REPLACER = "0000-00-00 00:00:00.000";
+    static final String NETCONF_TIMESTAMP_REPLACER = "0000-00-00T00:00:00.000Z";
+    static final String MARIADB_TIMESTAMP_REPLACER_MIN = "0000-00-00 00:00:00";
+    static final int MARIADB_TIMESTAMP_REPLACER_MIN_LENGTH = MARIADB_TIMESTAMP_REPLACER_MIN.length();
+    static final int MARIADB_TIMESTAMP_REPLACER_MAX_LENGTH = MARIADB_TIMESTAMP_REPLACER.length();
+
+    public static String getWhereExpression(List<Filter> filters) {
+        if (filters == null) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        if (filters.size() > 0) {
+
+            sb.append(" WHERE (" + getFilterExpression(filters.get(0)) + ")");
+            for (int i = 1; i < filters.size(); i++) {
+                sb.append(" AND (" + getFilterExpression(filters.get(i)) + ")");
+            }
+        }
+        return sb.toString();
+    }
+
+    public static String getFilterExpression(Filter filter) {
+        String property = filter.getProperty();
+        List<String> values = collectValues(filter.getFiltervalue(), filter.getFiltervalues());
+        if (values.size() == 1) {
+            return getFilterExpression(property, values.get(0));
+        } else if (values.size() > 1) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(getFilterExpression(property, values.get(0)));
+            for (int i = 1; i < values.size(); i++) {
+                sb.append(" OR ");
+                sb.append(getFilterExpression(property, values.get(i)));
+            }
+            return sb.toString();
+        }
+        return null;
+    }
+
+    public static String getFilterExpression(String property, String value) {
+        String filter = null;;
+        if (DbFilter.hasSearchParams(value)) {
+            if (TIMESTAMPPROPERTYNAMES.contains(property.toLowerCase())) {
+                if (DbFilter.isComparisonValid(value)) {
+                    filter = getComparisonFilter(property, value, true);
+                } else {
+                    filter = fromTimestampSearchFilter(property, value);
+                }
+                if (filter != null) {
+                    return filter;
+                }
+            }
+            return new RegexSqlDBFilter(property, value).getFilterExpression();
+        } else if (DbFilter.isComparisonValid(value)) {
+            filter = getComparisonFilter(property, value, TIMESTAMPPROPERTYNAMES.contains(property.toLowerCase()));
+            if (filter != null) {
+                return filter;
+            }
+        }
+        return new DBFilterKeyValuePair(property, value).getFilterExpression();
+    }
+
+    static List<String> collectValues(String filtervalue, List<String> filtervalues) {
+        if (filtervalues == null) {
+            return Arrays.asList(filtervalue);
+        }
+        List<String> values = new ArrayList<>();
+        if (filtervalue != null) {
+            values.add(filtervalue);
+        }
+        values.addAll(filtervalues);
+        return values;
+    }
+
+    private static String getComparisonFilter(String property, String filtervalue, boolean asTimeStamp) {
+        filtervalue = filtervalue.trim();
+        String comparator = null;
+        Object value;
+        if (filtervalue.startsWith(">=")) {
+            comparator = ">=";
+            filtervalue = filtervalue.substring(2).trim();
+            if (asTimeStamp) {
+                filtervalue = netconfToMariaDBTimestamp(fillTimeStamp(
+                        filtervalue.endsWith("*") ? filtervalue : (filtervalue + "*"), MARIADB_TIMESTAMP_REPLACER));
+            }
+        } else if (filtervalue.startsWith(">")) {
+            comparator = ">";
+            filtervalue = filtervalue.substring(1).trim();
+            if (asTimeStamp) {
+                if (isFullTimestamp(filtervalue)) {
+                    filtervalue = netconfToMariaDBTimestamp(filtervalue);
+                } else {
+                    comparator = ">=";
+                    filtervalue = netconfToMariaDBTimestamp(
+                            fillTimeStamp(filtervalue.endsWith("*") ? filtervalue : (filtervalue + "*"),
+                                    NETCONF_TIMESTAMP_REPLACER, true));
+                }
+            }
+        } else if (filtervalue.startsWith("<=")) {
+            comparator = "<=";
+            filtervalue = filtervalue.substring(2).trim();
+            if (asTimeStamp) {
+                if (isFullTimestamp(filtervalue)) {
+                    filtervalue = netconfToMariaDBTimestamp(filtervalue);
+                } else {
+                    comparator = "<";
+                    filtervalue = netconfToMariaDBTimestamp(
+                            fillTimeStamp(filtervalue.endsWith("*") ? filtervalue : (filtervalue + "*"),
+                                    NETCONF_TIMESTAMP_REPLACER, true));
+                }
+            }
+        } else if (filtervalue.startsWith("<")) {
+            comparator = "<";
+            filtervalue = filtervalue.substring(1).trim();
+            if (asTimeStamp) {
+                filtervalue = netconfToMariaDBTimestamp(fillTimeStamp(
+                        filtervalue.endsWith("*") ? filtervalue : (filtervalue + "*"), MARIADB_TIMESTAMP_REPLACER));
+            }
+        } else {
+            return null;
+        }
+        value = filtervalue;
+        return new RangeSqlDBFilter(property, value, comparator).getFilterExpression();
+    }
+
+    static boolean isFullTimestamp(String v) {
+        return v.length() >= MARIADB_TIMESTAMP_REPLACER_MIN_LENGTH;
+    }
+
+    /**
+     * Convert timestamp beginning filter expression like 2017* to a full qualified timestamp like '2017-01-01
+     * 00:00:00'.
+     *
+     * @param value filter input value
+     * @return fully qualified timestamp
+     */
+    private static String fillTimeStamp(String value) {
+        return fillTimeStamp(value, NETCONF_TIMESTAMP_REPLACER);
+    }
+
+    private static String fillTimeStamp(String value, String replacer) {
+        return fillTimeStamp(value, replacer, false);
+    }
+
+    private static String fillTimeStamp(String value, String replacer, boolean useUpperEnd) {
+        int idx = value.lastIndexOf("*");
+        String s = null;
+        if (idx > replacer.length()) {
+            s = value.substring(0, replacer.length());
+        } else {
+            s = value.substring(0, idx) + replacer.substring(idx);
+        }
+        //if month is zero => set to 1
+        if (Integer.parseInt(s.substring(5, 7)) == 0) {
+            s = s.substring(0, 5) + "01-" + s.substring(8);
+        }
+        //if day is zero => set to 1
+        if (Integer.parseInt(s.substring(8, 10)) == 0) {
+            s = s.substring(0, 8) + "01" + s.substring(10);
+        }
+        if (useUpperEnd) {
+            s = getTimestampUpperLimit(s, idx);
+        }
+        return s;
+    }
+
+    /**
+     * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte: 2017-01-01
+     * 00:00:00, lt:2018-01-01 00:00:00Z
+     *
+     * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01
+     *
+     */
+    private static @Nullable String fromTimestampSearchFilter(String property, String value) {
+        if (!value.endsWith("*")) {
+            return null;
+        }
+        int idx = value.lastIndexOf("*");
+        String lowerEnd = fillTimeStamp(value);
+        String upperEnd = getTimestampUpperLimit(fillTimeStamp(value, "0000-00-00T00:00:00.0Z"), idx);
+        return RangeSqlDBFilter.between(property, netconfToMariaDBTimestamp(lowerEnd), true,
+                netconfToMariaDBTimestamp(upperEnd), false);
+    }
+
+        private static String netconfToMariaDBTimestamp(String ts) {
+            String v = ts.replace("T", " ").replace("Z", "");
+            return v.length() > MARIADB_TIMESTAMP_REPLACER_MAX_LENGTH
+                    ? v.substring(0, MARIADB_TIMESTAMP_REPLACER_MAX_LENGTH)
+                    : v;
+        }
+
+    private static String getTimestampUpperLimit(String lowerEnd, int idx) {
+
+        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;
+        }
+        return upperEnd;
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpdateQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpdateQuery.java
new file mode 100644 (file)
index 0000000..b47b030
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * ============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.database.sqldb.query;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
+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 UpdateQuery<T extends DataObject> implements SqlQuery {
+
+    private final Logger LOG = LoggerFactory.getLogger(UpdateQuery.class);
+
+    private final Entity entity;
+    private final String controllerId;
+    private final T object;
+    private final boolean ignoreNull;
+    private String id;
+
+    public UpdateQuery(Entity e, T object) {
+        this(e, object, null);
+    }
+
+    public UpdateQuery(Entity e, T object, String controllerId) {
+        this.entity = e;
+        this.controllerId = controllerId;
+        this.object = object;
+        this.ignoreNull = true;
+        this.id = null;
+    }
+
+    @Override
+    public String toSql() {
+        try {
+            return this.toSqlWithError();
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | JsonProcessingException e) {
+            LOG.warn("unable to create insert statement for table {} from object {}: ", this.entity, this.object, e);
+        }
+        return null;
+    }
+
+    private String toSqlWithError() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
+            JsonProcessingException {
+        Class<?> cls = this.object.getClass();
+        Object value;
+        String col;
+        StringBuilder sb = new StringBuilder();
+        List<String> args = new ArrayList<>();
+        sb.append("UPDATE `" + entity.getName() + "` SET ");
+        List<Method> methods = SqlDBMapper.getFilteredMethods(cls, true);
+        Method m;
+        for (int i = 0; i < methods.size(); i++) {
+            m = methods.get(i);
+            m.setAccessible(true);
+            value = m.invoke(this.object);
+            col = SqlDBMapper.getColumnName(m);
+            if (col.equals("id")) {
+                if (this.id == null) {
+                    this.id = String.valueOf(value);
+                }
+                continue;
+            }
+            if (ignoreNull && value == null) {
+                continue;
+            }
+            DBKeyValuePair<String> kvp = SqlDBMapper.getEscapedKeyValue(m, col, value);
+            args.add(String.format("%s=%s", kvp.getKey(), kvp.getValue()));
+        }
+        sb.append(String.join(",", args));
+        sb.append(String.format(" WHERE `id`='%s'", this.id));
+        if (this.controllerId != null) {
+            sb.append(String.format(" AND `%s`='%s'", SqlDBMapper.ODLID_DBCOL, this.controllerId));
+        }
+
+        return sb.toString();
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpsertQuery.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpsertQuery.java
new file mode 100644 (file)
index 0000000..e6f1e13
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * ============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.sqldb.query;
+
+import java.util.List;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+public class UpsertQuery<T extends DataObject> extends InsertQuery<T> {
+
+    public UpsertQuery(Entity e, T object, String controllerId) {
+        super(e, object, controllerId);
+
+    }
+
+    @Override
+    protected void appendAdditionalToQuery(StringBuilder sb, List<DBKeyValuePair<String>> keyValues) {
+        sb.append(" ON DUPLICATE KEY UPDATE ");
+        boolean comma = false;
+        for (DBKeyValuePair<String> kvp : keyValues) {
+            if(kvp.getKey().equals("`id`")) {
+                continue;
+            }
+            //do not update is-required if entry already exists
+            if (this.entity == Entity.NetworkelementConnection && kvp.getKey().equals("`is-required`")
+                    && (kvp.getValue().equals("false") || kvp.getValue().equals("0"))) {
+                continue;
+            }
+            if (comma) {
+                sb.append(",");
+            }
+            sb.append(String.format("%s=%s", kvp.getKey(), kvp.getValue()));
+            comma = true;
+        }
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBFilterKeyValuePair.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBFilterKeyValuePair.java
new file mode 100644 (file)
index 0000000..930f16a
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * ============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.database.sqldb.query.filters;
+
+public class DBFilterKeyValuePair extends DBKeyValuePair<Object> {
+
+    public DBFilterKeyValuePair(String key, Object value) {
+        super(key, value);
+    }
+
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBKeyValuePair.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBKeyValuePair.java
new file mode 100644 (file)
index 0000000..2474e52
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * ============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.database.sqldb.query.filters;
+
+import java.math.BigInteger;
+
+public class DBKeyValuePair<T> implements SqlDBFilter {
+
+    private final String key;
+    private final T value;
+
+    public DBKeyValuePair(String key, T value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public T getValue() {
+        return value;
+    }
+
+    @Override
+    public String toString() {
+        return "DBKeyValuePair [key=" + key + ", value=" + value + "]";
+    }
+
+    protected boolean isNumericValue(T v) {
+        if ((v instanceof Long) || (v instanceof Integer) || (v instanceof Byte) || (v instanceof BigInteger)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public String getFilterExpression() {
+        if (isNumericValue(this.value)) {
+            return String.format("`%s`=%d", this.key, this.value);
+        } else {
+            return String.format("`%s`='%s'", this.key, this.value);
+        }
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RangeSqlDBFilter.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RangeSqlDBFilter.java
new file mode 100644 (file)
index 0000000..c4a5d8a
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * ============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.sqldb.query.filters;
+
+import org.eclipse.jdt.annotation.Nullable;
+
+public class RangeSqlDBFilter extends DBKeyValuePair<Object> implements SqlDBFilter {
+
+    private final String comparator;
+
+    public RangeSqlDBFilter(String property, Object value, String comparator) {
+        super(property, value);
+        this.comparator = comparator;
+    }
+
+    @Override
+    public String getFilterExpression() {
+        if (isNumericValue(this.getValue())) {
+            return String.format("`%s`%s%d", this.getKey(), this.comparator, this.getValue());
+        } else {
+            return String.format("`%s`%s'%s'", this.getKey(), this.comparator, this.getValue());
+        }
+    }
+
+    public static @Nullable String between(String property, String lowerEnd, boolean incLowerEnd, String upperEnd,
+            boolean incUpperEnd) {
+        return String.format("(%s AND %s)",
+                new RangeSqlDBFilter(property, lowerEnd, incLowerEnd ? ">=" : ">").getFilterExpression(),
+                new RangeSqlDBFilter(property, upperEnd, incUpperEnd ? "<=" : "<").getFilterExpression());
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RegexSqlDBFilter.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RegexSqlDBFilter.java
new file mode 100644 (file)
index 0000000..4ef1b9a
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * ============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.sqldb.query.filters;
+
+public class RegexSqlDBFilter extends DBKeyValuePair<String> implements SqlDBFilter{
+
+
+    public RegexSqlDBFilter(String key, String value) {
+        super(key, value);
+    }
+
+    @Override
+    public String getFilterExpression() {
+        return String.format("`%s` RLIKE '%s'", this.getKey(), this.getValue());
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/SqlDBFilter.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/SqlDBFilter.java
new file mode 100644 (file)
index 0000000..2997c70
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * ============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.sqldb.query.filters;
+
+public interface SqlDBFilter {
+
+    public String getFilterExpression();
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestCRUDMariaDB.java b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestCRUDMariaDB.java
new file mode 100644 (file)
index 0000000..ad4ab67
--- /dev/null
@@ -0,0 +1,236 @@
+/*
+ * ============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.dblib.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.dblib.test.util.MariaDBTestBase;
+import ch.vorburger.exec.ManagedProcessException;
+
+public class TestCRUDMariaDB {
+
+
+    private static final String TABLE1_NAME = "table1";
+    private static final String TABLE2_NAME = "table2-v6";
+    private static final String TABLE3_NAME = "table3-v6";
+    private static final String VIEW2_NAME = "table2";
+    private static final String VIEW3_NAME = "table3";
+    private static final String TABLE1_MAPPING = "col1 INT PRIMARY KEY, col2 NVARCHAR(30), col3 BOOLEAN";
+    private static final String TABLE2_MAPPING = "col1 INT PRIMARY KEY, col2 NVARCHAR(30), col3 BOOLEAN";
+    private static final String TABLE3_MAPPING = "col1 INT PRIMARY KEY, col2 NVARCHAR(30), col3 BOOLEAN";
+    private static final String DELETE_ALL_FORMAT = "DELETE FROM `%s`";
+    private static final String READ_ALL_FORMAT = "SELECT * FROM `%s`";
+    private static final String TABLE1_INSERT_ENTRY_FORMAT =
+            "INSERT INTO `" + TABLE1_NAME + "` (col1, col2, col3) VALUES(%d,'%s',%d);";
+    private static final String TABLE1_UPDATE_ENTRY_FORMAT =
+            "UPDATE `" + TABLE1_NAME + "` SET col2='%s', col3=%d WHERE col1=%d;";
+    private static final String TABLE1_DELETE_ENTRY_FORMAT = "DELETE FROM `" + TABLE1_NAME + "` WHERE col1=%d;";
+    private static String DBNAME = null;
+
+    private static MariaDBTestBase testBase;
+    private static SqlDBDataProvider dbProvider;
+    private static SqlDBClient dbClient;
+
+    @BeforeClass
+    public static void init() throws Exception {
+
+        testBase = new MariaDBTestBase();
+        dbProvider = testBase.getDbProvider();
+        dbProvider.waitForDatabaseReady(30, TimeUnit.SECONDS);
+        dbClient = testBase.createRawClient();
+        DBNAME = testBase.getDBName();
+    }
+
+    @AfterClass
+    public static void close() {
+        try {
+            testBase.close();
+        } catch (ManagedProcessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void test1() {
+        ResultSet data;
+        boolean success;
+        String id = null;
+        //create test1Table
+        success = dbClient.createTable(TABLE1_NAME, TABLE1_MAPPING);
+        assertTrue("failed to create table", success);
+        //delete all
+        try {
+            success = dbClient.delete(String.format(DELETE_ALL_FORMAT, TABLE1_NAME));
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        assertTrue("failed to clear table", success);
+        //test empty
+        data = dbClient.read(String.format(READ_ALL_FORMAT, TABLE1_NAME));
+        try {
+            assertEquals(0, countRows(data));
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("unable to read size");
+        }
+        //create entry
+        success = false;
+        try {
+            success = dbClient.write(String.format(TABLE1_INSERT_ENTRY_FORMAT, 10, "hello", 0));
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        assertTrue("failed to write data", success);
+        //verify write
+        data = dbClient.read(String.format(READ_ALL_FORMAT, TABLE1_NAME));
+        try {
+            assertEquals(1, countRows(data));
+            assertTrue(data.next());
+            assertEquals(10, data.getInt(1));
+            assertEquals("hello", data.getString(2));
+            assertEquals(false, data.getBoolean(3));
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("unable to verify write");
+        }
+        //update entry
+        success = false;
+        try {
+            success = dbClient.update(String.format(TABLE1_UPDATE_ENTRY_FORMAT, "hello2", 1, 10));
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        assertTrue("failed to update data", success);
+        //verify update
+        data = dbClient.read(String.format(READ_ALL_FORMAT, TABLE1_NAME));
+        try {
+            assertEquals(1, countRows(data));
+            assertTrue(data.next());
+            assertEquals(10, data.getInt(1));
+            assertEquals("hello2", data.getString(2));
+            assertEquals(true, data.getBoolean(3));
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("unable to verify write");
+        }
+        //delete entry
+        success = false;
+        try {
+            success = dbClient.delete(String.format(TABLE1_DELETE_ENTRY_FORMAT, 10));
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        assertTrue("failed to delete data", success);
+        //verify delete
+        data = dbClient.read(String.format(READ_ALL_FORMAT, TABLE1_NAME));
+        try {
+            assertEquals(0, data.getFetchSize());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("unable to verify delete. size>0");
+        }
+    }
+
+    @Test
+    public void testDBVersion() {
+        DatabaseVersion version = null;
+        try {
+            version = dbClient.readActualVersion();
+        } catch (SQLException | ParseException e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        assertTrue(version.getMajor() >= 10);
+    }
+
+    @Test
+    public void testTableStuff() {
+
+        boolean success;
+        //create Tables/Views
+        success = dbClient.createTable(TABLE2_NAME, TABLE2_MAPPING);
+        assertTrue(success);
+        success = dbClient.createTable(TABLE3_NAME, TABLE3_MAPPING);
+        assertTrue(success);
+        try {
+            success = dbClient.createView(TABLE2_NAME, VIEW2_NAME);
+            assertTrue(success);
+            success = dbClient.createView(TABLE3_NAME, VIEW3_NAME);
+            assertTrue(success);
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        //read Tables
+        IndicesEntryList tables = dbClient.readTables();
+        assertTrue(tables.stream().filter(t -> t.getName().equals(TABLE2_NAME)).count() == 1);
+        assertTrue(tables.stream().filter(t -> t.getName().equals(TABLE3_NAME)).count() == 1);
+        AliasesEntryList views = dbClient.readViews(DBNAME);
+        assertTrue(views.stream().filter(t -> t.getIndex().equals(TABLE2_NAME) && t.getAlias().equals(VIEW2_NAME))
+                .count() == 1);
+        assertTrue(views.stream().filter(t -> t.getIndex().equals(TABLE3_NAME) && t.getAlias().equals(VIEW3_NAME))
+                .count() == 1);
+
+        //delete Tables/Views
+        try {
+            success = dbClient.deleteView(VIEW2_NAME);
+            assertTrue(success);
+            success = dbClient.deleteView(VIEW3_NAME);
+            assertTrue(success);
+            success = dbClient.deleteTable(TABLE2_NAME);
+            assertTrue(success);
+            success = dbClient.deleteTable(TABLE3_NAME);
+            assertTrue(success);
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        //verify
+        tables = dbClient.readTables();
+        assertTrue(tables.stream().filter(t->t.getName().equals(TABLE2_NAME)).count()==0);
+        assertTrue(tables.stream().filter(t->t.getName().equals(TABLE3_NAME)).count()==0);
+        views = dbClient.readViews(DBNAME);
+        assertEquals(0,views.size());
+    }
+
+    public static int countRows(ResultSet data) throws SQLException {
+        int rows = 0;
+        while (data.next()) {
+            rows++;
+        }
+        data.beforeFirst();
+        return rows;
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestMariaDataProvider.java b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestMariaDataProvider.java
new file mode 100644 (file)
index 0000000..da74500
--- /dev/null
@@ -0,0 +1,563 @@
+/*
+ * ============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.dblib.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.DeleteQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.dblib.test.util.MariaDBTestBase;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
+import org.opendaylight.netconf.shaded.sshd.common.util.io.IoUtils;
+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.CreateMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInputBuilder;
+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.CreateMediatorServerInputBuilder;
+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.DeleteMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInputBuilder;
+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.DeleteNetworkElementConnectionInputBuilder;
+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.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.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.Inventory;
+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.NetworkElementDeviceType;
+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.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.ReadFaultcurrentListInputBuilder;
+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.ReadPmdata24hListOutputBuilder;
+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.SeverityType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
+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.UpdateMediatorServerInputBuilder;
+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.UpdateNetworkElementConnectionInputBuilder;
+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.FilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.PaginationBuilder;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import ch.vorburger.exec.ManagedProcessException;
+
+public class TestMariaDataProvider {
+
+
+    private static final String NODEID1 = "node1";
+    private static final String NODEID2 = "node2";
+    private static final String NODEID3 = "node3";
+    private static final String PROBLEM1 = "problem1";
+    private static final String TIME1 = "2021-05-25T05:12:55.0Z";
+    private static final String TIME2 = "2021-05-25T05:12:56.0Z";
+    private static final String TIME3 = "2021-05-25T05:12:57.0Z";
+    private static final String PROBLEM2 = "problem2";
+    private static final String URI1 = "http://localhost:8181";
+    private static final String URI2 = "http://localhost:8181";
+    private static final String URI3 = "http://localhost:8181";
+    private static MariaDBTestBase testBase;
+    private static SqlDBDataProvider dbProvider;
+    private static SqlDBClient dbClient;
+    private static String CONTROLLERID;
+
+    @BeforeClass
+    public static void init() throws Exception {
+
+        testBase = new MariaDBTestBase();
+        dbProvider = testBase.getDbProvider();
+        dbProvider.waitForDatabaseReady(30, TimeUnit.SECONDS);
+        dbClient = testBase.createRawClient();
+        MariaDBTestBase.testCreateTableStructure(dbClient);
+        dbProvider.setControllerId();
+        CONTROLLERID = dbProvider.getControllerId();
+
+    }
+
+    @AfterClass
+    public static void close() {
+        try {
+            testBase.close();
+        } catch (ManagedProcessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testFaultcurrent() {
+        dbProvider.clearFaultsCurrentOfNode(NODEID1);
+        ReadFaultcurrentListOutputBuilder faultCurrents =
+                dbProvider.readFaultCurrentList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(0, faultCurrents.getData().size());
+        FaultcurrentEntity faultCurrent1 = new FaultcurrentBuilder().setNodeId(NODEID1).setCounter(1).setObjectId("obj")
+                .setProblem(PROBLEM1).setTimestamp(DateAndTime.getDefaultInstance(TIME1))
+                .setSeverity(SeverityType.Major).setId(String.format("%s/%s", NODEID1, PROBLEM1)).build();
+        dbProvider.updateFaultCurrent(faultCurrent1);
+        FaultcurrentEntity faultCurrent2 = new FaultcurrentBuilder().setNodeId(NODEID1).setCounter(1).setObjectId("obj")
+                .setProblem(PROBLEM2).setTimestamp(DateAndTime.getDefaultInstance(TIME1))
+                .setSeverity(SeverityType.Minor).setId(String.format("%s/%s", NODEID1, PROBLEM2)).build();
+        dbProvider.updateFaultCurrent(faultCurrent2);
+        faultCurrents = dbProvider.readFaultCurrentList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(2, faultCurrents.getData().size());
+        ReadStatusOutputBuilder status = null;
+        try {
+            status = dbProvider.readStatus();
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to read status");
+        }
+        assertEquals(0, status.getData().get(0).getFaults().getCriticals().intValue());
+        assertEquals(1, status.getData().get(0).getFaults().getMajors().intValue());
+        assertEquals(1, status.getData().get(0).getFaults().getMinors().intValue());
+        assertEquals(0, status.getData().get(0).getFaults().getWarnings().intValue());
+
+        faultCurrent1 = new FaultcurrentBuilder().setNodeId(NODEID1).setCounter(1).setObjectId("obj")
+                .setProblem(PROBLEM1).setTimestamp(DateAndTime.getDefaultInstance(TIME1))
+                .setSeverity(SeverityType.NonAlarmed).setId(String.format("%s/%s", NODEID1, PROBLEM1)).build();
+        dbProvider.updateFaultCurrent(faultCurrent1);
+        faultCurrents = dbProvider.readFaultCurrentList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(1, faultCurrents.getData().size());
+    }
+
+    @Test
+    public void testFaultlog() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Faultcurrent, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        ReadFaultlogListOutputBuilder faultlogs = dbProvider.readFaultLogList(createInput(1, 20));
+        assertEquals(0, faultlogs.getData().size());
+        FaultlogEntity fault1 = new FaultlogBuilder().setCounter(1).setNodeId(NODEID1).setObjectId("obj")
+                .setProblem(PROBLEM1).setSeverity(SeverityType.Major).setSourceType(SourceType.Netconf)
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME1)).build();
+        dbProvider.writeFaultLog(fault1);
+        FaultlogEntity fault2 = new FaultlogBuilder().setCounter(2).setNodeId(NODEID1).setObjectId("obj")
+                .setProblem(PROBLEM2).setSeverity(SeverityType.Major).setSourceType(SourceType.Netconf)
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME1)).build();
+        dbProvider.writeFaultLog(fault2);
+        faultlogs = dbProvider.readFaultLogList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(2, faultlogs.getData().size());
+    }
+
+    @Test
+    public void testConnectionlog() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Connectionlog, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        ReadConnectionlogListOutputBuilder logs = dbProvider.readConnectionlogList(createInput(1, 20));
+        assertEquals(0, logs.getData().size());
+        ConnectionlogEntity log1 = new ConnectionlogBuilder().setNodeId(NODEID1)
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME1)).setStatus(ConnectionLogStatus.Mounted).build();
+        dbProvider.writeConnectionLog(log1);
+        ConnectionlogEntity log2 = new ConnectionlogBuilder().setNodeId(NODEID1)
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME2)).setStatus(ConnectionLogStatus.Connecting).build();
+        dbProvider.writeConnectionLog(log2);
+        ConnectionlogEntity log3 = new ConnectionlogBuilder().setNodeId(NODEID1)
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME3)).setStatus(ConnectionLogStatus.Connected).build();
+        dbProvider.writeConnectionLog(log3);
+        logs = dbProvider.readConnectionlogList(createInput(1, 20));
+        assertEquals(3, logs.getData().size());
+    }
+
+    @Test
+    public void testEventlog() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Eventlog, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        ReadEventlogListOutputBuilder logs = null;
+        try {
+            logs = dbProvider.readEventlogList(createInput(1, 20));
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        assertEquals(0, logs.getData().size());
+        EventlogEntity log1 = new EventlogBuilder().setCounter(1).setNodeId(NODEID1).setObjectId("obj")
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME1)).setAttributeName("attr").setNewValue("new-value")
+                .setSourceType(SourceType.Netconf).build();
+        dbProvider.writeEventLog(log1);
+        EventlogEntity log2 = new EventlogBuilder().setCounter(1).setNodeId(NODEID1).setObjectId("obj")
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME2)).setAttributeName("attr").setNewValue("new-value2")
+                .setSourceType(SourceType.Netconf).build();
+        dbProvider.writeEventLog(log2);
+        EventlogEntity log3 = new EventlogBuilder().setCounter(1).setNodeId(NODEID1).setObjectId("obj")
+                .setTimestamp(DateAndTime.getDefaultInstance(TIME3)).setAttributeName("attr").setNewValue("new-value3")
+                .setSourceType(SourceType.Netconf).build();
+        dbProvider.writeEventLog(log3);
+        try {
+            logs = dbProvider.readEventlogList(createInput(1, 20));
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        assertEquals(3, logs.getData().size());
+    }
+
+    @Test
+    public void testGuicutthrough() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Guicutthrough, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        Guicutthrough gc1 = new GuicutthroughBuilder().setName(NODEID1).setWeburi(URI1).build();
+        dbProvider.writeGuiCutThroughData(gc1, NODEID1);
+        Guicutthrough gc2 = new GuicutthroughBuilder().setName(NODEID2).setWeburi(URI2).build();
+        dbProvider.writeGuiCutThroughData(gc2, NODEID2);
+        Guicutthrough gc3 = new GuicutthroughBuilder().setName(NODEID3).setWeburi(URI3).build();
+        dbProvider.writeGuiCutThroughData(gc3, NODEID3);
+        ReadGuiCutThroughEntryOutputBuilder data = dbProvider.readGuiCutThroughEntry(createInput(1, 20));
+        assertEquals(3, data.getData().size());
+        data = dbProvider.readGuiCutThroughEntry(createInput("name", NODEID1, 1, 20));
+        assertEquals(1, data.getData().size());
+
+    }
+
+    @Test
+    public void testInventory() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Inventoryequipment, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        ReadInventoryListOutputBuilder data = dbProvider.readInventoryList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        List<Inventory> list = null;
+        try {
+            list = loadListFile("/inventory.json", Inventory.class);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("problem loading inventory data");
+
+        }
+        dbProvider.writeInventory(NODEID1, list);
+        data = dbProvider.readInventoryList(createInput(1, 50));
+        assertEquals(22, data.getData().size());
+        data = dbProvider.readInventoryList(createInput("tree-level", "0", 1, 50));
+        assertEquals(5, data.getData().size());
+    }
+
+    @Test
+    public void testMaintenance() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Maintenancemode, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing faultlog");
+        }
+        ReadMaintenanceListOutputBuilder data = dbProvider.readMaintenanceList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        CreateMaintenanceInput maint1 = new CreateMaintenanceInputBuilder().setId(NODEID1).setNodeId(NODEID1)
+                .setActive(true).setDescription("desc").setObjectIdRef("ref").setProblem("problem")
+                .setStart(DateAndTime.getDefaultInstance(TIME1)).setEnd(DateAndTime.getDefaultInstance(TIME3)).build();
+        CreateMaintenanceInput maint2 = new CreateMaintenanceInputBuilder().setId(NODEID2).setNodeId(NODEID2)
+                .setActive(true).setDescription("desc").setObjectIdRef("ref").setProblem("problem2")
+                .setStart(DateAndTime.getDefaultInstance(TIME1)).setEnd(DateAndTime.getDefaultInstance(TIME3)).build();
+        CreateMaintenanceInput maint3 = new CreateMaintenanceInputBuilder().setId(NODEID3).setNodeId(NODEID3)
+                .setActive(true).setDescription("desc").setObjectIdRef("ref").setProblem("problem3")
+                .setStart(DateAndTime.getDefaultInstance(TIME1)).setEnd(DateAndTime.getDefaultInstance(TIME3)).build();
+        try {
+            dbProvider.createMaintenance(maint1);
+            dbProvider.createMaintenance(maint2);
+            dbProvider.createMaintenance(maint3);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("unable to create maintenance data");
+        }
+        data = dbProvider.readMaintenanceList(createInput(1, 20));
+        assertEquals(3, data.getData().size());
+
+    }
+
+    @Test
+    public void testMediatorserver() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.MediatorServer, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing mediator server");
+        }
+        ReadMediatorServerListOutputBuilder data = dbProvider.readMediatorServerList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        CreateMediatorServerInput mediator1 =
+                new CreateMediatorServerInputBuilder().setName("server1").setUrl("http://10.20.30.40:7070").build();
+        CreateMediatorServerInput mediator2 =
+                new CreateMediatorServerInputBuilder().setName("server2").setUrl("http://10.20.30.42:7070").build();
+        CreateMediatorServerInput mediator3 =
+                new CreateMediatorServerInputBuilder().setName("server3").setUrl("http://10.20.30.43:7070").build();
+        CreateMediatorServerOutputBuilder output1 = null, output2 = null;
+        try {
+            output1 = dbProvider.createMediatorServer(mediator1);
+            output2 = dbProvider.createMediatorServer(mediator2);
+            dbProvider.createMediatorServer(mediator3);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("problem creating mediator servers");
+        }
+        data = dbProvider.readMediatorServerList(createInput(1, 20));
+        assertEquals(3, data.getData().size());
+        UpdateMediatorServerInput update1 = new UpdateMediatorServerInputBuilder().setId(output1.getId())
+                .setName("server1").setUrl("http://10.20.30.40:7071").build();
+        try {
+            dbProvider.updateMediatorServer(update1);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to update mediator server");
+        }
+        data = dbProvider.readMediatorServerList(createInput("id", output1.getId(), 1, 20));
+        assertEquals(1, data.getData().size());
+        assertEquals(output1.getId(), data.getData().get(0).getId());
+        assertEquals("server1", data.getData().get(0).getName());
+        assertEquals("http://10.20.30.40:7071", data.getData().get(0).getUrl());
+
+        DeleteMediatorServerInput delete2 = new DeleteMediatorServerInputBuilder().setId(output2.getId()).build();
+        try {
+            dbProvider.deleteMediatorServer(delete2);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("unable to delete mediator server");
+        }
+        data = dbProvider.readMediatorServerList(createInput("id", output2.getId(), 1, 20));
+        assertEquals(0, data.getData().size());
+        data = dbProvider.readMediatorServerList(createInput(1, 20));
+        assertEquals(2, data.getData().size());
+    }
+
+    @Test
+    public void testNeConnection() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.NetworkelementConnection, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing neconnection");
+        }
+        ReadNetworkElementConnectionListOutputBuilder data =
+                dbProvider.readNetworkElementConnectionList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        NetworkElementConnectionEntity ne1 = new NetworkElementConnectionBuilder().setNodeId(NODEID1)
+                .setHost("10.20.30.50").setPort(Uint32.valueOf(8300)).setIsRequired(true).setUsername("user")
+                .setPassword("passwd").build();
+        NetworkElementConnectionEntity ne2 = new NetworkElementConnectionBuilder().setNodeId(NODEID2)
+                .setHost("10.20.30.55").setPort(Uint32.valueOf(8300)).setIsRequired(false).setUsername("user")
+                .setPassword("passwd").setStatus(ConnectionLogStatus.Connecting).build();
+        try {
+            dbProvider.createNetworkElementConnection(ne1);
+            dbProvider.createNetworkElementConnection(ne2);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("problem creating neconnection");
+        }
+        data = dbProvider.readNetworkElementConnectionList(createInput(1, 20));
+        assertEquals(2, data.getData().size());
+        NetworkElementConnectionEntity update1 = new NetworkElementConnectionBuilder()
+                .setStatus(ConnectionLogStatus.Connected).setDeviceType(NetworkElementDeviceType.ORAN).build();
+        dbProvider.updateNetworkConnectionDeviceType(update1, NODEID1);
+        data = dbProvider.readNetworkElementConnectionList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(1, data.getData().size());
+        assertEquals(NetworkElementDeviceType.ORAN, data.getData().get(0).getDeviceType());
+        assertEquals(true, data.getData().get(0).isIsRequired());
+        UpdateNetworkElementConnectionInput update2 = new UpdateNetworkElementConnectionInputBuilder().setId(NODEID2)
+                .setHost("10.20.55.44").setIsRequired(true).build();
+        try {
+            dbProvider.updateNetworkElementConnection(update2);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to update neconnection");
+        }
+        data = dbProvider.readNetworkElementConnectionList(createInput("node-id", NODEID2, 1, 20));
+        assertEquals(1, data.getData().size());
+        assertEquals("10.20.55.44", data.getData().get(0).getHost());
+        assertEquals(true, data.getData().get(0).isIsRequired());
+
+        ReadStatusOutputBuilder status = null;
+        try {
+            status = dbProvider.readStatus();
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to read status");
+        }
+        assertEquals(1, status.getData().get(0).getNetworkElementConnections().getConnected().intValue());
+        assertEquals(1, status.getData().get(0).getNetworkElementConnections().getConnecting().intValue());
+        assertEquals(0, status.getData().get(0).getNetworkElementConnections().getDisconnected().intValue());
+        assertEquals(0, status.getData().get(0).getNetworkElementConnections().getMounted().intValue());
+        assertEquals(2, status.getData().get(0).getNetworkElementConnections().getTotal().intValue());
+        assertEquals(0, status.getData().get(0).getNetworkElementConnections().getUnableToConnect().intValue());
+        assertEquals(0, status.getData().get(0).getNetworkElementConnections().getUndefined().intValue());
+        assertEquals(0, status.getData().get(0).getNetworkElementConnections().getUnmounted().intValue());
+
+
+        DeleteNetworkElementConnectionInput delete1 =
+                new DeleteNetworkElementConnectionInputBuilder().setId(NODEID1).build();
+        try {
+            dbProvider.deleteNetworkElementConnection(delete1);
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to delete neconnection");
+        }
+        data = dbProvider.readNetworkElementConnectionList(createInput("node-id", NODEID1, 1, 20));
+        assertEquals(0, data.getData().size());
+        data = dbProvider.readNetworkElementConnectionList(createInput(1, 20));
+        assertEquals(1, data.getData().size());
+    }
+
+    @Test
+    public void testpm15m() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Historicalperformance15min, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing pmdata15m");
+        }
+        ReadPmdata15mListOutputBuilder data = dbProvider.readPmdata15mList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        List<PmdataEntity> list = null;
+        try {
+            list = loadListFile("/pmdata15m.json", PmdataEntity.class);
+        } catch (JSONException | IOException e) {
+            e.printStackTrace();
+            fail("failed to load pmdata15m");
+        }
+        dbProvider.doWritePerformanceData(list);
+        data = dbProvider.readPmdata15mList(createInput(1, 20));
+        assertEquals(10, data.getData().size());
+        ReadPmdata15mLtpListOutputBuilder ltpdata = null;
+        try {
+            ltpdata = dbProvider.readPmdata15mLtpList(createInput("node-name","sim12600",1, 20));
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to read pmdata15m ltp list");
+        }
+        assertEquals(3, ltpdata.getData().size());
+        ReadPmdata15mDeviceListOutputBuilder devicedata = null;
+        try {
+             devicedata = dbProvider.readPmdata15mDeviceList(createInput(1,20));
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("failed to read pmdata15m devices list");
+        }
+        assertEquals(1, devicedata.getData().size());
+    }
+
+    @Ignore
+    @Test
+    public void testpm24h() {
+        try {
+            dbClient.delete(new DeleteQuery(Entity.Historicalperformance24h, null).toSql());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            fail("problem clearing pmdata24h");
+        }
+        ReadPmdata24hListOutputBuilder data = dbProvider.readPmdata24hList(createInput(1, 20));
+        assertEquals(0, data.getData().size());
+        List<PmdataEntity> list = null;
+        try {
+            list = loadListFile("/pmdata24h.json", PmdataEntity.class);
+        } catch (JSONException | IOException e) {
+            e.printStackTrace();
+            fail("failed to load pmdata24h");
+        }
+        dbProvider.doWritePerformanceData(list);
+    }
+
+    private static EntityInput createInput(int page, int size) {
+        return createInput(null, null, page, size);
+    }
+
+    private static <T> List<T> loadListFile(String filename, Class<T> clazz) throws JSONException, IOException {
+        List<T> list = new ArrayList<>();
+        JSONArray a = new JSONArray(loadFile(filename));
+        for (int i = 0; i < a.length(); i++) {
+            list.add(loadData(a.getJSONObject(i).toString(), clazz));
+        }
+        return list;
+    }
+
+    private static <T> T loadData(String content, Class<T> clazz) throws IOException {
+        YangToolsMapper mapper = new YangToolsMapper();
+        return mapper.readValue(content, clazz);
+    }
+
+    private static String loadFile(String filename) throws IOException {
+        return String.join("\n", IoUtils.readAllLines(TestMariaDataProvider.class.getResourceAsStream(filename)));
+    }
+
+    private static EntityInput createInput(String filter, String filterValue, int page, int size) {
+        ReadFaultcurrentListInputBuilder builder = new ReadFaultcurrentListInputBuilder().setPagination(
+                new PaginationBuilder().setPage(Uint64.valueOf(page)).setSize(Uint32.valueOf(size)).build());
+        if (filter != null && filterValue != null) {
+            Filter f = new FilterBuilder().setProperty(filter).setFiltervalue(filterValue).build();
+            Map<FilterKey, Filter> fmap = new HashMap<>();
+            fmap.put(f.key(), f);
+            builder.setFilter(fmap);
+        }
+        return builder.build();
+    }
+
+}
diff --git a/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestQuerySyntax.java b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestQuerySyntax.java
new file mode 100644 (file)
index 0000000..758b72f
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * ============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.dblib.test;
+
+import static org.junit.Assert.assertTrue;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.SelectQuery;
+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.ReadEventlogListInputBuilder;
+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.FilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.FilterKey;
+
+public class TestQuerySyntax {
+
+
+    private static final String TABLENAME1 = "table1";
+    private static final String CONTROLLERID = "controllerid1";
+
+    @Test
+    public void testTimestampFilter() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter = new FilterBuilder().setProperty("timestamp").setFiltervalue("2021*").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`>='2021-01-01 00:00:00.000'"));
+        assertTrue(sql.contains("`timestamp`<'2022-01-01 00:00:00.0'"));
+    }
+
+    @Test
+    public void testTimestampFilter2() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter = new FilterBuilder().setProperty("timestamp").setFiltervalue(">2021").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`>='2022-01-01 00:00:00.0'"));
+    }
+
+    @Test
+    public void testTimestampFilter3() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter = new FilterBuilder().setProperty("timestamp").setFiltervalue(">=2021").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`>='2021-01-01 00:00:00.000'"));
+
+    }
+
+    @Test
+    public void testTimestampFilter4() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter = new FilterBuilder().setProperty("timestamp").setFiltervalue("<2021").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`<'2021-01-01 00:00:00.000'"));
+    }
+
+    @Test
+    public void testTimestampFilter5() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter = new FilterBuilder().setProperty("timestamp").setFiltervalue("<=2021").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`<'2022-01-01 00:00:00.0'"));
+    }
+
+    @Test
+    public void testTimestampFilter6() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter =
+                new FilterBuilder().setProperty("timestamp").setFiltervalue(">=2022-01-01T00:00:00.000Z").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`>='2022-01-01 00:00:00.000'"));
+    }
+
+    @Test
+    public void testTimestampFilter8() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter =
+                new FilterBuilder().setProperty("timestamp").setFiltervalue(">2022-01-01T00:00:00.000Z").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`>'2022-01-01 00:00:00.000'"));
+    }
+
+    @Test
+    public void testTimestampFilter9() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter =
+                new FilterBuilder().setProperty("timestamp").setFiltervalue("<2022-01-01T00:00:00.000Z").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`<'2022-01-01 00:00:00.000'"));
+    }
+
+    @Test
+    public void testTimestampFilter10() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter =
+                new FilterBuilder().setProperty("timestamp").setFiltervalue("<=2022-01-01T00:00:00.000Z").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`<='2022-01-01 00:00:00.000'"));
+    }
+
+    @Test
+    public void testTimestampFilter11() {
+        Map<FilterKey, Filter> filterMap = new HashMap<>();
+        Filter filter =
+                new FilterBuilder().setProperty("timestamp").setFiltervalue("<=2022-01-01T00:00:00.000222Z").build();
+        filterMap.put(filter.key(), filter);
+        EntityInput input = new ReadEventlogListInputBuilder().setFilter(filterMap).build();
+        SelectQuery query = new SelectQuery(TABLENAME1, input, CONTROLLERID);
+        final String sql = query.toSql();
+        assertTrue(sql.contains("`timestamp`<='2022-01-01 00:00:00.000'"));
+    }
+}
diff --git a/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/util/MariaDBTestBase.java b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/util/MariaDBTestBase.java
new file mode 100644 (file)
index 0000000..b065519
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * ============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.dblib.test.util;
+
+import static org.junit.Assert.fail;
+import java.io.File;
+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 SqlDBConfig config;
+    private static final Map<String, String> envDefaultValues = initEnvDefaultValues();
+    private static final String SDNRDBDATABASETEST = "test";
+
+    public MariaDBTestBase() throws ManagedProcessException {
+        this(new Random().nextInt(1000) + 50000);
+    }
+
+    private static String dbUrl(String host, int port, String dbName) {
+        return String.format("jdbc:mysql://%s:%d/%s", host, port, dbName);
+    }
+
+    private static Map<String, String> initEnvDefaultValues() {
+        Map<String, String> defaults = new HashMap<>();
+        defaults.put("SDNRDBURL", dbUrl("localhost", 3306, SDNRDBDATABASETEST));
+        defaults.put("SDNRDBDATABASE", "test");
+
+        return defaults;
+    }
+
+    public MariaDBTestBase(String host, int port) {
+        this(host, port, SDNRDBDATABASETEST);
+    }
+
+    public MariaDBTestBase(String host, int port, String dbName) {
+        EnvGetter env = Section.getEnvGetter();
+        envDefaultValues.put("SDNRDBURL", dbUrl(host, port, dbName));
+        envDefaultValues.put("SDNRDBUSERNAME", "sdnrdb");
+        envDefaultValues.put("SDNRDBPASSWORD", "sdnrdb");
+        Section.setEnvGetter((envname) -> {
+            return envDefaultValues.getOrDefault(envname, env.getenv(envname));
+        });
+        this.config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties"));
+        this.config.setDbSuffix("");
+        this.config.setControllerId("test123");
+        this.db = null;
+        this.dbProvider = new SqlDBDataProvider(config, false);
+    }
+
+    public MariaDBTestBase(int port) throws ManagedProcessException {
+        EnvGetter env = Section.getEnvGetter();
+        envDefaultValues.put("SDNRDBURL", dbUrl("localhost", port, SDNRDBDATABASETEST));
+        Section.setEnvGetter((envname) -> {
+            return envDefaultValues.getOrDefault(envname, env.getenv(envname));
+        });
+        this.config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties"));
+        this.config.setDbSuffix("");
+        this.config.setControllerId("test123");
+        //start db server
+        this.db = startDatabase(port);
+        //create db with name sdnrdb
+        this.dbProvider = new SqlDBDataProvider(config, false);
+    }
+
+    public void close() throws ManagedProcessException {
+        if (db != null) {
+            this.db.stop();
+        }
+        File f = new File("test.properties");
+        if(f.exists()) {
+            f.delete();
+        }
+    }
+
+    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 String getDBUrl() {
+        return envDefaultValues.get("SDNRDBURL");
+    }
+
+    public String getDBUsername() {
+        return envDefaultValues.getOrDefault("SDNRDBUSERNAME", "");
+    }
+
+    public String getDBPassword() {
+        return envDefaultValues.getOrDefault("SDNRDBPASSWORD", "");
+    }
+
+    public SqlDBClient createRawClient() {
+        return new SqlDBClient(this.config.getUrl(), this.config.getUsername(), this.config.getPassword());
+    }
+
+    public String getDBName() {
+        String url = this.getDBUrl();
+        return url.substring(url.lastIndexOf("/") + 1);
+    }
+
+    public static void testCreateTableStructure(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, false);
+        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);
+        return dbService.createTable(createStatement);
+    }
+
+    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);
+        return dbService.createTable(createStatement);
+    }
+}
+
diff --git a/sdnr/wt/data-provider/dblib/src/test/resources/inventory.json b/sdnr/wt/data-provider/dblib/src/test/resources/inventory.json
new file mode 100644 (file)
index 0000000..9a29325
--- /dev/null
@@ -0,0 +1,381 @@
+[
+    {
+        "description": "WS/p8.module/a2.module#5",
+        "date": "2013-04-13T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.5.5",
+        "parent-uuid": "CARD-1.1.5.0",
+        "contained-holder": [
+            "SUBRACK-1.55.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "310330015",
+        "part-type-id": "3EM23141AD01",
+        "model-identifier": "CRPQABVFAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "WS/DS1",
+        "date": "2007-08-27T00:00:00.0Z",
+        "version": "p1.module",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.7.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "CIT",
+        "serial": "serial-number-s3s",
+        "part-type-id": "part-number-s3s",
+        "model-identifier": "model-id-s3s",
+        "type-name": "p1.module_A"
+    },
+    {
+        "description": "MWR#55Ch#1/a2.moduletraff",
+        "date": "2013-04-13T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.55.1.2",
+        "parent-uuid": "IDU-1.55.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "310330015",
+        "part-type-id": "3EM23141AD01",
+        "model-identifier": "CRPQABVFAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "MWR#65Ch#1/a2.moduletraff",
+        "date": "2013-04-13T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.65.1.2",
+        "parent-uuid": "IDU-1.65.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "310330008",
+        "part-type-id": "3EM23141AD01",
+        "model-identifier": "CRPQABVFAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "WS-8",
+        "date": "2017-09-09T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "SHELF-1.1.0.0",
+        "parent-uuid": "network-element",
+        "contained-holder": [
+            "SLOT-1.1.1.0",
+            "SLOT-1.1.2.0",
+            "SLOT-1.1.3.0",
+            "SLOT-1.1.4.0",
+            "SLOT-1.1.5.0",
+            "SLOT-1.1.6.0",
+            "SLOT-1.1.7.0",
+            "SLOT-1.1.8.0",
+            "SLOT-1.1.9.0"
+        ],
+        "tree-level": 0,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "Serial1",
+        "part-type-id": "Partnumber",
+        "model-identifier": "model-id",
+        "type-name": "WS-8"
+    },
+    {
+        "description": "WS/CORE-MAIN/a2.module#5",
+        "date": "2005-11-09T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.1.5",
+        "parent-uuid": "CARD-1.1.1.0",
+        "contained-holder": [
+            "SUBRACK-1.15.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "0003548168",
+        "part-type-id": "3FE25774AA01",
+        "model-identifier": "VAUIAEYAAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "WS/CORE-MAIN/a2.module#8",
+        "date": "2010-02-05T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.1.8",
+        "parent-uuid": "CARD-1.1.1.0",
+        "contained-holder": [
+            "SUBRACK-1.18.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "01T441601301",
+        "part-type-id": "1AB376720002",
+        "model-identifier": "NGI7AMLMAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "WS/p8.module/a2.module#5",
+        "date": "2013-04-13T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.6.5",
+        "parent-uuid": "CARD-1.1.6.0",
+        "contained-holder": [
+            "SUBRACK-1.65.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "310330008",
+        "part-type-id": "3EM23141AD01",
+        "model-identifier": "CRPQABVFAA",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "MWR-hyper Dir#5.6-Ch#1",
+        "date": "",
+        "version": "extrem-hyper",
+        "node-id": "sim1",
+        "uuid": "ODU-1.56.0.0",
+        "parent-uuid": "network-element",
+        "contained-holder": [
+            "PORT-1.56.1.2",
+            "PORT-1.56.1.3",
+            "PORT-1.56.1.4"
+        ],
+        "tree-level": 0,
+        "manufacturer-identifier": "",
+        "serial": "",
+        "part-type-id": "",
+        "model-identifier": "",
+        "type-name": "MWR-hyper"
+    },
+    {
+        "description": "MWR#56Ch#1/a2.moduletraff",
+        "date": "2017-09-09T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.56.1.2",
+        "parent-uuid": "ODU-1.56.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "Serial1",
+        "part-type-id": "Partnumber",
+        "model-identifier": "model-id",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "MWR-ng Dir#6.5-Ch#1",
+        "date": "2014-01-16T00:00:00.0Z",
+        "version": "MWR-ng",
+        "node-id": "sim1",
+        "uuid": "IDU-1.65.0.0",
+        "parent-uuid": "network-element",
+        "contained-holder": [
+            "PORT-1.65.1.4",
+            "PORT-1.65.1.2"
+        ],
+        "tree-level": 0,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "WAUZZI",
+        "part-type-id": "3DB76047BAAA02",
+        "model-identifier": "model-id-s3s",
+        "type-name": "MWR-ng"
+    },
+    {
+        "description": "MWR#55Ch#0/RxDiv",
+        "date": "2014-01-08T00:00:00.0Z",
+        "version": "2017",
+        "node-id": "sim1",
+        "uuid": "CARD-1.65.1.4",
+        "parent-uuid": "IDU-1.65.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "Serie2017-13",
+        "part-type-id": "partNo2017-12",
+        "model-identifier": "model-id-s3s",
+        "type-name": "RxDiv"
+    },
+    {
+        "description": "WS/p8.module",
+        "date": "2013-11-23T00:00:00.0Z",
+        "version": "234",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.6.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [
+            "PORT-1.1.6.5",
+            "PORT-1.1.6.7",
+            "PORT-1.1.6.6",
+            "PORT-1.1.6.8"
+        ],
+        "tree-level": 1,
+        "manufacturer-identifier": "SAN",
+        "serial": "serial-number-124",
+        "part-type-id": "part-number-12",
+        "model-identifier": "model-id-12",
+        "type-name": "p8.module"
+    },
+    {
+        "description": "WS/DS3",
+        "date": "2008-10-21T00:00:00.0Z",
+        "version": "unknown",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.8.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "sd-dsa-eqw",
+        "part-type-id": "unknown",
+        "model-identifier": "model-id-s3s",
+        "type-name": "p4.module"
+    },
+    {
+        "description": "WS/wind",
+        "date": "2007-02-19T00:00:00.0Z",
+        "version": "wind",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.9.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "CIT",
+        "serial": "proto-type",
+        "part-type-id": "party-yea",
+        "model-identifier": "model-id-s3s",
+        "type-name": "wind"
+    },
+    {
+        "description": "MWR#55Ch#1/RxDiv",
+        "date": "2014-01-07T00:00:00.0Z",
+        "version": "2017",
+        "node-id": "sim1",
+        "uuid": "CARD-1.55.1.4",
+        "parent-uuid": "IDU-1.55.0.0",
+        "contained-holder": [],
+        "tree-level": 1,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "Serie2017-12",
+        "part-type-id": "partNo2017-12",
+        "model-identifier": "model-id-s3s",
+        "type-name": "RxDiv"
+    },
+    {
+        "description": "WS/CORE-MAIN/a2.module#7",
+        "date": "2009-01-19T00:00:00.0Z",
+        "version": "a2.module-newest",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.1.7",
+        "parent-uuid": "CARD-1.1.1.0",
+        "contained-holder": [
+            "SUBRACK-1.17.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "91T403003322",
+        "part-type-id": "1AB187280031",
+        "model-identifier": "mod2",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "MWR-ng Dir#5.5-Ch#1",
+        "date": "2014-01-15T00:00:00.0Z",
+        "version": "MWR-ng",
+        "node-id": "sim1",
+        "uuid": "IDU-1.55.0.0",
+        "parent-uuid": "network-element",
+        "contained-holder": [
+            "PORT-1.55.1.2",
+            "PORT-1.55.1.4"
+        ],
+        "tree-level": 0,
+        "manufacturer-identifier": "ONF-Wireless-Transport",
+        "serial": "Serie2017-14",
+        "part-type-id": "3DB76047BAAA02",
+        "model-identifier": "model-id-s3s",
+        "type-name": "MWR-ng"
+    },
+    {
+        "description": "WS/CORE-MAIN",
+        "date": "2015-08-17T00:00:00.0Z",
+        "version": "123",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.1.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [
+            "PORT-1.1.1.6",
+            "PORT-1.1.1.5",
+            "PORT-1.1.1.8",
+            "PORT-1.1.1.7"
+        ],
+        "tree-level": 1,
+        "manufacturer-identifier": "SAN",
+        "serial": "asdf-asdasd-asd",
+        "part-type-id": "part-number-2",
+        "model-identifier": "model-id-2",
+        "type-name": "latest"
+    },
+    {
+        "description": "WS/p8.module",
+        "date": "2013-10-21T00:00:00.0Z",
+        "version": "234",
+        "node-id": "sim1",
+        "uuid": "CARD-1.1.5.0",
+        "parent-uuid": "SHELF-1.1.0.0",
+        "contained-holder": [
+            "PORT-1.1.5.6",
+            "PORT-1.1.5.5",
+            "PORT-1.1.5.8",
+            "PORT-1.1.5.7"
+        ],
+        "tree-level": 1,
+        "manufacturer-identifier": "SAN",
+        "serial": "africa",
+        "part-type-id": "part-number-12",
+        "model-identifier": "model-id-12",
+        "type-name": "p8.module"
+    },
+    {
+        "description": "WS/p8.module/a2.module#6",
+        "date": "",
+        "version": "",
+        "node-id": "sim1",
+        "uuid": "a2.module-1.1.5.6",
+        "parent-uuid": "CARD-1.1.5.0",
+        "contained-holder": [
+            "SUBRACK-1.56.0.0"
+        ],
+        "tree-level": 2,
+        "manufacturer-identifier": "",
+        "serial": "",
+        "part-type-id": "",
+        "model-identifier": "",
+        "type-name": "a2.module"
+    },
+    {
+        "description": "WS/p8.module/a2.module#6",
+        "date": "",
+        "version": "",
+        "node-id": "sim2",
+        "uuid": "a2.module-1.1.5.6",
+        "parent-uuid": "network-element",
+        "contained-holder": [
+            "SUBRACK-1.56.0.0"
+        ],
+        "tree-level": 0,
+        "manufacturer-identifier": "",
+        "serial": "",
+        "part-type-id": "",
+        "model-identifier": "",
+        "type-name": "a2.module"
+    }
+]
\ No newline at end of file
diff --git a/sdnr/wt/data-provider/dblib/src/test/resources/pmdata15m.json b/sdnr/wt/data-provider/dblib/src/test/resources/pmdata15m.json
new file mode 100644 (file)
index 0000000..88dd87f
--- /dev/null
@@ -0,0 +1,532 @@
+[
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_03",
+        "time-stamp": "2017-07-04T15:30:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_01",
+        "time-stamp": "2017-07-04T16:00:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_6",
+        "time-stamp": "2017-07-04T14:45:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_4",
+        "time-stamp": "2017-07-04T15:15:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_12",
+        "time-stamp": "2017-07-04T13:15:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-01",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_15",
+        "time-stamp": "2017-07-04T12:30:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-03",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_16",
+        "time-stamp": "2017-07-04T12:15:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-02",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_02",
+        "time-stamp": "2017-07-04T15:45:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-02",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_11",
+        "time-stamp": "2017-07-04T13:30:00.0+00:00",
+        "node-name": "sim12600"
+    },
+    {
+        "uuid-interface": "LP-MWPS-TTP-02",
+        "performance-data": {
+            "time-period": 900,
+            "es": 0,
+            "ses": 0,
+            "cses": 0,
+            "unavailability": 0,
+            "tx-level-min": 25,
+            "tx-level-max": 25,
+            "tx-level-avg": 25,
+            "rx-level-min": -41,
+            "rx-level-max": -41,
+            "rx-level-avg": -41,
+            "time2-states": -1,
+            "time4-states-s": 0,
+            "time4-states": 0,
+            "time8-states": 0,
+            "time16-states-s": -1,
+            "time16-states": 0,
+            "time32-states": 0,
+            "time64-states": 0,
+            "time128-states": 0,
+            "time256-states": 900,
+            "time512-states": -1,
+            "time512-states-l": -1,
+            "time1024-states": -1,
+            "time1024-states-l": -1,
+            "time2048-states": -1,
+            "time2048-states-l": -1,
+            "time4096-states": -1,
+            "time4096-states-l": -1,
+            "time8192-states": -1,
+            "time8192-states-l": -1,
+            "snir-min": -99,
+            "snir-max": -99,
+            "snir-avg": -99,
+            "xpd-min": -99,
+            "xpd-max": -99,
+            "xpd-avg": -99,
+            "rf-temp-min": -99,
+            "rf-temp-max": -99,
+            "rf-temp-avg": -99,
+            "defect-blocks-sum": -1
+        },
+        "layer-protocol-name": "MWPS",
+        "radio-signal-id": "Test11",
+        "suspect-interval-flag": false,
+        "granularity-period": "Period15Min",
+        "scanner-id": "PM_RADIO_15M_13",
+        "time-stamp": "2017-07-04T13:00:00.0+00:00",
+        "node-name": "sim12600"
+    }
+]
\ No newline at end of file
index 16d55c9..2ac5666 100644 (file)
     <name>ccsdk-features :: ${project.artifactId}</name>
 
     <dependencies>
+        <dependency>
+            <groupId>com.highstreet-technologies.opendaylight</groupId>
+            <artifactId>odl-ready</artifactId>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-data-provider-provider</artifactId>
index 4eda82c..1e5a191 100755 (executable)
             <artifactId>${application.name}-setup</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.highstreet-technologies.opendaylight</groupId>
+            <artifactId>odl-ready</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
index 2af7324..15c857c 100644 (file)
@@ -23,7 +23,7 @@ public interface ArchiveCleanProvider {
 
     /**
      * Remove all index data older, than specified from faultlog and eventlog
-     * 
+     *
      * @param olderAreOutdated time to specify older elements
      * @return number of removed elements
      */
@@ -31,11 +31,11 @@ public interface ArchiveCleanProvider {
 
     /**
      * Get number of elements older then
-     * 
+     *
      * @param olderAreOutdated date to compare with and specify older elements
      * @return number of elements
      */
-    public int getNumberOfOldObjects(Date olderAreOutdated);
+    public long getNumberOfOldObjects(Date olderAreOutdated);
 
 
 }
index 0de5dc2..128138e 100644 (file)
@@ -17,7 +17,6 @@
  */
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.model;
 
-import java.util.Date;
 import java.util.List;
 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.ConnectionlogEntity;
@@ -79,6 +78,13 @@ public interface DataProvider extends ArchiveCleanProvider {
     */
     void writeGuiCutThroughData(Guicutthrough gcData, String nodeId);
 
+    /**
+     *
+     * @param nodeName
+     * @return number of entries
+     */
+    public int clearGuiCutThroughEntriesOfNode(String nodeName);
+
     /**
      *
      * @param networkElementConnectionEntitiy to wirte to DB
@@ -99,12 +105,6 @@ public interface DataProvider extends ArchiveCleanProvider {
 
     void removeNetworkConnection(String nodeId);
 
-    @Override
-    int doIndexClean(Date olderAreOutdated);
-
-    @Override
-    int getNumberOfOldObjects(Date olderAreOutdated);
-
     List<NetworkElementConnectionEntity> getNetworkElementConnections();
 
     /**
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtDatabaseMediatorserver.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtDatabaseMediatorserver.java
new file mode 100644 (file)
index 0000000..2fc62da
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * ============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.model;
+
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity;
+
+public interface HtDatabaseMediatorserver {
+
+    List<MediatorServerEntity> getAll();
+}
index 2a91d78..04239f4 100644 (file)
@@ -29,9 +29,6 @@ public interface IEntityDataProvider {
 
     public HtUserdataManager getHtDatabaseUserManager();
 
-    /** Set overall ready status from outside of this data-provider **/
-    public void setReadyStatus(boolean status);
-
     /** Set some static status information after startup */
     public void setStatus(StatusKey key, String value);
 
index 0f8f5e3..18e07f1 100644 (file)
@@ -33,6 +33,8 @@ public interface IEsConfig {
      */
     long getArchiveLifetimeSeconds();
 
+    boolean doFullsizeRequests();
+
     /**
      * @param archiveCleanService
      */
@@ -44,5 +46,4 @@ public interface IEsConfig {
     void registerConfigChangedListener(IConfigChangedListener archiveCleanService);
 
 
-
 }
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/SdnrDbType.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/SdnrDbType.java
new file mode 100644 (file)
index 0000000..80efe6f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * ============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.model;
+
+public enum SdnrDbType {
+    ELASTICSEARCH, MARIADB
+}
index 84c43d5..31c7fd8 100644 (file)
@@ -1313,6 +1313,50 @@ module data-provider {
       description
         "An object containing the number of current faults per its severity.";
     }
+    container network-element-connections {
+      leaf total {
+        type uint32;
+        description
+          "The number of all network-elements.";
+      }
+      leaf Mounted {
+        type uint32;
+        description
+          "The number of network-elements with state 'Mounted'.";
+      }
+      leaf Unmounted {
+        type uint32;
+        description
+          "The number of network-elements with state 'Unmounted'.";
+      }
+      leaf Connecting {
+        type uint32;
+        description
+          "The number of network-elements with state 'Connecting'.";
+      }
+      leaf Connected {
+        type uint32;
+        description
+          "The number of network-elements with state 'Connected'.";
+      }
+      leaf UnableToConnect {
+        type uint32;
+        description
+          "The number of network-elements with state 'UnableToConnect'.";
+      }
+      leaf Disconnected {
+        type uint32;
+        description
+          "The number of network-elements with state 'Disconnected'.";
+      }
+      leaf Undefined {
+        type uint32;
+        description
+          "The number of network-elements with state 'Undefined'.";
+      }
+      description
+        "An object containing the number of network-elements per its connection-state.";
+    }
     description
       "An object class defining an status entity for current faults
        (also called active alarms).";
index 71c7451..786cec7 100755 (executable)
@@ -43,6 +43,7 @@
     <modules>
         <module>setup</module>
         <module>model</module>
+        <module>dblib</module>
         <module>provider</module>
         <module>feature</module>
         <module>installer</module>
index 55a7705..f0da429 100644 (file)
             <artifactId>sdnr-wt-data-provider-model</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-data-provider-dblib</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <artifactId>org.apache.karaf.shell.core</artifactId>
             <scope>provided</scope>
         </dependency>
-<!--          <dependency> -->
-<!--             <groupId>org.apache.karaf.bundle</groupId> -->
-<!--             <artifactId>org.apache.karaf.bundle.core</artifactId> -->
-<!--             <scope>provided</scope> -->
-<!--         </dependency> -->
         <dependency>
             <groupId>org.opendaylight.netconf</groupId>
             <artifactId>sal-netconf-connector</artifactId>
             <artifactId>json</artifactId>
             <scope>provided</scope>
         </dependency>
+        <!--  MariaDB beginn -->
+        <dependency>
+            <groupId>ch.vorburger.mariaDB4j</groupId>
+            <artifactId>mariaDB4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!--  MariaDB end -->
     </dependencies>
 
     <build>
                     </execution>
                 </executions>
             </plugin>
+<!--             <plugin> -->
+<!--                 <groupId>org.apache.felix</groupId> -->
+<!--                 <artifactId>maven-bundle-plugin</artifactId> -->
+<!--                 <extensions>true</extensions> -->
+<!--                 <configuration> -->
+<!--                     <instructions> -->
+<!--                         <Export-Package>org.onap.ccsdk.features.sdnr.wt.dataprovider.*</Export-Package> -->
+<!--                         <Import-Package>*</Import-Package> -->
+<!--                         <Embed-Dependency>dblib-provider;scope=provided|;inline=false,utils-provider;scope=provided|;inline=false</Embed-Dependency> -->
+<!--                     </instructions> -->
+<!--                 </configuration> -->
+<!--             </plugin> -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
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 (file)
index efb5221..0000000
+++ /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<Data> {
-
-    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<Data> 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<Data>(1L, 1L, new SearchResult<Data>(data, toalsize));
-
-    }
-
-
-    private static SearchRequest getNewInstanceOfSearchRequest(Entity entity) {
-        return new SearchRequest(entity.getName(), entity.getName());
-    }
-
-
-}
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -49,6 +49,7 @@ public class EsConfig implements Configuration, IEsConfig {
     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}";
@@ -61,6 +62,7 @@ public class EsConfig implements Configuration, IEsConfig {
     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;
 
@@ -161,6 +163,8 @@ public class EsConfig implements Configuration, IEsConfig {
                 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);
 
     }
 
@@ -212,4 +216,9 @@ public class EsConfig implements Configuration, IEsConfig {
                 + getSectionName() + "]";
     }
 
+    @Override
+    public boolean doFullsizeRequests() {
+        return configuration.getPropertyBoolean(SECTION_MARKER_ES, PROPERTY_KEY_FULLSIZE);
+    }
+
 }
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.database;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import java.io.IOException;
@@ -78,6 +78,8 @@ public class EsDataObjectReaderWriter2<T extends DataObject> {
     /** 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.
      *
@@ -103,8 +105,12 @@ public class EsDataObjectReaderWriter2<T extends DataObject> {
         this.yangtoolsMapper = new YangToolsMapper2<>(clazz, builderClazz);
         this.clazz = clazz;
         this.syncAfterWrite = syncAfterWrite;
+        this.doFullsizeRequest = false;
     }
 
+    public void setFullsizeRequest(boolean fullsizeRequest) {
+        this.doFullsizeRequest = fullsizeRequest;
+    }
     public <X extends T, @NonNull B extends Builder<X>> EsDataObjectReaderWriter2(DatabaseClient db,
             Entity dataTypeName, @Nonnull Class<T> clazz, @Nullable Class<B> builderClazz)
             throws ClassNotFoundException {
@@ -350,8 +356,10 @@ public class EsDataObjectReaderWriter2<T extends DataObject> {
 
     public SearchResult<T> doReadAll(QueryBuilder query, boolean ignoreException) {
 
+        if(this.doFullsizeRequest) {
+            query.doFullsizeRequest();
+        }
         SearchResult<T> res = new SearchResult<T>();
-
         SearchResult<SearchHit> result;
         List<SearchHit> hits;
         if (query != null) {
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor;
+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.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.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;
@@ -37,8 +37,10 @@ public class DataObjectAcessor<T extends DataObject> extends EsDataObjectReaderW
 
     private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessor.class);
 
-    DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class<T> clazz) throws ClassNotFoundException {
+    DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class<T> clazz, boolean doFullsizeRequest)
+            throws ClassNotFoundException {
         super(dbClient, entity, clazz);
+        this.setFullsizeRequest(doFullsizeRequest);
         LOG.info("Create {}", this.getClass().getName());
     }
 
@@ -50,11 +52,9 @@ public class DataObjectAcessor<T extends DataObject> extends EsDataObjectReaderW
         // 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);
+        LOG.debug("Request: {} filter {} ignoreException{}:", this.getDataTypeName(), queryByFilter, ignoreException);
 
         SearchResult<T> result = doReadAll(queryBuilder, ignoreException);
         return new QueryResult<>(queryByFilter, result);
     }
-
-
 }
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor;
+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.data.rpctypehelper.QueryByFilter;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult;
+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;
@@ -70,9 +69,9 @@ public class DataObjectAcessorPm<T extends DataObject> extends DataObjectAcessor
     private ExtRestClient dbClient;
     private Intervall mode;
 
-    public DataObjectAcessorPm(HtDatabaseClient dbClient, Intervall mode, Entity entity, Class<T> clazz)
-            throws ClassNotFoundException {
-        super(dbClient, entity, clazz);
+    public DataObjectAcessorPm(HtDatabaseClient dbClient, Intervall mode, Entity entity, Class<T> clazz,
+            boolean doFullsizeRequest) throws ClassNotFoundException {
+        super(dbClient, entity, clazz, doFullsizeRequest);
         LOG.info("DataObjectAcessorPm");
         this.dbClient = dbClient;
         this.mode = mode;
@@ -88,8 +87,8 @@ public class DataObjectAcessorPm<T extends DataObject> extends DataObjectAcessor
     public QueryResult<String> getDataLtpList(EntityInput input) throws IOException {
 
         QueryByFilter queryByFilter = new QueryByFilter(input);
-        SearchRequest request =
-                queryByFilter.getSearchRequestByFilter(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType());
+        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);
@@ -114,7 +113,7 @@ public class DataObjectAcessorPm<T extends DataObject> extends DataObjectAcessor
 
         QueryByFilter queryByFilter = new QueryByFilter(input);
         SearchRequest request =
-                queryByFilter.getSearchRequestBySortOrder(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType());
+                queryByFilter.getSearchRequestBySortOrder(NODE_KEY, UUID_KEY, mode.getIndex(), mode.getType(), this.doFullsizeRequest);
         try {
             SearchResponse response = this.dbClient.search(request);
             AggregationEntries aggs = response.getAggregations(KEY);
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 (file)
index 0000000..5811550
--- /dev/null
@@ -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<Data> {
+
+    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<Data> 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<Data>(1L, 1L, new SearchResult<Data>(new Data[] {builder.build()}, toalsize));
+
+    }
+
+
+    private static SearchRequest getNewInstanceOfSearchRequest(Entity entity) {
+        return new SearchRequest(entity.getName(), entity.getName());
+    }
+
+
+}
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor;
+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;
@@ -31,11 +31,10 @@ public class DataObjectAcessorWithId<T extends DataObject> extends DataObjectAce
 
     private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorWithId.class);
 
-    public DataObjectAcessorWithId(HtDatabaseClient dbClient, Entity entity, Class<T> clazz)
+    public DataObjectAcessorWithId(HtDatabaseClient dbClient, Entity entity, Class<T> clazz, boolean doFullsizeRequest)
             throws ClassNotFoundException {
-        super(dbClient, entity, clazz);
+        super(dbClient, entity, clazz, doFullsizeRequest);
         setEsIdAttributeName("_id");
         LOG.info("Create {}", this.getClass().getName());
     }
-
 }
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -36,8 +36,8 @@ 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.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;
@@ -92,11 +92,10 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
     private final EsDataObjectReaderWriter2<PmdataEntity> pmData24hDB;
 
     @SuppressWarnings("unused")
-    private final ElasticSearchDataProvider dataProvider;
+    private final DatabaseDataProvider dataProvider;
     // --- Construct and initialize
 
-
-    public HtDatabaseEventsService(HtDatabaseClient client, ElasticSearchDataProvider elasticSearchDataProvider)
+    public HtDatabaseEventsService(HtDatabaseClient client, DatabaseDataProvider elasticSearchDataProvider)
             throws Exception {
 
         LOG.info("Create {} start", HtDatabaseEventsService.class);
@@ -166,7 +165,6 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
         eventRWEventLogDevicemanager.write(event, null);
     }
 
-
     // -- Fault log
 
     @Override
@@ -308,7 +306,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
                 .setTreeLevel(Uint32.valueOf(0));;
         for (Inventory item : list) {
             repairedItem = new InventoryBuilder(item);
-            //check missing tree-level
+            // 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);
@@ -322,7 +320,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
             } else {
                 treeLevel = item.getTreeLevel().longValue();
                 if (treeLevel > 0) {
-                    //check non root elem and missing parent
+                    // 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()));
@@ -330,7 +328,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
                         repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID);
                         repairList.put(unboundItem.getUuid(), unboundItem.build());
                     }
-                    //check that parent exists in list and is tree-level -1
+                    // check that parent exists in list and is tree-level -1
                     else {
                         Optional<Inventory> parent =
                                 list.stream().filter(e -> item.getParentUuid().equals(e.getUuid())).findFirst();
@@ -342,7 +340,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
                         }
                     }
                 }
-                //check for duplicated uui
+                // check for duplicated uui
                 Optional<Inventory> duplicate = list
                         .stream().filter(e -> !item.equals(e) && item.getUuid() != null
                                 && item.getUuid().equals(e.getUuid()) && repairList.containsKey(e.getUuid()))
@@ -361,7 +359,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
             }
         }
 
-        if (!failures.isEmpty()) {
+        if (failures.size() > 0) {
             throw new DataInconsistencyException(new ArrayList<>(repairList.values()),
                     "inventory list is not consistent;\n" + String.join("\n", failures));
         }
@@ -369,7 +367,6 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
 
     // -- Networkelement
 
-
     /**
      * join base with parameters of toJoin (only non null values)
      *
@@ -425,8 +422,10 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
     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);
+        // NetworkElementConnectionEntity e =
+        // this.networkelementConnectionDB.read(nodeId);
+        // this.networkelementConnectionDB.write(this.joinNe(e,
+        // networkElementConnectionEntitiy), nodeId);
     }
 
     /**
@@ -441,17 +440,21 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
         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);
+        // 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());
-    //    }
+    // 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) {
@@ -489,7 +492,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
     }
 
     @Override
-    public int getNumberOfOldObjects(Date olderAreOutdated) {
+    public long getNumberOfOldObjects(Date olderAreOutdated) {
 
         String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
         int numberOfElements = 0;
@@ -535,7 +538,6 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
 
     // ### sub classes
 
-
     private static class EsEventBase {
         /**
          * Query to get older Elements
@@ -547,6 +549,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
             return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
         }
     }
+
     private static class EsFaultLogDevicemanager {
         /**
          * Get older Elements
@@ -558,6 +561,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
             return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
         }
     }
+
     public static class EsFaultCurrent {
         /**
          * @param nodeName name of the node
@@ -585,7 +589,7 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
 
         list.forEach(elem -> {
             GranularityPeriodType granularityPeriod = nnGetGranularityPeriodType(elem.getGranularityPeriod());
-            //_id": "Sim12600/LP-MWPS-TTP-01/2017-07-04T15:15:00.0+00:00"
+            // _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());
@@ -625,4 +629,10 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
         guiCutThroughDB.write(gcData, nodeId);
     }
 
+    @Override
+    public int clearGuiCutThroughEntriesOfNode(String nodeName) {
+        guiCutThroughDB.remove(nodeName);
+        return 0;
+    }
+
 }
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -27,7 +27,7 @@ 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.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;
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,7 +34,7 @@ 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.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;
@@ -115,12 +115,13 @@ public class QueryByFilter {
         return queryBuilder;
     }
 
-    public SearchRequest getSearchRequestByFilter(String nodeKey, String uuidKey, String index, String dataType) {
+    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()).aggregations(uuidKey).size(0));
+            request.setQuery(QueryBuilders.matchQuery(nodeKey, nodeFilter.getFiltervalue())
+                    .setFullsizeRequest(doFullsizeRequest).aggregations(uuidKey).size(0));
             return request;
         } else {
             String msg = "no nodename in filter found ";
@@ -129,14 +130,16 @@ public class QueryByFilter {
         }
     }
 
-    public SearchRequest getSearchRequestBySortOrder(String nodeKey, String uuidKey, String index, String dataType) {
+    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().aggregations(nodeKey, convert(soNode.getSortorder())).size(0);
+            query = QueryBuilders.matchAllQuery().setFullsizeRequest(doFullsizeRequest)
+                    .aggregations(nodeKey, convert(soNode.getSortorder())).size(0);
         } else {
-            query = QueryBuilders.matchAllQuery().aggregations(nodeKey).size(0);
+            query = QueryBuilders.matchAllQuery().setFullsizeRequest(doFullsizeRequest).aggregations(nodeKey).size(0);
         }
         request.setQuery(query);
         return request;
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper;
 
 import java.util.Arrays;
 import java.util.Calendar;
@@ -32,7 +32,7 @@ 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.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;
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP : ccsdk features
  * ================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
+ * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
  * All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
+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.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.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;
@@ -52,7 +57,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
 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;
@@ -77,7 +81,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ElasticSearchDataProvider {
+public class ElasticSearchDataProvider implements DatabaseDataProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchDataProvider.class);
 
@@ -102,59 +106,85 @@ public class ElasticSearchDataProvider {
     private final HtDatabaseEventsService databaseService;
     private final HtDatabaseMaintenanceService databaseMaintenanceService;
 
+    private final HtDatabaseMediatorserver dbMediatorServerService = new HtDatabaseMediatorserver() {
+
+        @Override
+        public List<MediatorServerEntity> 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);
+        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)
-            throws Exception {
+    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);
+                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);
+                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);
+        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);
+                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);
+                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);
+                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);
+                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);
+                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);
+                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);
+                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);
+                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);
+        this.readStatus = new DataObjectAcessorStatus(dbClient, Entity.Faultcurrent, doFullsizeRequests);
 
         this.databaseService = new HtDatabaseEventsService(dbClient, this);
         this.databaseMaintenanceService = new HtDatabaseMaintenanceService(dbClient);
@@ -164,6 +194,8 @@ public class ElasticSearchDataProvider {
      * Provide access to model API
      */
 
+
+    @Override
     public ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input) {
 
         ReadFaultcurrentListOutputBuilder outputBuilder = new ReadFaultcurrentListOutputBuilder();
@@ -177,6 +209,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadFaultlogListOutputBuilder readFaultLogList(EntityInput input) {
         ReadFaultlogListOutputBuilder outputBuilder = new ReadFaultlogListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.faultlog.list.output.Data> result =
@@ -188,6 +221,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadMaintenanceListOutputBuilder readMaintenanceList(EntityInput input) {
         ReadMaintenanceListOutputBuilder outputBuilder = new ReadMaintenanceListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data> result =
@@ -199,6 +233,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadMediatorServerListOutputBuilder readMediatorServerList(EntityInput input) {
 
         ReadMediatorServerListOutputBuilder outputBuilder = new ReadMediatorServerListOutputBuilder();
@@ -211,6 +246,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadNetworkElementConnectionListOutputBuilder readNetworkElementConnectionList(EntityInput input) {
         ReadNetworkElementConnectionListOutputBuilder outputBuilder =
                 new ReadNetworkElementConnectionListOutputBuilder();
@@ -223,6 +259,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadInventoryListOutputBuilder readInventoryList(EntityInput input) {
         ReadInventoryListOutputBuilder outputBuilder = new ReadInventoryListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.inventory.list.output.Data> result =
@@ -234,6 +271,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadConnectionlogListOutputBuilder readConnectionlogList(EntityInput input) {
         ReadConnectionlogListOutputBuilder outputBuilder = new ReadConnectionlogListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.connectionlog.list.output.Data> result =
@@ -245,7 +283,8 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
-    public ReadEventlogListOutputBuilder readEventlogList(ReadEventlogListInput input) throws IOException {
+    @Override
+    public ReadEventlogListOutputBuilder readEventlogList(EntityInput input) throws IOException {
         ReadEventlogListOutputBuilder outputBuilder = new ReadEventlogListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.eventlog.list.output.Data> result =
                 this.eventlogRW.getData(input);
@@ -256,6 +295,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata15mListOutputBuilder readPmdata15mList(EntityInput input) {
         ReadPmdata15mListOutputBuilder outputBuilder = new ReadPmdata15mListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data> result =
@@ -268,6 +308,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata24hListOutputBuilder readPmdata24hList(EntityInput input) {
         ReadPmdata24hListOutputBuilder outputBuilder = new ReadPmdata24hListOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._24h.list.output.Data> result =
@@ -279,6 +320,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata15mLtpListOutputBuilder readPmdata15mLtpList(EntityInput input) throws IOException {
         ReadPmdata15mLtpListOutputBuilder outputBuilder = new ReadPmdata15mLtpListOutputBuilder();
         QueryResult<String> result = pm15mRW.getDataLtpList(input);
@@ -289,6 +331,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException {
         ReadPmdata15mDeviceListOutputBuilder outputBuilder = new ReadPmdata15mDeviceListOutputBuilder();
         QueryResult<String> result = pm15mRW.getDataDeviceList(input);
@@ -299,6 +342,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException {
 
         QueryResult<String> result = pm24hRW.getDataLtpList(input);
@@ -312,6 +356,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input) throws IOException {
 
         QueryResult<String> result = pm24hRW.getDataDeviceList(input);
@@ -324,6 +369,7 @@ public class ElasticSearchDataProvider {
         return outputBuilder;
     }
 
+    @Override
     public ReadStatusOutputBuilder readStatus() throws IOException {
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data> result =
                 readStatus.getDataStatus();
@@ -333,10 +379,12 @@ public class ElasticSearchDataProvider {
         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());
@@ -350,6 +398,7 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public UpdateNetworkElementConnectionOutputBuilder updateNetworkElementConnection(
             UpdateNetworkElementConnectionInput input) throws IOException {
         String id = this.networkelementConnectionRW.update(input, input.getId());
@@ -363,6 +412,7 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public DeleteNetworkElementConnectionOutputBuilder deleteNetworkElementConnection(
             DeleteNetworkElementConnectionInput input) throws IOException {
         boolean removed = this.networkelementConnectionRW.remove(input.getId());
@@ -372,6 +422,7 @@ public class ElasticSearchDataProvider {
         return new DeleteNetworkElementConnectionOutputBuilder();
     }
 
+    @Override
     public DeleteMediatorServerOutputBuilder deleteMediatorServer(DeleteMediatorServerInput input) throws IOException {
         boolean removed = this.mediatorserverRW.remove(input.getId());
         if (!removed) {
@@ -380,6 +431,7 @@ public class ElasticSearchDataProvider {
         return new DeleteMediatorServerOutputBuilder();
     }
 
+    @Override
     public DeleteMaintenanceOutputBuilder deleteMaintenance(DeleteMaintenanceInput input) throws IOException {
         boolean removed = this.maintenanceRW.remove(input.getId());
         if (!removed) {
@@ -388,6 +440,7 @@ public class ElasticSearchDataProvider {
         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");
@@ -400,6 +453,7 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public UpdateMediatorServerOutputBuilder updateMediatorServer(UpdateMediatorServerInput input) throws IOException {
         if (input.getId() == null) {
             throw new IOException("please give the id for updating entry");
@@ -413,6 +467,7 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public CreateMaintenanceOutputBuilder createMaintenance(CreateMaintenanceInput input) throws IOException {
         String id = this.maintenanceRW.write(input, input.getNodeId());
         if (id == null) {
@@ -422,6 +477,7 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public CreateMediatorServerOutputBuilder createMediatorServer(CreateMediatorServerInput input) throws IOException {
         String id = this.mediatorserverRW.write(input, null);
 
@@ -433,23 +489,32 @@ public class ElasticSearchDataProvider {
         return builder;
     }
 
+    @Override
     public ReadGuiCutThroughEntryOutputBuilder readGuiCutThroughEntry(EntityInput input) {
         ReadGuiCutThroughEntryOutputBuilder outputBuilder = new ReadGuiCutThroughEntryOutputBuilder();
         QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.gui.cut.through.entry.output.Data> 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());
+                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 (file)
index 0000000..9dbdb13
--- /dev/null
@@ -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<SearchHit> 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;
+    }
+
+}
index 91d4697..05e6d2f 100644 (file)
@@ -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;
     }
 
index 725256b..103dec7 100644 (file)
@@ -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 (file)
index 2843650..0000000
+++ /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;
-    }
-
-}
index 90b5fd9..64b5fab 100644 (file)
@@ -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<Integer,String> BUNDLESTATE_LUT;
+    private final Map<Integer, String> BUNDLESTATE_LUT;
     private final Map<String, String> 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;
+        }
+    }
 }
index ac9cb44..1580a0f 100644 (file)
@@ -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();
+    }
 }
index 491775e..0e43cd2 100644 (file)
@@ -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)");
index 0d46ad0..c6758e2 100644 (file)
@@ -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<YangFilename> findYangFiles(String module) {
+        LOG.debug("try to find yang files for {}", module);
         List<YangFilename> 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 (file)
index 0000000..5e8dc92
--- /dev/null
@@ -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);
+    }
+
+
+}
index 190c789..e06a1a9 100644 (file)
@@ -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) {
index 9e7fc18..ad71284 100644 (file)
@@ -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> 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;
     }
 
+
+
 }
index b449062..cb62e33 100644 (file)
@@ -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<String> 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<SearchHit> 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<SearchHit> 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,
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
 
 import java.util.HashMap;
 import java.util.List;
@@ -27,12 +27,8 @@ 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.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;
 
@@ -40,26 +36,20 @@ public class MediatorServerDataProvider implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(MediatorServerDataProvider.class);
 
-    private final HtDatabaseClient dbClient;
-    private final DataObjectAcessorWithId<Data> mediatorserverRW;
+    private final HtDatabaseMediatorserver dbClient;
     private final int REFRESH_INTERVAL = 60;
-    private final Map<String, Data> entries;
+    private final Map<String, MediatorServerEntity> 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());
+    public MediatorServerDataProvider(HtDatabaseMediatorserver entryProvider) {
         this.entries = new HashMap<>();
-        this.dbClient = HtDatabaseClient.getClient(hosts, authUsername, authPassword, trustAll);
-        this.mediatorserverRW = new DataObjectAcessorWithId<>(dbClient, Entity.MediatorServer, Data.class);
+        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
@@ -72,9 +62,8 @@ public class MediatorServerDataProvider implements AutoCloseable {
     };
 
     private void runIt() {
-        SearchResult<Data> result = MediatorServerDataProvider.this.mediatorserverRW.doReadAll();
-        List<Data> data = result.getHits();
-        for (Data item : data) {
+        List<MediatorServerEntity> result = this.dbClient.getAll();
+        for (MediatorServerEntity item : result) {
             MediatorServerDataProvider.this.entries.put(item.getId(), item);
         }
     }
@@ -85,7 +74,7 @@ public class MediatorServerDataProvider implements AutoCloseable {
      * @return url or null if not exists
      */
     public String getHostUrl(String dbServerId) {
-        Data info = this.entries.getOrDefault(dbServerId, null);
+        MediatorServerEntity info = this.entries.getOrDefault(dbServerId, null);
         return info == null ? null : info.getUrl();
     }
 
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 (file)
index 0000000..f39a4c2
--- /dev/null
@@ -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
index 686af61..d5f8a99 100644 (file)
 
     <reference id="rpcProviderService"
                interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-    <reference id="bundleService"
-                interface="org.apache.karaf.bundle.core.BundleService" />
-
-    <bean id="readyServlet"
-          class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet">
-          <property name="bundleService" ref="bundleService"/>
-    </bean>
-    <service interface="javax.servlet.http.HttpServlet"
-             ref="readyServlet">
-        <service-properties>
-            <entry key="alias" value="/ready"/>
-        </service-properties>
-    </service>
-
+    <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
     <bean id="aboutServlet"
           class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet">
-<!--           <property name="bundleService" ref="bundleService"/> -->
     </bean>
     <service interface="javax.servlet.http.HttpServlet"
              ref="aboutServlet">
@@ -87,6 +74,7 @@
         <property name="treeServlet" ref="treeServlet"/>
         <property name="mediatorServerServlet" ref="msServlet"/>
         <property name="userdataServlet" ref="userdataServlet"/>
+        <property name="dataBroker" ref="dataBroker" />
     </bean>
 
     <bean id="yangServlet"
index 48e512a..eb4ec32 100644 (file)
@@ -85,7 +85,7 @@ public class TestAbout {
         when(response.getOutputStream()).thenReturn(printOut);
         servlet.doGet(request, response);
         verify(response).setStatus(200);
-        verify(response).setContentType("text/plain");
+        verify(response).setContentType("text/markdown");
         System.out.println(printOut.getStringWriter().getBuffer().toString());
         assertTrue(printOut.getStringWriter().getBuffer().length() > 0);
     }
index 5a8c549..c407859 100644 (file)
@@ -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
index 9a96986..8c62ec9 100644 (file)
@@ -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;
 
index d064865..dd28575 100644 (file)
@@ -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 {
 
index b83034d..dc5e049 100644 (file)
@@ -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<NetworkElementConnectionEntity> 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();
     }
 
index 68d3676..8a4e3e2 100644 (file)
@@ -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<Filter> 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
 
index 16dfa0e..3c983e7 100644 (file)
@@ -81,7 +81,6 @@ public class TestImplementation {
         }
 
         impl.setStatus(StatusKey.CLUSTER_SIZE, "3");
-        impl.setReadyStatus(true);
         try {
             impl.close();
         } catch (Exception e) {
index ed8eac9..ce1bd78 100644 (file)
@@ -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
index b9516b3..e85ed8c 100644 (file)
@@ -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;
 
index 5b4bc3e..408f6a6 100644 (file)
@@ -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
index ad525b9..4a36262 100644 (file)
@@ -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;
index 28f7d49..29f3556 100644 (file)
@@ -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
index fd39784..3fcbdb8 100644 (file)
@@ -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 {
index 524659e..611533b 100644 (file)
@@ -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 (file)
index 0000000..276bcf4
--- /dev/null
@@ -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<String, String> envDefaultValues = initEnvDefaultValues();
+
+    public MariaDBTestBase() throws ManagedProcessException {
+        this(new Random().nextInt(1000) + 50000);
+    }
+
+    private static Map<String, String> initEnvDefaultValues() {
+        Map<String, String> 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 (file)
index 0000000..30a4e0a
--- /dev/null
@@ -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
index d5a64a3..97b739c 100644 (file)
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>ch.vorburger.mariaDB4j</groupId>
+            <artifactId>mariaDB4j</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <artifactId>sdnr-wt-common</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-yang-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-data-provider-model</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-data-provider-dblib</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc6991-ietf-yang-types</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
                     </execution>
                 </executions>
                 <configuration>
-                  <appendAssemblyId>false</appendAssemblyId>
+                    <appendAssemblyId>false</appendAssemblyId>
                     <archive>
                         <manifest>
                             <mainClass>org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.Program</mainClass>
index 7d2adc5..466a3e2 100644 (file)
  */
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-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.config.HostInfo;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntry;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.EsVersion;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntry;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateAliasRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteAliasRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AcknowledgedResponse;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetInfoResponse;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ListAliasesResponse;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ListIndicesResponse;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentData;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataContainer;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ReleaseGroup;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.database.ElasticsearchDataMigrationProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.database.MariaDbDataMigrationProvider;
 
 public class DataMigrationProviderImpl implements DataMigrationProviderService {
 
+    private final DataMigrationProviderService dbProvider;
 
-    private static final Logger LOG = LoggerFactory.getLogger(DataMigrationProviderImpl.class);
-
-    private final HtDatabaseClient dbClient;
-
-    public DataMigrationProviderImpl(HostInfo[] hosts, String username, String password, boolean trustAll,
+    public DataMigrationProviderImpl(SdnrDbType type, String url, String username, String password, boolean trustAll,
             long timeoutms) throws Exception {
-
-        dbClient = HtDatabaseClient.getClient(hosts, username, password, trustAll, timeoutms);
+        if (type == SdnrDbType.ELASTICSEARCH) {
+            dbProvider = new ElasticsearchDataMigrationProvider(url, username, password, trustAll, timeoutms);
+        } else {
+            dbProvider = new MariaDbDataMigrationProvider(url, username, password, trustAll, timeoutms);
+        }
     }
 
     @Override
     public DataMigrationReport importData(String filename, boolean dryrun) throws Exception {
-        return this.importData(filename, dryrun, Release.CURRENT_RELEASE);
+        return this.dbProvider.importData(filename, dryrun, Release.CURRENT_RELEASE);
     }
 
+    @Override
     public DataMigrationReport importData(String filename, boolean dryrun, Release forRelease) throws Exception {
-        DataMigrationReport report = new DataMigrationReport();
-        File file = new File(filename);
-        if (!file.exists()) {
-            if (dryrun) {
-                report.error("file %s not found", filename);
-                return report;
-            }
-            throw new FileNotFoundException(filename);
-        }
-        DataContainer container = null;
-        try {
-            container = DataContainer.load(file);
-        } catch (Exception e) {
-            if (dryrun) {
-                report.error("problem loading file %s: %s", filename, e.getMessage());
-                return report;
-            }
-            throw new Exception("problem loading file " + filename, e);
-        }
-        ReleaseInformation ri = ReleaseInformation.getInstance(forRelease);
-        SearchHitConverter converter;
-        Set<ComponentName> components = ri.getComponents();
-        //for all db components of dest architecture
-        for (ComponentName component : components) {
-            //convert to ComponentData for current release with existing ComponentData of the container
-            converter = SearchHitConverter.Factory.getInstance(container.getRelease(), forRelease, component);
-            if (converter == null) {
-                continue;
-            }
-            ComponentData data = converter.convert(container);
-            if (data != null) {
-                String indexName = ri.getAlias(component);
-                String dataTypeName = ri.getDataType(component);
-                if (dryrun) {
-                    report.log("write %d entries into %s/%s", data.size(), indexName, dataTypeName);
-                } else {
-                    LOG.debug("write {} entries into {}/{}", data.size(), indexName, dataTypeName);
-                }
-                for (SearchHit item : data) {
-                    if (!dryrun) {
-                        String id = this.dbClient.doWriteRaw(indexName, dataTypeName, item.getId(),
-                                item.getSourceAsString(), true);
-                        if (!item.getId().equals(id)) {
-                            LOG.warn("entry for {} with original id {} was written with another id {}",
-                                    component.getValue(), item.getId(), id);
-                        }
-                    }
-                }
-            } else {
-                if (dryrun) {
-                    report.error("unable to convert data for " + component.getValue() + " from version "
-                            + container.getRelease().getValue() + " to " + forRelease.getValue() + "\n");
-                } else {
-                    LOG.warn("unable to convert data for {} from version {} to {}", component.getValue(),
-                            container.getRelease().getValue(), forRelease.getValue());
-                }
-            }
-        }
-        LOG.info("import of {} completed", filename);
-        if (dryrun) {
-            report.log("import of %s completed", filename);
-        }
-        report.setCompleted(true);
-        return report;
+        return this.dbProvider.importData(filename, dryrun, forRelease);
     }
 
 
@@ -151,49 +57,7 @@ public class DataMigrationProviderImpl implements DataMigrationProviderService {
      */
     @Override
     public DataMigrationReport exportData(String filename) {
-        DataMigrationReport report = new DataMigrationReport();
-
-        DataContainer container = new DataContainer();
-
-        filename = this.checkFilenameForWrite(filename);
-        LOG.info("output will be written to {}", filename);
-        //autodetect version
-        Release dbRelease = this.autoDetectRelease();
-        if (dbRelease == null) {
-            report.error("unbable to detect db release. is database initialized?");
-            return report;
-        }
-        ReleaseInformation ri = ReleaseInformation.getInstance(dbRelease);
-        boolean componentsSucceeded = true;
-        for (ComponentName c : ri.getComponents()) {
-            ComponentData data = new ComponentData(c);
-            SearchResult<SearchHit> result = this.dbClient.doReadAllJsonData(ri.getAlias(c), ri.getDataType(c), false);
-            data.addAll(result.getHits());
-            container.addComponent(c, data);
-        }
-        try {
-            Files.write(new File(filename).toPath(), Arrays.asList(container.toJSON()), StandardCharsets.UTF_8);
-            report.setCompleted(componentsSucceeded);
-        } catch (IOException e) {
-            LOG.warn("problem writing data to {}: {}", filename, e);
-        }
-        return report;
-    }
-
-    private String checkFilenameForWrite(String filename) {
-        File f = new File(filename);
-        if (!f.exists()) {
-            return filename;
-        }
-        return this.checkFilenameForWrite(filename, 0);
-    }
-
-    private String checkFilenameForWrite(String filename, int apdx) {
-        File f = new File(String.format("$s.$d", filename, apdx));
-        if (!f.exists()) {
-            return filename;
-        }
-        return this.checkFilenameForWrite(filename, apdx + 1);
+        return this.dbProvider.exportData(filename);
     }
 
     @Override
@@ -202,226 +66,20 @@ public class DataMigrationProviderImpl implements DataMigrationProviderService {
     }
 
 
+    @Override
     public Release autoDetectRelease() {
-        EsVersion dbVersion = this.readActualVersion();
-        AliasesEntryList aliases = this.readAliases();
-        IndicesEntryList indices = this.readIndices();
-        if (indices == null) {
-            return null;
-        }
-        List<Release> foundReleases = new ArrayList<>();
-        //if there are active aliases reduce indices to the active ones
-        if (aliases != null && aliases.size() > 0) {
-            indices = indices.subList(aliases.getLinkedIndices());
-        }
-        for (Release r : Release.values()) {
-            if (r.isDbInRange(dbVersion)) {
-                ReleaseInformation ri = ReleaseInformation.getInstance(r);
-                if (ri != null && ri.containsIndices(indices)) {
-                    foundReleases.add(r);
-                }
-            }
-        }
-        if (foundReleases.size() == 1) {
-            return foundReleases.get(0);
-        }
-        LOG.error("detect {} releases: {}. unable to detect for which one to do sth.", foundReleases.size(),
-                foundReleases);
-        return null;
-    }
-
-    private EsVersion readActualVersion() {
-        try {
-            GetInfoResponse response = this.dbClient.getInfo();
-            return response.getVersion();
-        } catch (Exception e) {
-            LOG.warn(e.getMessage());
-        }
-        return null;
-    }
-
-    private AliasesEntryList readAliases() {
-        AliasesEntryList entries = null;
-        try {
-            ListAliasesResponse response = this.dbClient.getAliases();
-            entries = response.getEntries();
-        } catch (ParseException | IOException e) {
-            LOG.error(e.getMessage());
-        }
-        return entries;
-    }
-
-    private IndicesEntryList readIndices() {
-        IndicesEntryList entries = null;
-        try {
-            ListIndicesResponse response = this.dbClient.getIndices();
-            entries = response.getEntries();
-        } catch (ParseException | IOException e) {
-            LOG.error(e.getMessage());
-        }
-        return entries;
+        return this.dbProvider.autoDetectRelease();
     }
 
-
     @Override
     public boolean initDatabase(Release release, int numShards, int numReplicas, String dbPrefix, boolean forceRecreate,
             long timeoutms) {
-        if (timeoutms > 0) {
-            this.dbClient.waitForYellowStatus(timeoutms);
-        }
-        EsVersion dbVersion = this.readActualVersion();
-        if (dbVersion == null) {
-            return false;
-        }
-        LOG.info("detected database version {}", dbVersion);
-        if (release == null) {
-            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion);
-            if (release == null) {
-                LOG.warn("unable to autodetect release for this database version for release {}",
-                        ReleaseGroup.CURRENT_RELEASE.name());
-                return false;
-            }
-            LOG.info("autodetect release {}", release);
-        }
-        if (!release.isDbInRange(dbVersion)) {
-            LOG.warn("db version {} maybe not compatible with release {}", dbVersion, release);
-            return false;
-        }
-        if (forceRecreate) {
-            this.clearDatabase(release, dbPrefix, 0);
-        }
-        ReleaseInformation ri = ReleaseInformation.getInstance(release);
-        AliasesEntryList aliases = this.readAliases();
-        IndicesEntryList indices = this.readIndices();
-        if (aliases == null || indices == null) {
-            return false;
-        }
-        AcknowledgedResponse response = null;
-        if (!ri.runPreInitCommands(this.dbClient)) {
-            return false;
-        }
-        for (ComponentName component : ri.getComponents()) {
-            try {
-                if (ri.hasOwnDbIndex(component)) {
-                    //check if index already exists
-                    String indexName = ri.getIndex(component, dbPrefix);
-                    String aliasName = ri.getAlias(component, dbPrefix);
-                    if (indices.findByIndex(indexName) == null) {
-                        LOG.info("creating index for {}", component);
-                        CreateIndexRequest request = new CreateIndexRequest(ri.getIndex(component, dbPrefix));
-                        request.mappings(new JSONObject(ri.getDatabaseMapping(component)));
-                        request.settings(new JSONObject(ri.getDatabaseSettings(component, numShards, numReplicas)));
-                        response = this.dbClient.createIndex(request);
-                        LOG.info(response.isAcknowledged() ? "succeeded" : "failed");
-                    } else {
-                        LOG.info("index {} for {} already exists", indexName, component);
-                    }
-                    //check if alias already exists
-                    if (aliases.findByAlias(aliasName) == null) {
-                        LOG.info("creating alias for {}", component);
-                        response = this.dbClient.createAlias(new CreateAliasRequest(indexName, aliasName));
-                        LOG.info(response.isAcknowledged() ? "succeeded" : "failed");
-                    } else {
-                        LOG.info("alias {} for index {} for {} already exists", aliasName, indexName, component);
-                    }
-                }
-            } catch (IOException e) {
-                LOG.error(e.getMessage());
-                return false;
-            }
-        }
-        if (!ri.runPostInitCommands(this.dbClient)) {
-            return false;
-        }
-        return true;
+        return this.dbProvider.initDatabase(release, numShards, numReplicas, dbPrefix, forceRecreate, timeoutms);
     }
 
     @Override
     public boolean clearDatabase(Release release, String dbPrefix, long timeoutms) {
-
-        if (timeoutms > 0) {
-            this.dbClient.waitForYellowStatus(timeoutms);
-        }
-        //check aliases
-        AliasesEntryList entries = this.readAliases();
-        IndicesEntryList entries2 = this.readIndices();
-        if (entries == null) {
-            return false;
-        }
-        if (release == null) {
-            EsVersion dbVersion = this.readActualVersion();
-            if (dbVersion == null) {
-                return false;
-            }
-            LOG.info("detected database version {}", dbVersion);
-            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion);
-            if (release == null) {
-                LOG.warn("unable to autodetect release for this database version for release {}",
-                        ReleaseGroup.CURRENT_RELEASE.name());
-                return false;
-            }
-            LOG.info("autodetect release {}", release);
-        }
-        ReleaseInformation ri = ReleaseInformation.getInstance(release);
-        AcknowledgedResponse response;
-        if (entries.size() <= 0) {
-            LOG.info("no aliases to clear");
-        } else {
-            //check for every component of release if alias exists
-            for (ComponentName component : ri.getComponents()) {
-                String aliasToDelete = ri.getAlias(component, dbPrefix);
-                AliasesEntry entryToDelete = entries.findByAlias(aliasToDelete);
-                if (entryToDelete != null) {
-                    try {
-                        LOG.info("deleting alias {} for index {}", entryToDelete.getAlias(), entryToDelete.getIndex());
-                        response = this.dbClient.deleteAlias(
-                                new DeleteAliasRequest(entryToDelete.getIndex(), entryToDelete.getAlias()));
-                        LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
-                    } catch (IOException e) {
-                        LOG.error(e.getMessage());
-                        return false;
-                    }
-                }
-                else {
-                    //try to find malformed typed index with alias name
-                    IndicesEntry entry2ToDelete = entries2.findByIndex(aliasToDelete);
-                    if (entry2ToDelete != null) {
-                        try {
-                            LOG.info("deleting index {}", entry2ToDelete.getName());
-                            response = this.dbClient.deleteIndex(new DeleteIndexRequest(entry2ToDelete.getName()));
-                            LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
-                        } catch (IOException e) {
-                            LOG.error(e.getMessage());
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-        if (entries2 == null) {
-            return false;
-        }
-        if (entries2.size() <= 0) {
-            LOG.info("no indices to clear");
-        } else {
-            //check for every component of release if index exists
-            for (ComponentName component : ri.getComponents()) {
-                String indexToDelete = ri.getIndex(component, dbPrefix);
-                IndicesEntry entryToDelete = entries2.findByIndex(indexToDelete);
-                if (entryToDelete != null) {
-                    try {
-                        LOG.info("deleting index {}", entryToDelete.getName());
-                        response = this.dbClient.deleteIndex(new DeleteIndexRequest(entryToDelete.getName()));
-                        LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
-                    } catch (IOException e) {
-                        LOG.error(e.getMessage());
-                        return false;
-                    }
-                }
-            }
-        }
-
-        return true;
+        return this.dbProvider.clearDatabase(release, dbPrefix, timeoutms);
     }
 
     /**
@@ -429,34 +87,6 @@ public class DataMigrationProviderImpl implements DataMigrationProviderService {
      * @return
      */
     public boolean clearCompleteDatabase(long timeoutms) {
-        if (timeoutms > 0) {
-            this.dbClient.waitForYellowStatus(timeoutms);
-        }
-        //check aliases and indices
-        AliasesEntryList aliases = this.readAliases();
-        IndicesEntryList indices = this.readIndices();
-        if (aliases == null || indices == null) {
-            return false;
-        }
-        for (AliasesEntry alias : aliases) {
-            try {
-                LOG.info("deleting alias {} for index {}", alias.getAlias(), alias.getIndex());
-                this.dbClient.deleteAlias(new DeleteAliasRequest(alias.getIndex(), alias.getAlias()));
-            } catch (IOException e) {
-                LOG.error("problem deleting alias {}: {}", alias.getAlias(), e);
-                return false;
-            }
-        }
-        for (IndicesEntry index : indices) {
-            try {
-                LOG.info("deleting index {}", index.getName());
-                this.dbClient.deleteIndex(new DeleteIndexRequest(index.getName()));
-            } catch (IOException e) {
-                LOG.error("problem deleting index {}: {}", index.getName(), e);
-                return false;
-            }
-        }
-        return true;
+        return this.clearCompleteDatabase(timeoutms);
     }
-
 }
index 0f1fc6c..53ab326 100644 (file)
@@ -22,7 +22,6 @@
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup;
 
 import java.io.FileNotFoundException;
-
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 
@@ -31,7 +30,7 @@ public interface DataMigrationProviderService {
 
     /**
      * import data from file and write these to database
-     * 
+     *
      * @param filename source
      * @param dryrun only loading file and check consistency, not pushing into database
      * @return report
@@ -40,19 +39,22 @@ public interface DataMigrationProviderService {
      */
     DataMigrationReport importData(String filename, boolean dryrun) throws FileNotFoundException, Exception;
 
+    DataMigrationReport importData(String filename, boolean dryrun, Release forRelease) throws Exception;
     /**
      * export current data to file
-     * 
+     *
      * @param filename
      */
     DataMigrationReport exportData(String filename);
 
     /**
-     * 
+     *
      * @return
      */
     Release getCurrentVersion();
 
+    Release autoDetectRelease();
+
     /**
      * @param release
      * @param numShards
@@ -67,8 +69,9 @@ public interface DataMigrationProviderService {
 
     /**
      * clean up the database all data will be removed complete structure will be destroyed
-     * 
+     *
      * @return
      */
     boolean clearDatabase(Release release, String dbPrefix, long timeoutms);
+
 }
index 54204f1..56973f4 100644 (file)
@@ -37,7 +37,7 @@ import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.RollingFileAppender;
-import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.MavenDatabasePluginInitFile;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
@@ -77,7 +77,8 @@ public class Program {
     private static final int DEFAULT_SHARDS = 5;
     private static final int DEFAULT_REPLICAS = 1;
     private static final int DEFAULT_DATABASEWAIT_SECONDS = 30;
-    private static final String DEFAULT_DBURL = "http://sdnrdb:9200";
+    private static final String DEFAULT_DBURL_ELASTICSEARCH = "http://sdnrdb:9200";
+    private static final String DEFAULT_DBURL_MARIADB = "jdbc:mysql://sdnrdb:3306/sdnrdb";
     private static final String DEFAULT_DBPREFIX = "";
     private static final boolean DEFAULT_TRUSTINSECURESSL = false;
 
@@ -103,6 +104,8 @@ public class Program {
     private static final String OPTION_DATABASE_LONG = "dburl";
     private static final String OPTION_COMMAND_SHORT = "c";
     private static final String OPTION_COMMAND_LONG = "cmd";
+    private static final String OPTION_DATABASETYPE_SHORT = "dbt";
+    private static final String OPTION_DATABASETYPE_LONG = "db-type";
     private static final String OPTION_DATABASEUSER_SHORT = "dbu";
     private static final String OPTION_DATABASEUSER_LONG = "db-username";
     private static final String OPTION_DATABASEPASSWORD_SHORT = "dbp";
@@ -141,6 +144,9 @@ public class Program {
         if (def instanceof Release) {
             return cmd.hasOption(option) ? (T) Release.getValueBySuffix(cmd.getOptionValue(option)) : def;
         }
+        if (def instanceof SdnrDbType) {
+            return cmd.hasOption(option) ? (T) SdnrDbType.valueOf(cmd.getOptionValue(option).toUpperCase()) : def;
+        }
         if (cmd.hasOption(option) && cmd.getOptionValue(option) != null) {
             if (option.equals(OPTION_VERSION_SHORT)) {
                 String v = cmd.getOptionValue(option);
@@ -303,7 +309,7 @@ public class Program {
         if (filename == null) {
             throw new Exception("please add output file parameter");
         }
-        DataMigrationProviderImpl service = new DataMigrationProviderImpl(new HostInfo[] {HostInfo.parse(options.getUrl())},
+        DataMigrationProviderImpl service = new DataMigrationProviderImpl(options.getType(), options.getUrl(),
                 options.getUsername(), options.getPassword(), options.doTrustAll(), options.getTimeoutMs());
         DataMigrationReport report = service.importData(filename, false);
         LOG.info(report);
@@ -319,7 +325,7 @@ public class Program {
         if (filename == null) {
             throw new Exception("please add output file parameter");
         }
-        DataMigrationProviderImpl service = new DataMigrationProviderImpl(new HostInfo[] {HostInfo.parse(options.getUrl())},
+        DataMigrationProviderImpl service = new DataMigrationProviderImpl(options.getType(), options.getUrl(),
                 options.getUsername(), options.getPassword(), options.doTrustAll(), options.getTimeoutMs());
         DataMigrationReport report = service.exportData(filename);
         LOG.info(report);
@@ -342,7 +348,7 @@ public class Program {
         Release r = getOptionOrDefault(cmd, OPTION_VERSION_SHORT, (Release) null);
         DatabaseOptions options = new DatabaseOptions(cmd);
         String dbPrefix = getOptionOrDefault(cmd, OPTION_DATABASEPREFIX_SHORT, DEFAULT_DBPREFIX);
-        DataMigrationProviderImpl service = new DataMigrationProviderImpl(new HostInfo[] {HostInfo.parse(options.getUrl())},
+        DataMigrationProviderImpl service = new DataMigrationProviderImpl(options.getType(), options.getUrl(),
                 options.getUsername(), options.getPassword(), options.doTrustAll(), options.getTimeoutMs());
         if (!service.clearDatabase(r, dbPrefix, options.getTimeoutMs())) {
             throw new Exception("failed to init database");
@@ -352,7 +358,7 @@ public class Program {
 
     private static void cmd_clear_db_complete(CommandLine cmd) throws Exception {
         DatabaseOptions options = new DatabaseOptions(cmd);
-        DataMigrationProviderImpl service = new DataMigrationProviderImpl(new HostInfo[] {HostInfo.parse(options.getUrl())},
+        DataMigrationProviderImpl service = new DataMigrationProviderImpl(options.getType(), options.getUrl(),
                 options.getUsername(), options.getPassword(), options.doTrustAll(), options.getTimeoutMs());
         if (!service.clearCompleteDatabase(options.getTimeoutMs())) {
             throw new Exception("failed to init database");
@@ -366,7 +372,7 @@ public class Program {
         int numReplicas = getOptionOrDefault(cmd, OPTION_REPLICAS_SHORT, DEFAULT_REPLICAS);
         DatabaseOptions options = new DatabaseOptions(cmd);
         String dbPrefix = getOptionOrDefault(cmd, OPTION_DATABASEPREFIX_SHORT, DEFAULT_DBPREFIX);
-        DataMigrationProviderImpl service = new DataMigrationProviderImpl(new HostInfo[] {HostInfo.parse(options.getUrl())},
+        DataMigrationProviderImpl service = new DataMigrationProviderImpl(options.getType(),options.getUrl(),
                 options.getUsername(), options.getPassword(), options.doTrustAll(), options.getTimeoutMs());
         boolean forceRecreate = cmd.hasOption(OPTION_FORCE_RECREATE_SHORT);
         if (!service.initDatabase(r, numShards, numReplicas, dbPrefix, forceRecreate, options.getTimeoutMs())) {
@@ -380,6 +386,8 @@ public class Program {
         Options result = new Options();
         result.addOption(createOption(OPTION_COMMAND_SHORT, OPTION_COMMAND_LONG, true, "command to execute", false));
         result.addOption(createOption(OPTION_DATABASE_SHORT, OPTION_DATABASE_LONG, true, "database url", false));
+        result.addOption(createOption(OPTION_DATABASETYPE_SHORT, OPTION_DATABASETYPE_LONG, true,
+                "database type (elasticsearch|mariadb)", false));
         result.addOption(createOption(OPTION_DATABASEUSER_SHORT, OPTION_DATABASEUSER_LONG, true,
                 "database basic auth username", false));
         result.addOption(createOption(OPTION_DATABASEPASSWORD_SHORT, OPTION_DATABASEPASSWORD_LONG, true,
@@ -432,10 +440,14 @@ public class Program {
         private final String password;
         private final boolean trustAll;
         private final long timeoutMs;
+        private final SdnrDbType type;
 
         public String getUrl() {
             return this.url;
         }
+        public SdnrDbType getType() {
+            return this.type;
+        }
         public String getUsername() {
             return this.username;
         }
@@ -448,8 +460,11 @@ public class Program {
         public long getTimeoutMs() {
             return this.timeoutMs;
         }
+
         public DatabaseOptions(CommandLine cmd) throws ParseException {
-            this.url = getOptionOrDefault(cmd, OPTION_DATABASE_SHORT, DEFAULT_DBURL);
+            this.type = getOptionOrDefault(cmd, OPTION_DATABASETYPE_LONG, SdnrDbType.ELASTICSEARCH);
+            this.url = getOptionOrDefault(cmd, OPTION_DATABASE_SHORT,
+                    this.type == SdnrDbType.ELASTICSEARCH ? DEFAULT_DBURL_ELASTICSEARCH : DEFAULT_DBURL_MARIADB);
             this.username = getOptionOrDefault(cmd, OPTION_DATABASEUSER_SHORT, null);
             this.password = getOptionOrDefault(cmd, OPTION_DATABASEPASSWORD_SHORT, null);
             this.trustAll = getOptionOrDefault(cmd, OPTION_TRUSTINSECURESSL_SHORT, DEFAULT_TRUSTINSECURESSL);
index 8362b00..6e5bdc5 100644 (file)
  */
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.KeepDataSearchHitConverter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.MariaDBTableInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.elalto.ElAltoReleaseInformation;
@@ -42,15 +46,26 @@ public abstract class ReleaseInformation {
     // variables
     private final Release release;
     private final Map<ComponentName, DatabaseInfo> dbMap;
+    private Map<ComponentName, MariaDBTableInfo> mariadbMap;
     // end of variables
 
     // constructors
     public ReleaseInformation(Release r, Map<ComponentName, DatabaseInfo> dbMap) {
+        this(r, dbMap, new HashMap<>());
+    }
+
+    public ReleaseInformation(Release r, Map<ComponentName, DatabaseInfo> dbMap,
+            Map<ComponentName, MariaDBTableInfo> mariadbMap) {
         this.release = r;
         this.dbMap = dbMap;
+        this.mariadbMap = mariadbMap;
     }
     // end of constructors
 
+    protected Release getReleas() {
+        return this.release;
+    }
+
     /**
      * get database alias for component
      *
@@ -120,6 +135,18 @@ public abstract class ReleaseInformation {
         return dbMap.get(name) == null ? null : dbMap.get(name).getSettings(shards, replicas);
     }
 
+    public String getDatabaseMapping(ComponentName name, SdnrDbType dbType) {
+        switch (dbType) {
+            case ELASTICSEARCH:
+                return this.getDatabaseMapping(name);
+            case MARIADB:
+                return mariadbMap.get(name) == null ? null
+                        : mariadbMap.get(name).getMapping(this.release.getDBSuffix());
+            default:
+                return null;
+        }
+    }
+
     /**
      * get converter for component data
      *
@@ -172,7 +199,7 @@ public abstract class ReleaseInformation {
      * @param indices
      * @return true if components of this release are covered by the given indices
      */
-    protected boolean containsIndices(IndicesEntryList indices) {
+    public boolean containsIndices(IndicesEntryList indices) {
 
         if (this.dbMap.size() <= 0) {
             return false;
@@ -191,13 +218,19 @@ public abstract class ReleaseInformation {
      * @param dbClient
      * @return if succeeded or not
      */
-    protected abstract boolean runPreInitCommands(HtDatabaseClient dbClient);
+    public abstract boolean runPreInitCommands(HtDatabaseClient dbClient);
+
+    public abstract boolean runPreInitCommands(SqlDBClient dbClient);
 
     /**
      *
      * @param dbClient
      * @return if succeeded or not
      */
-    protected abstract boolean runPostInitCommands(HtDatabaseClient dbClient);
+    public abstract boolean runPostInitCommands(HtDatabaseClient dbClient);
+
+    public abstract boolean runPostInitCommands(SqlDBClient dbClient);
+
+
 
 }
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/MariaDBTableInfo.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/MariaDBTableInfo.java
new file mode 100644 (file)
index 0000000..9567909
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * ============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.setup.data;
+
+/**
+ * @author Michael Dürre
+ *
+ */
+public class MariaDBTableInfo {
+    public final String alias;
+    protected final String mapping;
+
+    public MariaDBTableInfo(String alias, String mapping) {
+        this.alias = alias;
+        this.mapping = mapping;
+    }
+
+    public String getMapping(String dbSuffix) {
+        return this.mapping.replaceAll("%s", dbSuffix);
+    }
+
+
+}
index 119479b..22338e8 100644 (file)
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data;
 
 import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntry;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.EsVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+
 
 public enum Release {
 
-    EL_ALTO("el alto", "_v1", new EsVersion(2, 2, 0), new EsVersion(2, 2, 0)),
-    FRANKFURT_R1("frankfurt-R1", "-v2", new EsVersion(6, 4, 3), new EsVersion(6, 8, 6)),
-    FRANKFURT_R2("frankfurt-R2", "-v3", new EsVersion(7, 0, 1), new EsVersion(7, 6, 1)),
-    GUILIN_R1("guilin-R1", "-v4", new EsVersion(7,1,1), new EsVersion(7,6,1)),
-       HONOLULU_R1("honolulu-R1", "-v5", new EsVersion(7,1,1), new EsVersion(8,0,0), false),
-       ISTANBUL_R1("istanbul-R1", "-v6", new EsVersion(7,1,1), new EsVersion(8,0,0), false);
+    EL_ALTO("el alto", "_v1", new DatabaseVersion(2, 2, 0), new DatabaseVersion(2, 2, 0)),
+    FRANKFURT_R1("frankfurt-R1", "-v2", new DatabaseVersion(6, 4, 3), new DatabaseVersion(6, 8, 6)),
+    FRANKFURT_R2("frankfurt-R2", "-v3", new DatabaseVersion(7, 0, 1), new DatabaseVersion(7, 6, 1)),
+    GUILIN_R1("guilin-R1", "-v4", new DatabaseVersion(7,1,1), new DatabaseVersion(7,6,1)),
+       HONOLULU_R1("honolulu-R1", "-v5", new DatabaseVersion(7,1,1), new DatabaseVersion(8,0,0), false),
+       ISTANBUL_R1("istanbul-R1", "-v6", new DatabaseVersion(7,1,1), new DatabaseVersion(8,0,0), false,
+               new DatabaseVersion(10,2,7), new DatabaseVersion(10,6,0), false);
 
     public static final Release CURRENT_RELEASE = Release.ISTANBUL_R1;
 
     private final String value;
     private final String dbSuffix;
-    private final EsVersion minDbVersion;
-    private final EsVersion maxDbVersion;
+    private final DatabaseVersion minDbVersion;
+    private final DatabaseVersion maxDbVersion;
+    private final DatabaseVersion minMariaDbVersion;
+    private final DatabaseVersion maxMariaDbVersion;
     private final boolean includeEndVersion;
+    private final boolean mariaDbIncludeEndVersion;
+
+    private Release(String s, String dbsuffix, DatabaseVersion minDbVersion, DatabaseVersion maxDbVersion) {
+        this(s, dbsuffix, minDbVersion, maxDbVersion, true, null, null, false);
+    }
+
+    private Release(String s, String dbsuffix, DatabaseVersion minDbVersion, DatabaseVersion maxDbVersion,
+            boolean includeEnd) {
+        this(s, dbsuffix, minDbVersion, maxDbVersion, includeEnd, null, null, false);
+    }
 
-       private Release(String s, String dbsuffix, EsVersion minDbVersion, EsVersion maxDbVersion) {
-               this(s, dbsuffix, minDbVersion, maxDbVersion, true);
-       }
-    private Release(String s, String dbsuffix, EsVersion minDbVersion, EsVersion maxDbVersion, boolean includeEnd) {
+    private Release(String s, String dbsuffix, DatabaseVersion minDbVersion, DatabaseVersion maxDbVersion,
+            boolean includeEnd, DatabaseVersion minMariaDbVersion, DatabaseVersion maxMariaDbVersion,
+            boolean mariaDbIncludeEnd) {
         this.value = s;
         this.dbSuffix = dbsuffix;
         this.minDbVersion = minDbVersion;
         this.maxDbVersion = maxDbVersion;
         this.includeEndVersion = includeEnd;
+        this.minMariaDbVersion = minMariaDbVersion;
+        this.maxMariaDbVersion = maxMariaDbVersion;
+        this.mariaDbIncludeEndVersion = mariaDbIncludeEnd;
     }
 
     @Override
@@ -94,16 +111,24 @@ public enum Release {
         return this.dbSuffix;
     }
 
-    public EsVersion getDBVersion() {
+    public DatabaseVersion getDBVersion() {
         return this.minDbVersion;
     }
 
-    public boolean isDbInRange(EsVersion dbVersion) {
-        if(this.includeEndVersion) {
-            return dbVersion.isNewerOrEqualThan(minDbVersion) && dbVersion.isOlderOrEqualThan(maxDbVersion);
-        }
-        else {
-            return dbVersion.isNewerOrEqualThan(minDbVersion) && dbVersion.isOlderThan(maxDbVersion);
+    public boolean isDbInRange(DatabaseVersion dbVersion, SdnrDbType type) {
+        if (type == SdnrDbType.ELASTICSEARCH) {
+            if (this.includeEndVersion) {
+                return dbVersion.isNewerOrEqualThan(minDbVersion) && dbVersion.isOlderOrEqualThan(maxDbVersion);
+            } else {
+                return dbVersion.isNewerOrEqualThan(minDbVersion) && dbVersion.isOlderThan(maxDbVersion);
+            }
+        } else {
+            if (this.mariaDbIncludeEndVersion) {
+                return dbVersion.isNewerOrEqualThan(minMariaDbVersion)
+                        && dbVersion.isOlderOrEqualThan(maxMariaDbVersion);
+            } else {
+                return dbVersion.isNewerOrEqualThan(minMariaDbVersion) && dbVersion.isOlderThan(maxMariaDbVersion);
+            }
         }
     }
 }
index 664dce6..58e8d20 100644 (file)
@@ -23,7 +23,9 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.onap.ccsdk.features.sdnr.wt.common.database.data.EsVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+
 
 /**
  * @author Michael Dürre
@@ -51,10 +53,10 @@ public enum ReleaseGroup {
      * @param dbVersion
      * @return
      */
-    public Release getLatestCompatibleRelease(EsVersion dbVersion) {
+    public Release getLatestCompatibleRelease(DatabaseVersion dbVersion, SdnrDbType type) {
         Release match = null;
         for (Release r : this.releases) {
-            if (r.isDbInRange(dbVersion)) {
+            if (r.isDbInRange(dbVersion, type)) {
                 match = r;
             }
         }
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/ElasticsearchDataMigrationProvider.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/ElasticsearchDataMigrationProvider.java
new file mode 100644 (file)
index 0000000..3cfa8c1
--- /dev/null
@@ -0,0 +1,465 @@
+/*
+ * ============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.setup.database;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+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.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntry;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntry;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateAliasRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteAliasRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AcknowledgedResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetInfoResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ListAliasesResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ListIndicesResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.DataMigrationProviderService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentData;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataContainer;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ReleaseGroup;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ElasticsearchDataMigrationProvider implements DataMigrationProviderService {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchDataMigrationProvider.class);
+    private final HtDatabaseClient dbClient;
+
+    public ElasticsearchDataMigrationProvider(String url, String username, String password, boolean trustAll,
+            long timeoutms) throws Exception {
+        dbClient = HtDatabaseClient.getClient(new HostInfo[] {HostInfo.parse(url)}, username, password, trustAll,
+                true, timeoutms);
+    }
+
+    @Override
+    public DataMigrationReport importData(String filename, boolean dryrun) throws Exception {
+        return this.importData(filename, dryrun, Release.CURRENT_RELEASE);
+    }
+
+    @Override
+    public DataMigrationReport importData(String filename, boolean dryrun, Release forRelease) throws Exception {
+        DataMigrationReport report = new DataMigrationReport();
+        File file = new File(filename);
+        if (!file.exists()) {
+            if (dryrun) {
+                report.error("file %s not found", filename);
+                return report;
+            }
+            throw new FileNotFoundException(filename);
+        }
+        DataContainer container = null;
+        try {
+            container = DataContainer.load(file);
+        } catch (Exception e) {
+            if (dryrun) {
+                report.error("problem loading file %s: %s", filename, e.getMessage());
+                return report;
+            }
+            throw new Exception("problem loading file " + filename, e);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(forRelease);
+        SearchHitConverter converter;
+        Set<ComponentName> components = ri.getComponents();
+        //for all db components of dest architecture
+        for (ComponentName component : components) {
+            //convert to ComponentData for current release with existing ComponentData of the container
+            converter = SearchHitConverter.Factory.getInstance(container.getRelease(), forRelease, component);
+            if (converter == null) {
+                continue;
+            }
+            ComponentData data = converter.convert(container);
+            if (data != null) {
+                String indexName = ri.getAlias(component);
+                String dataTypeName = ri.getDataType(component);
+                if (dryrun) {
+                    report.log("write %d entries into %s/%s", data.size(), indexName, dataTypeName);
+                } else {
+                    LOG.debug("write {} entries into {}/{}", data.size(), indexName, dataTypeName);
+                }
+                for (SearchHit item : data) {
+                    if (!dryrun) {
+                        String id = this.dbClient.doWriteRaw(indexName, dataTypeName, item.getId(),
+                                item.getSourceAsString(), true);
+                        if (!item.getId().equals(id)) {
+                            LOG.warn("entry for {} with original id {} was written with another id {}",
+                                    component.getValue(), item.getId(), id);
+                        }
+                    }
+                }
+            } else {
+                if (dryrun) {
+                    report.error("unable to convert data for " + component.getValue() + " from version "
+                            + container.getRelease().getValue() + " to " + forRelease.getValue() + "\n");
+                } else {
+                    LOG.warn("unable to convert data for {} from version {} to {}", component.getValue(),
+                            container.getRelease().getValue(), forRelease.getValue());
+                }
+            }
+        }
+        LOG.info("import of {} completed", filename);
+        if (dryrun) {
+            report.log("import of %s completed", filename);
+        }
+        report.setCompleted(true);
+        return report;
+    }
+
+
+    /**
+     * export data if file exists .1 (.n) will be created
+     *
+     */
+    @Override
+    public DataMigrationReport exportData(String filename) {
+        DataMigrationReport report = new DataMigrationReport();
+
+        DataContainer container = new DataContainer();
+
+        filename = this.checkFilenameForWrite(filename);
+        LOG.info("output will be written to {}", filename);
+        //autodetect version
+        Release dbRelease = this.autoDetectRelease();
+        if (dbRelease == null) {
+            report.error("unbable to detect db release. is database initialized?");
+            return report;
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(dbRelease);
+        boolean componentsSucceeded = true;
+        for (ComponentName c : ri.getComponents()) {
+            ComponentData data = new ComponentData(c);
+            SearchResult<SearchHit> result = this.dbClient.doReadAllJsonData(ri.getAlias(c), ri.getDataType(c), false);
+            data.addAll(result.getHits());
+            container.addComponent(c, data);
+        }
+        try {
+            Files.write(new File(filename).toPath(), Arrays.asList(container.toJSON()), StandardCharsets.UTF_8);
+            report.setCompleted(componentsSucceeded);
+        } catch (IOException e) {
+            LOG.warn("problem writing data to {}: {}", filename, e);
+        }
+        return report;
+    }
+
+    private String checkFilenameForWrite(String filename) {
+        File f = new File(filename);
+        if (!f.exists()) {
+            return filename;
+        }
+        return this.checkFilenameForWrite(filename, 0);
+    }
+
+    private String checkFilenameForWrite(String filename, int apdx) {
+        File f = new File(String.format("$s.$d", filename, apdx));
+        if (!f.exists()) {
+            return filename;
+        }
+        return this.checkFilenameForWrite(filename, apdx + 1);
+    }
+
+    @Override
+    public Release getCurrentVersion() {
+        return Release.CURRENT_RELEASE;
+    }
+
+
+    @Override
+    public Release autoDetectRelease() {
+        DatabaseVersion dbVersion = this.readActualVersion();
+        AliasesEntryList aliases = this.readAliases();
+        IndicesEntryList indices = this.readIndices();
+        if (indices == null) {
+            return null;
+        }
+        List<Release> foundReleases = new ArrayList<>();
+        //if there are active aliases reduce indices to the active ones
+        if (aliases != null && aliases.size() > 0) {
+            indices = indices.subList(aliases.getLinkedIndices());
+        }
+        for (Release r : Release.values()) {
+            if (r.isDbInRange(dbVersion, SdnrDbType.ELASTICSEARCH)) {
+                ReleaseInformation ri = ReleaseInformation.getInstance(r);
+                if (ri != null && ri.containsIndices(indices)) {
+                    foundReleases.add(r);
+                }
+            }
+        }
+        if (foundReleases.size() == 1) {
+            return foundReleases.get(0);
+        }
+        LOG.error("detect {} releases: {}. unable to detect for which one to do sth.", foundReleases.size(),
+                foundReleases);
+        return null;
+    }
+
+    private DatabaseVersion readActualVersion() {
+        try {
+            GetInfoResponse response = this.dbClient.getInfo();
+            return response.getVersion();
+        } catch (Exception e) {
+            LOG.warn(e.getMessage());
+        }
+        return null;
+    }
+
+    private AliasesEntryList readAliases() {
+        AliasesEntryList entries = null;
+        try {
+            ListAliasesResponse response = this.dbClient.getAliases();
+            entries = response.getEntries();
+        } catch (ParseException | IOException e) {
+            LOG.error(e.getMessage());
+        }
+        return entries;
+    }
+
+    private IndicesEntryList readIndices() {
+        IndicesEntryList entries = null;
+        try {
+            ListIndicesResponse response = this.dbClient.getIndices();
+            entries = response.getEntries();
+        } catch (ParseException | IOException e) {
+            LOG.error(e.getMessage());
+        }
+        return entries;
+    }
+
+
+    @Override
+    public boolean initDatabase(Release release, int numShards, int numReplicas, String dbPrefix, boolean forceRecreate,
+            long timeoutms) {
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        DatabaseVersion dbVersion = this.readActualVersion();
+        if (dbVersion == null) {
+            return false;
+        }
+        LOG.info("detected database version {}", dbVersion);
+        if (release == null) {
+            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion, SdnrDbType.ELASTICSEARCH);
+            if (release == null) {
+                LOG.warn("unable to autodetect release for this database version for release {}",
+                        ReleaseGroup.CURRENT_RELEASE.name());
+                return false;
+            }
+            LOG.info("autodetect release {}", release);
+        }
+        if (!release.isDbInRange(dbVersion, SdnrDbType.ELASTICSEARCH)) {
+            LOG.warn("db version {} maybe not compatible with release {}", dbVersion, release);
+            return false;
+        }
+        if (forceRecreate) {
+            this.clearDatabase(release, dbPrefix, 0);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(release);
+        AliasesEntryList aliases = this.readAliases();
+        IndicesEntryList indices = this.readIndices();
+        if (aliases == null || indices == null) {
+            return false;
+        }
+        AcknowledgedResponse response = null;
+        if (!ri.runPreInitCommands(this.dbClient)) {
+            return false;
+        }
+        for (ComponentName component : ri.getComponents()) {
+            try {
+                if (ri.hasOwnDbIndex(component)) {
+                    //check if index already exists
+                    String indexName = ri.getIndex(component, dbPrefix);
+                    String aliasName = ri.getAlias(component, dbPrefix);
+                    if (indices.findByIndex(indexName) == null) {
+                        LOG.info("creating index for {}", component);
+                        CreateIndexRequest request = new CreateIndexRequest(ri.getIndex(component, dbPrefix));
+                        request.mappings(new JSONObject(ri.getDatabaseMapping(component)));
+                        request.settings(new JSONObject(ri.getDatabaseSettings(component, numShards, numReplicas)));
+                        response = this.dbClient.createIndex(request);
+                        LOG.info(response.isAcknowledged() ? "succeeded" : "failed");
+                    } else {
+                        LOG.info("index {} for {} already exists", indexName, component);
+                    }
+                    //check if alias already exists
+                    if (aliases.findByAlias(aliasName) == null) {
+                        LOG.info("creating alias for {}", component);
+                        response = this.dbClient.createAlias(new CreateAliasRequest(indexName, aliasName));
+                        LOG.info(response.isAcknowledged() ? "succeeded" : "failed");
+                    } else {
+                        LOG.info("alias {} for index {} for {} already exists", aliasName, indexName, component);
+                    }
+                }
+            } catch (IOException e) {
+                LOG.error(e.getMessage());
+                return false;
+            }
+        }
+        if (!ri.runPostInitCommands(this.dbClient)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean clearDatabase(Release release, String dbPrefix, long timeoutms) {
+
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        //check aliases
+        AliasesEntryList entries = this.readAliases();
+        IndicesEntryList entries2 = this.readIndices();
+        if (entries == null) {
+            return false;
+        }
+        if (release == null) {
+            DatabaseVersion dbVersion = this.readActualVersion();
+            if (dbVersion == null) {
+                return false;
+            }
+            LOG.info("detected database version {}", dbVersion);
+            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion, SdnrDbType.ELASTICSEARCH);
+            if (release == null) {
+                LOG.warn("unable to autodetect release for this database version for release {}",
+                        ReleaseGroup.CURRENT_RELEASE.name());
+                return false;
+            }
+            LOG.info("autodetect release {}", release);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(release);
+        AcknowledgedResponse response;
+        if (entries.size() <= 0) {
+            LOG.info("no aliases to clear");
+        } else {
+            //check for every component of release if alias exists
+            for (ComponentName component : ri.getComponents()) {
+                String aliasToDelete = ri.getAlias(component, dbPrefix);
+                AliasesEntry entryToDelete = entries.findByAlias(aliasToDelete);
+                if (entryToDelete != null) {
+                    try {
+                        LOG.info("deleting alias {} for index {}", entryToDelete.getAlias(), entryToDelete.getIndex());
+                        response = this.dbClient.deleteAlias(
+                                new DeleteAliasRequest(entryToDelete.getIndex(), entryToDelete.getAlias()));
+                        LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
+                    } catch (IOException e) {
+                        LOG.error(e.getMessage());
+                        return false;
+                    }
+                } else {
+                    //try to find malformed typed index with alias name
+                    IndicesEntry entry2ToDelete = entries2.findByIndex(aliasToDelete);
+                    if (entry2ToDelete != null) {
+                        try {
+                            LOG.info("deleting index {}", entry2ToDelete.getName());
+                            response = this.dbClient.deleteIndex(new DeleteIndexRequest(entry2ToDelete.getName()));
+                            LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
+                        } catch (IOException e) {
+                            LOG.error(e.getMessage());
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        if (entries2 == null) {
+            return false;
+        }
+        if (entries2.size() <= 0) {
+            LOG.info("no indices to clear");
+        } else {
+            //check for every component of release if index exists
+            for (ComponentName component : ri.getComponents()) {
+                String indexToDelete = ri.getIndex(component, dbPrefix);
+                IndicesEntry entryToDelete = entries2.findByIndex(indexToDelete);
+                if (entryToDelete != null) {
+                    try {
+                        LOG.info("deleting index {}", entryToDelete.getName());
+                        response = this.dbClient.deleteIndex(new DeleteIndexRequest(entryToDelete.getName()));
+                        LOG.info(response.isResponseSucceeded() ? "succeeded" : "failed");
+                    } catch (IOException e) {
+                        LOG.error(e.getMessage());
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * @param timeoutms
+     * @return
+     */
+    public boolean clearCompleteDatabase(long timeoutms) {
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        //check aliases and indices
+        AliasesEntryList aliases = this.readAliases();
+        IndicesEntryList indices = this.readIndices();
+        if (aliases == null || indices == null) {
+            return false;
+        }
+        for (AliasesEntry alias : aliases) {
+            try {
+                LOG.info("deleting alias {} for index {}", alias.getAlias(), alias.getIndex());
+                this.dbClient.deleteAlias(new DeleteAliasRequest(alias.getIndex(), alias.getAlias()));
+            } catch (IOException e) {
+                LOG.error("problem deleting alias {}: {}", alias.getAlias(), e);
+                return false;
+            }
+        }
+        for (IndicesEntry index : indices) {
+            try {
+                LOG.info("deleting index {}", index.getName());
+                this.dbClient.deleteIndex(new DeleteIndexRequest(index.getName()));
+            } catch (IOException e) {
+                LOG.error("problem deleting index {}: {}", index.getName(), e);
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/MariaDbDataMigrationProvider.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/MariaDbDataMigrationProvider.java
new file mode 100644 (file)
index 0000000..d46fc4e
--- /dev/null
@@ -0,0 +1,433 @@
+/*
+ * ============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.setup.database;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+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.data.AliasesEntry;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.AliasesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DatabaseVersion;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntry;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.IndicesEntryList;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.DataMigrationProviderService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentData;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataContainer;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ReleaseGroup;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MariaDbDataMigrationProvider implements DataMigrationProviderService {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger(MariaDbDataMigrationProvider.class);
+    private static final SdnrDbType DBTYPE = SdnrDbType.MARIADB;
+    private final SqlDBClient dbClient;
+
+    public MariaDbDataMigrationProvider(String url, String username, String password, boolean trustAll,
+            long timeoutms) throws Exception {
+        dbClient = new SqlDBClient(url, username, password);
+    }
+
+    @Override
+    public DataMigrationReport importData(String filename, boolean dryrun) throws Exception {
+        return this.importData(filename, dryrun, Release.CURRENT_RELEASE);
+    }
+
+    @Override
+    public DataMigrationReport importData(String filename, boolean dryrun, Release forRelease) throws Exception {
+        DataMigrationReport report = new DataMigrationReport();
+        File file = new File(filename);
+        if (!file.exists()) {
+            if (dryrun) {
+                report.error("file %s not found", filename);
+                return report;
+            }
+            throw new FileNotFoundException(filename);
+        }
+        DataContainer container = null;
+        try {
+            container = DataContainer.load(file);
+        } catch (Exception e) {
+            if (dryrun) {
+                report.error("problem loading file %s: %s", filename, e.getMessage());
+                return report;
+            }
+            throw new Exception("problem loading file " + filename, e);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(forRelease);
+        SearchHitConverter converter;
+        Set<ComponentName> components = ri.getComponents();
+        //for all db components of dest architecture
+        for (ComponentName component : components) {
+            //convert to ComponentData for current release with existing ComponentData of the container
+            converter = SearchHitConverter.Factory.getInstance(container.getRelease(), forRelease, component);
+            if (converter == null) {
+                continue;
+            }
+            ComponentData data = converter.convert(container);
+            if (data != null) {
+                String indexName = ri.getAlias(component);
+                String dataTypeName = ri.getDataType(component);
+                if (dryrun) {
+                    report.log("write %d entries into %s/%s", data.size(), indexName, dataTypeName);
+                } else {
+                    LOG.debug("write {} entries into {}/{}", data.size(), indexName, dataTypeName);
+                }
+                for (SearchHit item : data) {
+                    if (!dryrun) {
+                        String id = null;//this.dbClient.doWriteRaw(indexName, dataTypeName, item.getId(), item.getSourceAsString(), true);
+                        if (!item.getId().equals(id)) {
+                            LOG.warn("entry for {} with original id {} was written with another id {}",
+                                    component.getValue(), item.getId(), id);
+                        }
+                    }
+                }
+            } else {
+                if (dryrun) {
+                    report.error("unable to convert data for " + component.getValue() + " from version "
+                            + container.getRelease().getValue() + " to " + forRelease.getValue() + "\n");
+                } else {
+                    LOG.warn("unable to convert data for {} from version {} to {}", component.getValue(),
+                            container.getRelease().getValue(), forRelease.getValue());
+                }
+            }
+        }
+        LOG.info("import of {} completed", filename);
+        if (dryrun) {
+            report.log("import of %s completed", filename);
+        }
+        report.setCompleted(true);
+        return report;
+    }
+
+
+    /**
+     * export data if file exists .1 (.n) will be created
+     *
+     */
+    @Override
+    public DataMigrationReport exportData(String filename) {
+        DataMigrationReport report = new DataMigrationReport();
+
+        DataContainer container = new DataContainer();
+
+        filename = this.checkFilenameForWrite(filename);
+        LOG.info("output will be written to {}", filename);
+        //autodetect version
+        Release dbRelease = this.autoDetectRelease();
+        if (dbRelease == null) {
+            report.error("unbable to detect db release. is database initialized?");
+            return report;
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(dbRelease);
+        boolean componentsSucceeded = true;
+        for (ComponentName c : ri.getComponents()) {
+            ComponentData data = new ComponentData(c);
+            SearchResult<SearchHit> result = null;//this.dbClient.doReadAllJsonData(ri.getAlias(c), ri.getDataType(c), false);
+            data.addAll(result.getHits());
+            container.addComponent(c, data);
+        }
+        try {
+            Files.write(new File(filename).toPath(), Arrays.asList(container.toJSON()), StandardCharsets.UTF_8);
+            report.setCompleted(componentsSucceeded);
+        } catch (IOException e) {
+            LOG.warn("problem writing data to {}: {}", filename, e);
+        }
+        return report;
+    }
+
+    private String checkFilenameForWrite(String filename) {
+        File f = new File(filename);
+        if (!f.exists()) {
+            return filename;
+        }
+        return this.checkFilenameForWrite(filename, 0);
+    }
+
+    private String checkFilenameForWrite(String filename, int apdx) {
+        File f = new File(String.format("$s.$d", filename, apdx));
+        if (!f.exists()) {
+            return filename;
+        }
+        return this.checkFilenameForWrite(filename, apdx + 1);
+    }
+
+    @Override
+    public Release getCurrentVersion() {
+        return Release.CURRENT_RELEASE;
+    }
+
+
+    @Override
+    public Release autoDetectRelease() {
+        DatabaseVersion dbVersion;
+        try {
+            dbVersion = this.dbClient.readActualVersion();
+        } catch (SQLException | ParseException e) {
+            LOG.error("unable to detect db version", e);
+            return null;
+        }
+        AliasesEntryList aliases = this.dbClient.readViews();
+        IndicesEntryList indices = this.dbClient.readTables();
+        if (indices == null) {
+            return null;
+        }
+        List<Release> foundReleases = new ArrayList<>();
+        //if there are active aliases reduce indices to the active ones
+        if (aliases != null && aliases.size() > 0) {
+            indices = indices.subList(aliases.getLinkedIndices());
+        }
+        for (Release r : Release.values()) {
+            if (r.isDbInRange(dbVersion, SdnrDbType.MARIADB)) {
+                ReleaseInformation ri = ReleaseInformation.getInstance(r);
+                if (ri != null && ri.containsIndices(indices)) {
+                    foundReleases.add(r);
+                }
+            }
+        }
+        if (foundReleases.size() == 1) {
+            return foundReleases.get(0);
+        }
+        LOG.error("detect {} releases: {}. unable to detect for which one to do sth.", foundReleases.size(),
+                foundReleases);
+        return null;
+    }
+
+    @Override
+    public boolean initDatabase(Release release, int numShards, int numReplicas, String dbPrefix, boolean forceRecreate,
+            long timeoutms) {
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        DatabaseVersion dbVersion;
+        try {
+            dbVersion = this.dbClient.readActualVersion();
+        } catch (SQLException | ParseException e1) {
+            LOG.error("unable to detect db version", e1);
+            return false;
+        }
+        if (dbVersion == null) {
+            return false;
+        }
+        LOG.info("detected database version {}", dbVersion);
+        if (release == null) {
+            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion, SdnrDbType.MARIADB);
+            if (release == null) {
+                LOG.warn("unable to autodetect release for this database version for release {}",
+                        ReleaseGroup.CURRENT_RELEASE.name());
+                return false;
+            }
+            LOG.info("autodetect release {}", release);
+        }
+        if (!release.isDbInRange(dbVersion, SdnrDbType.MARIADB)) {
+            LOG.warn("db version {} maybe not compatible with release {}", dbVersion, release);
+            return false;
+        }
+        if (forceRecreate) {
+            this.clearDatabase(release, dbPrefix, 0);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(release);
+        AliasesEntryList views = this.dbClient.readViews();
+        IndicesEntryList indices = this.dbClient.readTables();
+        if (views == null || indices == null) {
+            return false;
+        }
+        boolean response = false;
+        if (!ri.runPreInitCommands(this.dbClient)) {
+            return false;
+        }
+        for (ComponentName component : ri.getComponents()) {
+            try {
+                if (ri.hasOwnDbIndex(component)) {
+                    //check if index already exists
+                    String tableName = ri.getIndex(component, dbPrefix);
+                    String viewName = ri.getAlias(component, dbPrefix);
+                    if (indices.findByIndex(tableName) == null) {
+                        LOG.info("creating index for {}", component);
+                        response = this.dbClient.createTable(ri.getIndex(component, dbPrefix), ri.getDatabaseMapping(component, DBTYPE));
+                        LOG.info(response ? "succeeded" : "failed");
+                    } else {
+                        LOG.info("index {} for {} already exists", tableName, component);
+                    }
+                    //check if alias already exists
+                    if (views.findByAlias(viewName) == null) {
+                        LOG.info("creating alias for {}", component);
+                        response = this.dbClient.createView(tableName, viewName);
+                        LOG.info(response ? "succeeded" : "failed");
+                    } else {
+                        LOG.info("view {} for table {} for {} already exists", viewName, tableName, component);
+                    }
+                }
+            } catch (SQLException e) {
+                LOG.error(e.getMessage());
+                return false;
+            }
+        }
+        if (!ri.runPostInitCommands(this.dbClient)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean clearDatabase(Release release, String dbPrefix, long timeoutms) {
+
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        //check aliases
+        AliasesEntryList entries = this.dbClient.readViews();
+        IndicesEntryList entries2 = this.dbClient.readTables();
+        if (entries == null) {
+            return false;
+        }
+        if (release == null) {
+            DatabaseVersion dbVersion;
+            try {
+                dbVersion = this.dbClient.readActualVersion();
+            } catch (SQLException | ParseException e) {
+                LOG.error("unable to detect db version", e);
+                return false;
+            }
+            LOG.info("detected database version {}", dbVersion);
+            release = ReleaseGroup.CURRENT_RELEASE.getLatestCompatibleRelease(dbVersion, SdnrDbType.MARIADB);
+            if (release == null) {
+                LOG.warn("unable to autodetect release for this database version for release {}",
+                        ReleaseGroup.CURRENT_RELEASE.name());
+                return false;
+            }
+            LOG.info("autodetect release {}", release);
+        }
+        ReleaseInformation ri = ReleaseInformation.getInstance(release);
+        boolean response;
+        if (entries.size() <= 0) {
+            LOG.info("no aliases to clear");
+        } else {
+            //check for every component of release if alias exists
+            for (ComponentName component : ri.getComponents()) {
+                String aliasToDelete = ri.getAlias(component, dbPrefix);
+                AliasesEntry entryToDelete = entries.findByAlias(aliasToDelete);
+                if (entryToDelete != null) {
+                    try {
+                        LOG.info("deleting alias {} for index {}", entryToDelete.getAlias(), entryToDelete.getIndex());
+                        response = this.dbClient.deleteView(entryToDelete.getAlias());
+                        LOG.info(response ? "succeeded" : "failed");
+                    } catch (SQLException e) {
+                        LOG.error(e.getMessage());
+                        return false;
+                    }
+                } else {
+                    //try to find malformed typed index with alias name
+                    IndicesEntry entry2ToDelete = entries2.findByIndex(aliasToDelete);
+                    if (entry2ToDelete != null) {
+                        try {
+                            LOG.info("deleting index {}", entry2ToDelete.getName());
+                            response = this.dbClient.deleteTable(entry2ToDelete.getName());
+                            LOG.info(response ? "succeeded" : "failed");
+                        } catch (SQLException e) {
+                            LOG.error(e.getMessage());
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        if (entries2 == null) {
+            return false;
+        }
+        if (entries2.size() <= 0) {
+            LOG.info("no indices to clear");
+        } else {
+            //check for every component of release if index exists
+            for (ComponentName component : ri.getComponents()) {
+                String indexToDelete = ri.getIndex(component, dbPrefix);
+                IndicesEntry entryToDelete = entries2.findByIndex(indexToDelete);
+                if (entryToDelete != null) {
+                    try {
+                        LOG.info("deleting index {}", entryToDelete.getName());
+                        response = this.dbClient.deleteTable(entryToDelete.getName());
+                        LOG.info(response ? "succeeded" : "failed");
+                    } catch (SQLException e) {
+                        LOG.error(e.getMessage());
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * @param timeoutms
+     * @return
+     */
+    public boolean clearCompleteDatabase(long timeoutms) {
+        if (timeoutms > 0) {
+            this.dbClient.waitForYellowStatus(timeoutms);
+        }
+        //check aliases and indices
+        AliasesEntryList aliases = this.dbClient.readViews();
+        IndicesEntryList indices = this.dbClient.readTables();
+        if (aliases == null || indices == null) {
+            return false;
+        }
+        for (AliasesEntry alias : aliases) {
+            try {
+                LOG.info("deleting alias {} for index {}", alias.getAlias(), alias.getIndex());
+                this.dbClient.deleteView(alias.getAlias());
+            } catch (SQLException e) {
+                LOG.error("problem deleting alias {}: {}", alias.getAlias(), e);
+                return false;
+            }
+        }
+        for (IndicesEntry index : indices) {
+            try {
+                LOG.info("deleting index {}", index.getName());
+                this.dbClient.deleteTable(index.getName());
+            } catch (SQLException e) {
+                LOG.error("problem deleting index {}: {}", index.getName(), e);
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
index 739afaf..4165080 100644 (file)
@@ -23,13 +23,14 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.elalto;
 
 import java.util.HashMap;
 import java.util.Map;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.KeepDataSearchHitConverter;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
-import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 
 public class ElAltoReleaseInformation extends ReleaseInformation {
 
@@ -96,13 +97,22 @@ public class ElAltoReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
+    @Override
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
 }
index 7b8c40b..83ad6c4 100644 (file)
@@ -24,16 +24,17 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.frankfurt;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 
 public class FrankfurtReleaseInformation extends ReleaseInformation {
 
@@ -82,7 +83,7 @@ public class FrankfurtReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
 
         ClusterSettingsResponse response = null;
         try {
@@ -94,8 +95,17 @@ public class FrankfurtReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
+    @Override
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
 }
index f972777..8882a8b 100644 (file)
@@ -27,6 +27,7 @@ import java.util.Map;
 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
@@ -59,10 +60,10 @@ public class FrankfurtReleaseInformationR2 extends ReleaseInformation {
                 "{\"date\": {\"type\": \"keyword\"},\"model-identifier\": {\"type\": \"keyword\"},\"manufacturer-identifier\": {\"type\": \"keyword\"},\"type-name\": {\"type\": \"keyword\"},\"description\": {\"type\": \"keyword\"},\"uuid\": {\"type\": \"keyword\"},\"version\": {\"type\": \"keyword\"},\"parent-uuid\": {\"type\": \"keyword\"},\"contained-holder\": {\"type\": \"keyword\"},\"node-id\": {\"type\": \"keyword\"},\"tree-level\": {\"type\": \"long\"},\"part-type-id\": {\"type\": \"keyword\"},\"serial\": {\"type\": \"keyword\"}}"));
         map.put(ComponentName.HISTORICAL_PERFORMANCE_15M, new DatabaseInfo7("historicalperformance15min",
                 "historicalperformance15min",
-                "{\"node-name\":{\"type\": \"keyword\"},\"timestamp\":{\"type\": \"date\"},\"suspect-interval-flag\":{\"type\":\"boolean\"},\"scanner-id\":{\"type\": \"keyword\"},\"uuid-interface\":{\"type\": \"keyword\"},\"layer-protocol-name\":{\"type\": \"keyword\"},\"granularity-period\":{\"type\": \"keyword\"},\"radio-signal-id\":{\"type\": \"keyword\"}}"));
+                "{\"node-name\":{\"type\": \"keyword\"},\"time-stamp\":{\"type\": \"date\"},\"suspect-interval-flag\":{\"type\":\"boolean\"},\"scanner-id\":{\"type\": \"keyword\"},\"uuid-interface\":{\"type\": \"keyword\"},\"layer-protocol-name\":{\"type\": \"keyword\"},\"granularity-period\":{\"type\": \"keyword\"},\"radio-signal-id\":{\"type\": \"keyword\"}}"));
         map.put(ComponentName.HISTORICAL_PERFORMANCE_24H, new DatabaseInfo7("historicalperformance24h",
                 "historicalperformance24h",
-                "{\"node-name\":{\"type\": \"keyword\"},\"timestamp\":{\"type\": \"date\"},\"suspect-interval-flag\":{\"type\":\"boolean\"},\"scanner-id\":{\"type\": \"keyword\"},\"uuid-interface\":{\"type\": \"keyword\"},\"layer-protocol-name\":{\"type\": \"keyword\"},\"granularity-period\":{\"type\": \"keyword\"},\"radio-signal-id\":{\"type\": \"keyword\"}}"));
+                "{\"node-name\":{\"type\": \"keyword\"},\"time-stamp\":{\"type\": \"date\"},\"suspect-interval-flag\":{\"type\":\"boolean\"},\"scanner-id\":{\"type\": \"keyword\"},\"uuid-interface\":{\"type\": \"keyword\"},\"layer-protocol-name\":{\"type\": \"keyword\"},\"granularity-period\":{\"type\": \"keyword\"},\"radio-signal-id\":{\"type\": \"keyword\"}}"));
         map.put(ComponentName.REQUIRED_NETWORKELEMENT, new DatabaseInfo7("networkelement-connection",
                 "networkelement-connection",
                 "{\"node-id\": {\"type\": \"keyword\"},\"host\": {\"type\": \"keyword\"},\"port\": {\"type\": \"long\"},\"username\": {\"type\": \"keyword\"},\"password\": {\"type\": \"keyword\"},\"core-model-capability\": {\"type\": \"keyword\"},\"device-type\": {\"type\": \"keyword\"},\"is-required\": {\"type\": \"boolean\"},\"status\": {\"type\": \"keyword\"}}"));
@@ -83,7 +84,7 @@ public class FrankfurtReleaseInformationR2 extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
 
         ClusterSettingsResponse response = null;
         try {
@@ -95,8 +96,18 @@ public class FrankfurtReleaseInformationR2 extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
+    @Override
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
 }
index e057d82..5efaf93 100644 (file)
@@ -25,6 +25,7 @@ import java.io.IOException;
 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.KeepDataSearchHitConverter;
@@ -51,7 +52,7 @@ public class GuilinReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
         ClusterSettingsResponse response = null;
         try {
             response = dbClient.setupClusterSettings(new ClusterSettingsRequest(false).maxCompilationsPerMinute(400));
@@ -62,8 +63,18 @@ public class GuilinReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
+    @Override
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
 }
index 41f8175..148c004 100644 (file)
@@ -26,6 +26,7 @@ import java.util.Map;
 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
@@ -61,7 +62,7 @@ public class HonoluluReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
         ClusterSettingsResponse response = null;
         try {
             response = dbClient.setupClusterSettings(new ClusterSettingsRequest(false).maxCompilationsPerMinute(400));
@@ -72,8 +73,18 @@ public class HonoluluReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
         return true;
     }
 
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
+    @Override
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
+        return false;
+    }
+
 }
index 67200bb..0dcd3ae 100644 (file)
  */
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.istanbul;
 
-import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterSettingsRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterSettingsResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.ReleaseInformation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.ComponentName;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DatabaseInfo7;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.KeepDataSearchHitConverter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.MariaDBTableInfo;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.SearchHitConverter;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.honolulu.HonoluluReleaseInformation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
 
 public class IstanbulReleaseInformation extends ReleaseInformation {
 
-    private final Logger LOG = LoggerFactory.getLogger(IstanbulReleaseInformation.class);
+    private static final String TIMEZONE_TYPE_FORMAT =
+            "CHAR(6) DEFAULT NULL CHECK (`%s` regexp '^[+-]\\\\d\\\\d:\\\\d\\\\d$')";
+    private static final String TABLENAME_CONTROLLER_FORMAT = "controller%s";
+    private static final String TABLEMAPPING_CONTROLLER =
+            "`id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,`desc` VARCHAR(255) CHARACTER SET utf8 ,primary key(id)";
+    private static final String TABLEMAPPING_CONNECTIONLOG_FORMAT = "`id` int(11) NOT NULL AUTO_INCREMENT,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n" + "`timestamp` DATETIME(3) ,\n"
+            + "`status` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_EVENTLOG_FORMAT = "`id` int(11) NOT NULL AUTO_INCREMENT,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`source-type` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`object-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`timestamp` DATETIME(3) ,\n" + "`timestamp-tz` " + String.format(TIMEZONE_TYPE_FORMAT, "timestamp-tz")
+            + " ,\n" + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`counter` INTEGER ,\n"
+            + "`attribute-name` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`new-value` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_FAULTCURRENT_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`object-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`timestamp` DATETIME(3) ,\n" + "`timestamp-tz` "
+            + String.format(TIMEZONE_TYPE_FORMAT, "timestamp-tz") + " ,\n"
+            + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`counter` INTEGER ,\n"
+            + "`severity` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`problem` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_FAULTLOG_FORMAT = "`id` int(11) NOT NULL AUTO_INCREMENT,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`source-type` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`object-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`timestamp` DATETIME(3) ,\n" + "`timestamp-tz` " + String.format(TIMEZONE_TYPE_FORMAT, "timestamp-tz")
+            + " ,\n" + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`counter` INTEGER ,\n"
+            + "`severity` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`problem` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_GUICUTTHROUGH_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`name` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`weburi` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_HISTORICALPM15M_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n" + "`performance-data` JSON ,\n"
+            + "`granularity-period` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`time-stamp` DATETIME(3) ,\n"
+            + "`time-stamp-tz` " + String.format(TIMEZONE_TYPE_FORMAT, "time-stamp-tz") + " ,\n"
+            + "`node-name` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`uuid-interface` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`layer-protocol-name` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`radio-signal-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`suspect-interval-flag` BOOLEAN ,\n"
+            + "`scanner-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_HISTORICALPM24H_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n" + "`performance-data` JSON ,\n"
+            + "`granularity-period` VARCHAR(100) CHARACTER SET utf8 ,\n" + "`time-stamp` DATETIME(3) ,\n"
+            + "`time-stamp-tz` " + String.format(TIMEZONE_TYPE_FORMAT, "time-stamp-tz") + " ,\n"
+            + "`node-name` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`uuid-interface` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`layer-protocol-name` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`radio-signal-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`suspect-interval-flag` BOOLEAN ,\n"
+            + "`scanner-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_INVENTORY_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`version` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`type-name` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`date` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`description` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`uuid` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`part-type-id` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`model-identifier` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`manufacturer-identifier` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`tree-level` BIGINT ,\n"
+            + "`parent-uuid` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`contained-holder` JSON ,\n"
+            + "`serial` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`manufacturer-name` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_MAINTENANCE_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n" + "`active` BOOLEAN ,\n"
+            + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`description` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`problem` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`start` DATETIME(3) ,\n" + "`start-tz` "
+            + String.format(TIMEZONE_TYPE_FORMAT, "start-tz") + " ,\n" + "`end` DATETIME(3) ,\n" + "`end-tz` "
+            + String.format(TIMEZONE_TYPE_FORMAT, "end-tz") + " ,\n"
+            + "`object-id-ref` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_MEDIATORSERVER_FORMAT =
+            "`id` int(11) NOT NULL AUTO_INCREMENT,\n" + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+                    + "`name` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`url` VARCHAR(255) CHARACTER SET utf8 ,\n"
+                    + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_NETWORKELEMENT_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n"
+            + "`password` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`host` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`port` BIGINT ,\n" + "`status` VARCHAR(100) CHARACTER SET utf8 ,\n"
+            + "`node-id` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`username` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`is-required` BOOLEAN ,\n" + "`core-model-capability` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "`device-type` VARCHAR(100) CHARACTER SET utf8 ,\n"
+            + "`device-function` VARCHAR(512) CHARACTER SET utf8 ,\n" + "`node-details` JSON ,\n"
+            + "`tls-key` VARCHAR(255) CHARACTER SET utf8 ,\n" + "`mount-method` VARCHAR(255) CHARACTER SET utf8 ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+    private static final String TABLEMAPPING_USERDATA_FORMAT = "`id` VARCHAR(255) CHARACTER SET utf8 NOT NULL,\n"
+            + "`controller-id` VARCHAR(40) CHARACTER SET utf8 NOT NULL,\n" + "`value` JSON ,\n"
+            + "primary key(id),foreign key(`controller-id`) references `controller%s`(id)";
+
+
     public IstanbulReleaseInformation() {
-        super(Release.ISTANBUL_R1,createDBMap());
+        super(Release.ISTANBUL_R1, createDBMap(), createMariaDBMap(Release.ISTANBUL_R1.getDBSuffix()));
+    }
 
+    private static Map<ComponentName, MariaDBTableInfo> createMariaDBMap(String suffix) {
+        Map<ComponentName, MariaDBTableInfo> map = new HashMap<>();
+        map.put(ComponentName.CONNECTIONLOG,
+                new MariaDBTableInfo(Entity.Connectionlog.getName(), TABLEMAPPING_CONNECTIONLOG_FORMAT));
+        map.put(ComponentName.EVENTLOG, new MariaDBTableInfo(Entity.Eventlog.getName(), TABLEMAPPING_EVENTLOG_FORMAT));
+        map.put(ComponentName.FAULTCURRENT,
+                new MariaDBTableInfo(Entity.Faultcurrent.getName(), TABLEMAPPING_FAULTCURRENT_FORMAT));
+        map.put(ComponentName.FAULTLOG, new MariaDBTableInfo(Entity.Faultlog.getName(), TABLEMAPPING_FAULTLOG_FORMAT));
+        map.put(ComponentName.GUICUTTHROUGH,
+                new MariaDBTableInfo(Entity.Guicutthrough.getName(), TABLEMAPPING_GUICUTTHROUGH_FORMAT));
+        map.put(ComponentName.HISTORICAL_PERFORMANCE_15M,
+                new MariaDBTableInfo(Entity.Historicalperformance15min.getName(), TABLEMAPPING_HISTORICALPM15M_FORMAT));
+        map.put(ComponentName.HISTORICAL_PERFORMANCE_24H,
+                new MariaDBTableInfo(Entity.Historicalperformance24h.getName(), TABLEMAPPING_HISTORICALPM24H_FORMAT));
+        map.put(ComponentName.INVENTORY,
+                new MariaDBTableInfo(Entity.Inventoryequipment.getName(), TABLEMAPPING_INVENTORY_FORMAT));
+        map.put(ComponentName.MAINTENANCE,
+                new MariaDBTableInfo(Entity.Maintenancemode.getName(), TABLEMAPPING_MAINTENANCE_FORMAT));
+        map.put(ComponentName.MEDIATOR_SERVER,
+                new MariaDBTableInfo(Entity.MediatorServer.getName(), TABLEMAPPING_MEDIATORSERVER_FORMAT));
+        map.put(ComponentName.REQUIRED_NETWORKELEMENT,
+                new MariaDBTableInfo(Entity.NetworkelementConnection.getName(), TABLEMAPPING_NETWORKELEMENT_FORMAT));
+        map.put(ComponentName.USERDATA, new MariaDBTableInfo(Entity.Userdata.getName(), TABLEMAPPING_USERDATA_FORMAT));
+        return map;
     }
 
     private static Map<ComponentName, DatabaseInfo> createDBMap() {
-        Map<ComponentName, DatabaseInfo> map= HonoluluReleaseInformation.createDBMap();
+        Map<ComponentName, DatabaseInfo> map = HonoluluReleaseInformation.createDBMap();
         map.put(ComponentName.USERDATA, new DatabaseInfo7("userdata", "userdata", "{}"));
+        map.put(ComponentName.REQUIRED_NETWORKELEMENT, new DatabaseInfo7("networkelement-connection",
+                "networkelement-connection",
+                "{\"node-id\": {\"type\": \"keyword\"},\"host\": {\"type\": \"keyword\"},\"port\": "
+                        + "{\"type\": \"long\"},\"username\": {\"type\": \"keyword\"},\"password\": {\"type\": \"keyword\"},"
+                        + "\"core-model-capability\": {\"type\": \"keyword\"},\"device-type\": {\"type\": \"keyword\"},"
+                        + "\"device-function\": {\"type\": \"keyword\"},\"is-required\": {\"type\": \"boolean\"},"
+                        + "\"status\": {\"type\": \"keyword\"},\"tls-key\": {\"type\": \"keyword\"},"
+                        + "\"mount-method\": {\"type\":\"keyword\"}}"));
         return map;
     }
 
@@ -60,18 +181,24 @@ public class IstanbulReleaseInformation extends ReleaseInformation {
     }
 
     @Override
-    protected boolean runPreInitCommands(HtDatabaseClient dbClient) {
-        ClusterSettingsResponse response = null;
-        try {
-            response = dbClient.setupClusterSettings(new ClusterSettingsRequest(false).maxCompilationsPerMinute(400));
-        } catch (IOException e) {
-            LOG.warn("problem setting up cluster: {}", e);
-        }
-        return response == null ? false : response.isAcknowledged();
+    public boolean runPreInitCommands(HtDatabaseClient dbClient) {
+        return true;
+    }
+
+    @Override
+    public boolean runPostInitCommands(HtDatabaseClient dbClient) {
+        return true;
+    }
+
+    @Override
+    public boolean runPreInitCommands(SqlDBClient dbClient) {
+        boolean success = dbClient.createTable(
+                String.format(TABLENAME_CONTROLLER_FORMAT, this.getReleas().getDBSuffix()), TABLEMAPPING_CONTROLLER);
+        return success;
     }
 
     @Override
-    protected boolean runPostInitCommands(HtDatabaseClient dbClient) {
+    public boolean runPostInitCommands(SqlDBClient dbClient) {
         return true;
     }
 
diff --git a/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/MariaDBTestBase.java b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/MariaDBTestBase.java
new file mode 100644 (file)
index 0000000..264f120
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * ============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.setup;
+
+import static org.junit.Assert.fail;
+import java.io.File;
+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<String, String> envDefaultValues = initEnvDefaultValues();
+    private static final String SDNRDBDATABASETEST="test";
+    private static final String TESTPROPFILE = "test.properties";
+
+    public MariaDBTestBase() throws ManagedProcessException {
+        this(new Random().nextInt(1000) + 50000);
+    }
+    private static String dbUrl(String host, int port, String dbName) {
+        return String.format("jdbc:mysql://%s:%d/%s", host,port,dbName);
+    }
+    private static Map<String, String> initEnvDefaultValues() {
+        Map<String, String> defaults = new HashMap<>();
+        defaults.put("SDNRDBURL", dbUrl("localhost",3306,SDNRDBDATABASETEST));
+        defaults.put("SDNRDBDATABASE", "test");
+
+        return defaults;
+    }
+    public MariaDBTestBase(String host, int port) {
+        this(host, port, SDNRDBDATABASETEST );
+    }
+    public MariaDBTestBase(String host, int port, String dbName) {
+        EnvGetter env = Section.getEnvGetter();
+        envDefaultValues.put("SDNRDBURL", dbUrl(host,port,dbName));
+        envDefaultValues.put("SDNRDBUSERNAME", "sdnrdb");
+        envDefaultValues.put("SDNRDBPASSWORD", "sdnrdb");
+        Section.setEnvGetter((envname) -> {
+            return envDefaultValues.getOrDefault(envname, env.getenv(envname));
+        });
+        SqlDBConfig config = new SqlDBConfig(new ConfigurationFileRepresentation(TESTPROPFILE));
+        config.setControllerId("test123");
+        this.db = null;
+        this.dbProvider = new SqlDBDataProvider(config, false);
+        //testCreateTable(this.dbProvider.getDBService());
+    }
+
+    public MariaDBTestBase(int port) throws ManagedProcessException {
+        EnvGetter env = Section.getEnvGetter();
+        envDefaultValues.put("SDNRDBURL",dbUrl("localhost",port,SDNRDBDATABASETEST));
+        Section.setEnvGetter((envname) -> {
+            return envDefaultValues.getOrDefault(envname, env.getenv(envname));
+        });
+        SqlDBConfig config = new SqlDBConfig(new ConfigurationFileRepresentation(TESTPROPFILE));
+        //start db server
+        this.db = startDatabase(port);
+        //create db with name sdnrdb
+        this.dbProvider = new SqlDBDataProvider(config, false);
+        //testCreateTable(this.dbProvider.getDBService());
+    }
+
+    public void close() throws ManagedProcessException {
+        if (db != null) {
+            this.db.stop();
+        }
+        File f = new File(TESTPROPFILE);
+        if(f.exists()) {
+            f.delete();
+        }
+    }
+
+    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;
+    }
+    public String getDBUrl() {
+        return envDefaultValues.get("SDNRDBURL");
+    }
+    public String getDBUsername() {
+        return envDefaultValues.getOrDefault("SDNRDBUSERNAME","");
+    }
+    public String getDBPassword() {
+        return envDefaultValues.getOrDefault("SDNRDBPASSWORD","");
+    }
+}
diff --git a/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBIstanbul.java b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBIstanbul.java
new file mode 100644 (file)
index 0000000..072ce2f
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * ============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.setup;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.sql.SQLException;
+import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
+import ch.vorburger.exec.ManagedProcessException;
+
+public class TestMariaDBIstanbul {
+
+    private static final String MARIADB_USERNAME = "sdnrdb";
+    private static final String MARIADB_PASSWORD = "sdnrdb";
+    //    private static final String MARIADB_HOST = "10.20.11.159";
+    private static final String MARIADB_HOST = "sdnrdb";
+    private static final int MARIADB_PORT = 3306;
+    private static final String MARIADB_DATABASENAME = "sdnrdb";
+
+    private static SqlDBClient dbService;
+
+    private static MariaDBTestBase testBase;
+    private static SqlDBDataProvider dbProvider;
+
+    @BeforeClass
+    public static void init() throws Exception {
+
+        //testBase = new MariaDBTestBase(MARIADB_HOST,MARIADB_PORT, MARIADB_DATABASENAME);
+        testBase = new MariaDBTestBase();
+        dbProvider = testBase.getDbProvider();
+        dbProvider.waitForDatabaseReady(30, TimeUnit.SECONDS);
+    //    dbProvider.setControllerId();
+
+    }
+
+    @AfterClass
+    public static void close() {
+        try {
+            testBase.close();
+        } catch (ManagedProcessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreate() {
+        DataMigrationProviderImpl provider = null;
+        try {
+            provider = new DataMigrationProviderImpl(SdnrDbType.MARIADB, testBase.getDBUrl(), testBase.getDBUsername(),
+                    testBase.getDBPassword(), true, 30000);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+        boolean success = provider.initDatabase(Release.ISTANBUL_R1, 1, 1, "", false, 1000);
+        assertTrue("init database failed",success);
+        try {
+            dbProvider.setControllerId();
+        } catch (SQLException e) {
+            fail(e.getMessage());
+        }
+
+    }
+}
diff --git a/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBMapper.java b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBMapper.java
new file mode 100644 (file)
index 0000000..f39f9b0
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * ============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.setup;
+
+import static org.junit.Assert.fail;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.lang.reflect.InvocationTargetException;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+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.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.InsertQuery;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.SelectQuery;
+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.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.NetworkElementConnection;
+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.NetworkElementDeviceType;
+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 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.network.element.connection.entity.NodeDetails;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.network.element.connection.entity.NodeDetailsBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import ch.vorburger.exec.ManagedProcessException;
+
+public class TestMariaDBMapper {
+
+
+    private static final String MARIADB_USERNAME = "sdnrdb";
+    private static final String MARIADB_PASSWORD = "sdnrdb";
+    //    private static final String MARIADB_HOST = "10.20.11.159";
+    private static final String MARIADB_HOST = "sdnrdb";
+    private static final int MARIADB_PORT = 3306;
+    private static final String MARIADB_DATABASENAME = "sdnrdb";
+
+    //    private static DbLibService dbService;
+
+    private static MariaDBTestBase testBase;
+    private static SqlDBDataProvider dbProvider;
+
+    @BeforeClass
+    public static void init() throws Exception {
+
+        testBase = new MariaDBTestBase();
+        dbProvider = testBase.getDbProvider();
+        dbProvider.waitForDatabaseReady(30, TimeUnit.SECONDS);
+        //  dbProvider.setControllerId();
+
+    }
+
+    @AfterClass
+    public static void close() {
+        try {
+            testBase.close();
+        } catch (ManagedProcessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateSdnrDBTables() {
+        createTables(dbProvider.getDBService());
+    }
+
+    public static void createTables(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);
+    }
+
+    //@Test
+    public void testInsert() {
+        NetworkElementConnectionBuilder builder = new NetworkElementConnectionBuilder();
+        builder.setId("ROADM-A");
+        builder.setNodeId("ROADM-A");
+        builder.setCoreModelCapability("2017-03-12");
+        builder.setDeviceType(NetworkElementDeviceType.OROADM);
+        builder.setHost("10.20.30.40");
+        builder.setIsRequired(true);
+        NodeDetails nodeDetails = new NodeDetailsBuilder().setAvailableCapabilities(Arrays.asList(
+                "urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&also-supported=report-all,"
+                        + "report-all-tagged,trim,explicit",
+                "urn:ietf:params:netconf:capability:validate:1.1", "urn:ietf:params:netconf:capability:url:1.0"))
+                .build();
+        builder.setNodeDetails(nodeDetails);
+        builder.setPassword("password");
+        builder.setPort(Uint32.valueOf(50000));
+        builder.setStatus(ConnectionLogStatus.Connected);
+        builder.setUsername("admin");
+        try {
+            writeEntry(builder.build(), Entity.NetworkelementConnection);
+        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | JsonProcessingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    //@Test
+    public void testRead() {
+        List<NetworkElementConnection> con =
+                readEntry(Entity.NetworkelementConnection, NetworkElementConnection.class, "ROADM-A");
+        System.out.println(con);
+    }
+
+    private <T extends DataObject> List<T> readEntry(Entity entity, Class<T> clazz, String id) {
+        final SelectQuery selectStatement = new SelectQuery(entity.getName());
+        System.out.println(selectStatement);
+        try {
+            return SqlDBMapper.read(dbProvider.getDBService().read(selectStatement.toSql()), clazz);
+
+        } catch (SQLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+                | InstantiationException | SecurityException | NoSuchMethodException | JsonProcessingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+
+        }
+        return null;
+    }
+
+    private <T extends DataObject> boolean writeEntry(T data, Entity entity) throws IllegalAccessException,
+            IllegalArgumentException, InvocationTargetException, JsonProcessingException {
+
+        final InsertQuery<T> insertStatement = new InsertQuery<T>(entity, data, dbProvider.getControllerId());
+        System.out.println(insertStatement);
+        try {
+            return dbProvider.getDBService().write(insertStatement.toSql());
+
+        } catch (SQLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+
+        }
+
+        return false;
+    }
+
+    private 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;
+    }
+
+    private 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;
+    }
+
+    private static Properties getConfig() {
+        Properties config = new Properties();
+        config.setProperty("org.onap.ccsdk.sli.dbtype", "jdbc");
+        config.setProperty("org.onap.ccsdk.sli.jdbc.hosts", MARIADB_HOST);
+        config.setProperty("org.onap.ccsdk.sli.jdbc.url",
+                String.format("jdbc:mysql://dbhost:%d/%s", MARIADB_PORT, MARIADB_DATABASENAME));
+        config.setProperty("org.onap.ccsdk.sli.jdbc.driver", "org.mariadb.jdbc.Driver");
+        config.setProperty("org.onap.ccsdk.sli.jdbc.database", MARIADB_DATABASENAME);
+        config.setProperty("org.onap.ccsdk.sli.jdbc.user", MARIADB_USERNAME);
+        config.setProperty("org.onap.ccsdk.sli.jdbc.password", MARIADB_PASSWORD);
+        return config;
+    }
+}
index 311582a..412c8b8 100644 (file)
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import org.junit.Test;
 import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.DataMigrationReport;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data.Release;
 
@@ -41,8 +42,9 @@ public class TestMigrationProvider {
 
     @Test
     public void testCreateImport() throws Exception {
-        DataMigrationProviderImpl provider = new DataMigrationProviderImpl(hosts, null, null, true, 5000);
-        DataMigrationReport report=null;
+        DataMigrationProviderImpl provider =
+                new DataMigrationProviderImpl(SdnrDbType.ELASTICSEARCH, hosts[0].toUrl(), null, null, true, 5000);
+        DataMigrationReport report = null;
         try {
 
 
index 0b69830..ed452cb 100644 (file)
@@ -188,8 +188,6 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa
 
         LOG.info("Session Initiated start {}", APPLICATION_NAME);
 
-        this.iEntityDataProvider.setReadyStatus(false);
-
         this.dataProvider = iEntityDataProvider.getDataProvider();
 
         // Get configuration
@@ -255,8 +253,6 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa
         this.devicemanagerInitializationOk = true;
 
         LOG.info("Session Initiated end. Initialization done {}", devicemanagerInitializationOk);
-        this.iEntityDataProvider.setReadyStatus(true);
-
     }
 
     @Override
index ed7f56f..06b8259 100644 (file)
@@ -93,7 +93,6 @@ public class TestDevicemanager extends Mockito {
         WebsocketManagerService websocketmanagerService = mock(WebsocketManagerService.class);
 
         IEntityDataProvider iEntityDataProvider = mock(IEntityDataProvider.class);
-        doNothing().when(iEntityDataProvider).setReadyStatus(isA(Boolean.class));
 
         DataProvider dataProvider = mock(DataProvider.class);
         when(iEntityDataProvider.getDataProvider()).thenReturn(dataProvider);