summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKAPIL SINGAL <ks220y@att.com>2021-07-30 01:55:03 +0000
committerGerrit Code Review <gerrit@onap.org>2021-07-30 01:55:03 +0000
commite4f3ee3ce9264c6ca41928e49c3075d4ca99eb0f (patch)
tree29a4875163cfec0b0aff3e2c6071a6f286340c6c
parent4d2a4e187187e726e99fa85e32bfbe101567a83f (diff)
parent016536791b95df23811dabd063010f0561526163 (diff)
Merge "Support for MariaDB"
-rwxr-xr-xsdnr/wt/common-yang/openroadm-pm-types/pom.xml12
-rw-r--r--sdnr/wt/common-yang/utils/pom.xml5
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java17
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java12
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java2
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java8
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java6
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java4
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DatabaseVersion.java (renamed from sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsVersion.java)18
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java16
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java13
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java8
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java6
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java17
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java10
-rw-r--r--sdnr/wt/data-provider/dblib/pom.xml133
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/DatabaseDataProvider.java132
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBClient.java264
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBConfig.java112
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerImpl.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java)2
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBDataProvider.java509
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBIndicesEntry.java33
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/DatabaseIdGenerator.java104
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/FaultEntityManager.java65
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseEventsService.java269
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseMaintenanceService.java126
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/QueryResult.java60
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/SqlDBQueryByFilter.java373
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBMapper.java536
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriter.java246
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterFault.java43
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterPm.java133
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBStatusReader.java132
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/CountQuery.java82
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/DeleteQuery.java44
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/InsertQuery.java111
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SelectQuery.java166
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SqlQuery.java351
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpdateQuery.java111
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpsertQuery.java56
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBFilterKeyValuePair.java31
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBKeyValuePair.java64
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RangeSqlDBFilter.java51
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RegexSqlDBFilter.java35
-rw-r--r--sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/SqlDBFilter.java28
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestCRUDMariaDB.java236
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestMariaDataProvider.java563
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestQuerySyntax.java157
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/util/MariaDBTestBase.java192
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/resources/inventory.json381
-rw-r--r--sdnr/wt/data-provider/dblib/src/test/resources/pmdata15m.json532
-rw-r--r--sdnr/wt/data-provider/feature/pom.xml4
-rwxr-xr-xsdnr/wt/data-provider/installer/pom.xml4
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java6
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java14
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtDatabaseMediatorserver.java30
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java3
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java3
-rw-r--r--sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/SdnrDbType.java26
-rw-r--r--sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang44
-rwxr-xr-xsdnr/wt/data-provider/pom.xml1
-rw-r--r--sdnr/wt/data-provider/provider/pom.xml29
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java76
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java)11
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java)12
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java)16
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java)19
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java103
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java)7
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java)2
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java)60
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java)4
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java)19
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java)4
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java)2
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java)125
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java150
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java13
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java15
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java140
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java120
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java22
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java7
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java25
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java74
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java13
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java58
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java34
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java (renamed from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java)35
-rw-r--r--sdnr/wt/data-provider/provider/src/main/resources/about/README.json16
-rw-r--r--sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml18
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java7
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java21
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java4
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java1
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java9
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java5
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java9
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java5
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java2
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java169
-rw-r--r--sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json40
-rw-r--r--sdnr/wt/data-provider/setup/pom.xml21
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java408
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java13
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java31
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java39
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/MariaDBTableInfo.java42
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java65
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java8
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/ElasticsearchDataMigrationProvider.java465
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/MariaDbDataMigrationProvider.java433
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java18
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java22
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java19
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java15
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java15
-rw-r--r--sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java161
-rw-r--r--sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/MariaDBTestBase.java187
-rw-r--r--sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBIstanbul.java90
-rw-r--r--sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBMapper.java228
-rw-r--r--sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java6
-rw-r--r--sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java4
-rw-r--r--sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java1
130 files changed, 9525 insertions, 1055 deletions
diff --git a/sdnr/wt/common-yang/openroadm-pm-types/pom.xml b/sdnr/wt/common-yang/openroadm-pm-types/pom.xml
index aa8ebd306..046703945 100755
--- a/sdnr/wt/common-yang/openroadm-pm-types/pom.xml
+++ b/sdnr/wt/common-yang/openroadm-pm-types/pom.xml
@@ -39,10 +39,10 @@
<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>
diff --git a/sdnr/wt/common-yang/utils/pom.xml b/sdnr/wt/common-yang/utils/pom.xml
index ef3c22b4c..2fa1021db 100644
--- a/sdnr/wt/common-yang/utils/pom.xml
+++ b/sdnr/wt/common-yang/utils/pom.xml
@@ -69,6 +69,11 @@
<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>
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
index 3086167bf..c50e3210e 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
@@ -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));
+ }
}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
index 46c966076..7dde2ef7f 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
@@ -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)));
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
index c12d17e74..58e75bde5 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
@@ -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(),
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
index 96bfa070b..54a5172a3 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
@@ -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
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
index 1f67e5ef8..8b2dbb004 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
@@ -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();
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
index 232b68c73..e4b8893c5 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
@@ -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);
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java
index d55e66d2e..118cf0282 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/AliasesEntry.java
@@ -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) {
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsVersion.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DatabaseVersion.java
index e1fd02de0..e37b9d924 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsVersion.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DatabaseVersion.java
@@ -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) {
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
index b31ff4389..cc7fafb76 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
@@ -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) {
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
index 519502efd..265c6f529 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
@@ -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;
+ }
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java
index 946a8fb4a..79172e01c 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetInfoResponse.java
@@ -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;
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
index c19cea08d..2e0701257 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
@@ -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);
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
index ffb31c676..de878a5d5 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
@@ -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());
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java
index 883d48ac1..c2471f58e 100644
--- a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestEsData.java
@@ -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
index 000000000..c4c3d8695
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/pom.xml
@@ -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
index 000000000..9d4beb71b
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/DatabaseDataProvider.java
@@ -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
index 000000000..f16eadd01
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBClient.java
@@ -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
index 000000000..8c7e7b1cb
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/SqlDBConfig.java
@@ -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/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerImpl.java
index 73cc1a212..9dd1adb50 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerImpl.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data;
import java.io.File;
import java.io.IOException;
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
index 000000000..94c7dcfc6
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBDataProvider.java
@@ -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
index 000000000..fdea87c8b
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/SqlDBIndicesEntry.java
@@ -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
index 000000000..5a9e58cef
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/DatabaseIdGenerator.java
@@ -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
index 000000000..8371b9c2b
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/FaultEntityManager.java
@@ -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
index 000000000..84786b0cd
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseEventsService.java
@@ -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
index 000000000..dbbb89c47
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/entity/HtDatabaseMaintenanceService.java
@@ -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
index 000000000..ca90e84fb
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/QueryResult.java
@@ -0,0 +1,60 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.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
index 000000000..4354b1647
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/rpctypehelper/SqlDBQueryByFilter.java
@@ -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
index 000000000..85d3cfe4b
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBMapper.java
@@ -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
index 000000000..d033e45f7
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriter.java
@@ -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
index 000000000..2d4e26eea
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterFault.java
@@ -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
index 000000000..f0ce268db
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBReaderWriterPm.java
@@ -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
index 000000000..c98ba388d
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/database/SqlDBStatusReader.java
@@ -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
index 000000000..c499fefb8
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/CountQuery.java
@@ -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
index 000000000..f49c78a29
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/DeleteQuery.java
@@ -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
index 000000000..108888ad0
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/InsertQuery.java
@@ -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
index 000000000..800150814
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SelectQuery.java
@@ -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
index 000000000..95e360540
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/SqlQuery.java
@@ -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
index 000000000..b47b03042
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpdateQuery.java
@@ -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
index 000000000..e6f1e13cb
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/UpsertQuery.java
@@ -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
index 000000000..930f16af6
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBFilterKeyValuePair.java
@@ -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
index 000000000..2474e5227
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/DBKeyValuePair.java
@@ -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
index 000000000..c4a5d8abc
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RangeSqlDBFilter.java
@@ -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
index 000000000..4ef1b9a55
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/RegexSqlDBFilter.java
@@ -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
index 000000000..2997c7040
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/query/filters/SqlDBFilter.java
@@ -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
index 000000000..ad4ab6789
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestCRUDMariaDB.java
@@ -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
index 000000000..da7450089
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestMariaDataProvider.java
@@ -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
index 000000000..758b72f9c
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/TestQuerySyntax.java
@@ -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
index 000000000..b065519f8
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/dblib/test/util/MariaDBTestBase.java
@@ -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
index 000000000..9a29325dc
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/resources/inventory.json
@@ -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
index 000000000..88dd87f55
--- /dev/null
+++ b/sdnr/wt/data-provider/dblib/src/test/resources/pmdata15m.json
@@ -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
diff --git a/sdnr/wt/data-provider/feature/pom.xml b/sdnr/wt/data-provider/feature/pom.xml
index 16d55c997..2ac56666d 100644
--- a/sdnr/wt/data-provider/feature/pom.xml
+++ b/sdnr/wt/data-provider/feature/pom.xml
@@ -42,6 +42,10 @@
<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>
<version>${project.version}</version>
diff --git a/sdnr/wt/data-provider/installer/pom.xml b/sdnr/wt/data-provider/installer/pom.xml
index 4eda82cde..1e5a191a8 100755
--- a/sdnr/wt/data-provider/installer/pom.xml
+++ b/sdnr/wt/data-provider/installer/pom.xml
@@ -69,6 +69,10 @@
<artifactId>${application.name}-setup</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>com.highstreet-technologies.opendaylight</groupId>
+ <artifactId>odl-ready</artifactId>
+ </dependency>
</dependencies>
<build>
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java
index 2af7324e5..15c857c62 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/ArchiveCleanProvider.java
@@ -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);
}
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
index 0de5dc246..128138ee3 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
@@ -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;
@@ -81,6 +80,13 @@ public interface DataProvider extends ArchiveCleanProvider {
/**
*
+ * @param nodeName
+ * @return number of entries
+ */
+ public int clearGuiCutThroughEntriesOfNode(String nodeName);
+
+ /**
+ *
* @param networkElementConnectionEntitiy to wirte to DB
* @param nodeId Id for this DB element
* @return if succeeded
@@ -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
index 000000000..2fc62da01
--- /dev/null
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtDatabaseMediatorserver.java
@@ -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();
+}
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
index 2a91d7816..04239f4c4 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
@@ -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);
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java
index 0f8f5e37d..18e07f148 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEsConfig.java
@@ -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
index 000000000..80efe6fb3
--- /dev/null
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/SdnrDbType.java
@@ -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
+}
diff --git a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
index 84c43d52b..31c7fd875 100644
--- a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
+++ b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
@@ -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).";
diff --git a/sdnr/wt/data-provider/pom.xml b/sdnr/wt/data-provider/pom.xml
index 71c745144..786cec714 100755
--- a/sdnr/wt/data-provider/pom.xml
+++ b/sdnr/wt/data-provider/pom.xml
@@ -43,6 +43,7 @@
<modules>
<module>setup</module>
<module>model</module>
+ <module>dblib</module>
<module>provider</module>
<module>feature</module>
<module>installer</module>
diff --git a/sdnr/wt/data-provider/provider/pom.xml b/sdnr/wt/data-provider/provider/pom.xml
index 55a770564..f0da429ac 100644
--- a/sdnr/wt/data-provider/provider/pom.xml
+++ b/sdnr/wt/data-provider/provider/pom.xml
@@ -84,6 +84,11 @@
<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>
</dependency>
@@ -105,11 +110,6 @@
<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>
@@ -135,6 +135,13 @@
<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>
@@ -204,6 +211,18 @@
</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
index efb52213d..000000000
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorStatus.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * ONAP : ccsdk features
- * ================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
- * All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- *
- */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor;
-
-import java.io.IOException;
-import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient;
-import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
-import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
-import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
-import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
-import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryResult;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.DataBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.FaultsBuilder;
-
-public class DataObjectAcessorStatus extends DataObjectAcessor<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());
- }
-
-
-}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java
index 44751ffd0..c428b67d3 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/EsConfig.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsConfig.java
@@ -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);
+ }
+
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java
index 153022b4c..a86ecdde1 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/EsDataObjectReaderWriter2.java
@@ -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) {
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java
index 0cd327bfc..ec467eab1 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessor.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessor.java
@@ -19,14 +19,14 @@
* ============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);
}
-
-
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java
index 9280a0602..04849004f 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorPm.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorPm.java
@@ -19,18 +19,17 @@
* ============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
index 000000000..5811550e6
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorStatus.java
@@ -0,0 +1,103 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor;
+
+import java.io.IOException;
+import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryResult;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionLogStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.Data;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.status.output.DataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.FaultsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.status.entity.NetworkElementConnectionsBuilder;
+import org.opendaylight.yangtools.yang.common.Uint32;
+
+public class DataObjectAcessorStatus extends DataObjectAcessor<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());
+ }
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java
index a977890c9..da2b4b151 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/acessor/DataObjectAcessorWithId.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/acessor/DataObjectAcessorWithId.java
@@ -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());
}
-
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java
index f1a43359c..36ab39845 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/FaultEntityManager.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/FaultEntityManager.java
@@ -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.regex.Matcher;
import java.util.regex.Pattern;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java
index b23d882c8..41e94e3f6 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseEventsService.java
@@ -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;
+ }
+
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java
index 380526d9a..c6161b54c 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseMaintenanceService.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/entity/HtDatabaseMaintenanceService.java
@@ -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;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java
index 627d125ae..eef61e09c 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilter.java
@@ -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;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java
index b76e0a872..4e4c1a9c8 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilterStatic.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryByFilterStatic.java
@@ -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;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java
index 6e653baf2..d4cf0eb53 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryResult.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/data/rpctypehelper/QueryResult.java
@@ -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.math.BigInteger;
import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java
index 0a966aef6..53b21e0ed 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/ElasticSearchDataProvider.java
@@ -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");
@@ -19,21 +19,26 @@
* ============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
index 000000000..9dbdb136a
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/elasticsearch/impl/HtUserdataManagerImpl.java
@@ -0,0 +1,150 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HtUserdataManagerImpl implements HtUserdataManager {
+
+ private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerImpl.class);
+
+ private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json";
+ private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults();
+
+ private static JSONObject loadDefaults() {
+ File f = new File(USERDATA_DEFAULTS_FILENAME);
+ String content;
+ JSONObject o = null;
+ if (f.exists()) {
+ try {
+ content = Files.readString(f.toPath());
+ o = new JSONObject(content);
+ } catch (IOException e) {
+ LOG.warn("problem loading defaults: ", e);
+ } catch (JSONException e) {
+ LOG.warn("problem parsing defaults: ", e);
+ }
+ }
+ return o;
+ }
+
+
+ private final HtDatabaseClient dbClient;
+
+ public HtUserdataManagerImpl(HtDatabaseClient rawClient) {
+ this.dbClient = rawClient;
+ }
+
+ @Override
+ public String getUserdata(String username) {
+ SearchResult<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;
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
index 91d469700..05e6d2f13 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
@@ -91,15 +91,6 @@ public class DataTreeChildObject {
}
}
} else {
- // if(this.children!=null) {
- // for(DataTreeChildObject child:this.children.values()) {
- // itemValue=(String) child.getProperty(childKey, null);
- // if(itemValue!=null && itemValue.equals(itemValueToMatch)) {
- // child.children.put(id, data);
- // return true;
- // }
- // }
- // }
itemValue = this.getProperty(childKey, null);
if (itemValue != null && itemValue.equals(itemValueToMatch)) {
this.children.put(id, data);
@@ -157,8 +148,8 @@ public class DataTreeChildObject {
}
}
o.put("children", c);
- // o.put("ownSeverity", null);
- // o.put("childrenSeveritySummary", null);
+ //o.put("ownSeverity", null);
+ //o.put("childrenSeveritySummary", null);
return o;
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java
index 725256b17..103dec70d 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/MsServlet.java
@@ -25,9 +25,9 @@ import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.onap.ccsdk.features.sdnr.wt.common.http.BaseServlet;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.MediatorServerDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMediatorserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -102,8 +102,8 @@ public class MsServlet extends BaseServlet {
trustAll = trust;
}
- public void setDataProvider(MediatorServerDataProvider mediatorServerDataProvider) {
- entryProvider = mediatorServerDataProvider;
+ public void setDataProvider(HtDatabaseMediatorserver entryProvider2) {
+ entryProvider = new MediatorServerDataProvider(entryProvider2);
}
@Override
@@ -115,4 +115,11 @@ public class MsServlet extends BaseServlet {
protected boolean isCorsEnabled() {
return false;
}
+
+ public void triggerReloadSync() {
+ if(entryProvider!=null) {
+ entryProvider.triggerReloadSync();
+ }
+
+ }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java
deleted file mode 100644
index 284365021..000000000
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * ONAP : ccsdk features
- * ================================================================================
- * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
- * All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- *
- */
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.http;
-
-import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.karaf.bundle.core.BundleInfo;
-import org.apache.karaf.bundle.core.BundleService;
-import org.apache.karaf.bundle.core.BundleState;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.MarkdownTable;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ReadyHttpServlet extends HttpServlet {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final Logger LOG = LoggerFactory.getLogger(ReadyHttpServlet.class);
- private static boolean status;
-
-
- private BundleService bundleService = null;
-
- public void setBundleService(BundleService bundleService) {
- this.bundleService = bundleService;
- }
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- if (isReady() && this.getBundleStatesReady()) {
- resp.setStatus(HttpServletResponse.SC_OK);
- } else {
-
- try {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND);
- } catch (IOException | IllegalStateException e) {
- LOG.warn("unable to write out 404 res not found: {}", e);
- }
- }
- }
-
- private static boolean isReady() {
- return status;
- }
-
- public static void setStatus(boolean s) {
- status = s;
- LOG.info("status is set to ready: {}", status);
- }
-
- private boolean getBundleStatesReady() {
- Bundle thisbundle = FrameworkUtil.getBundle(this.getClass());
- BundleContext context = thisbundle ==null?null:thisbundle.getBundleContext();
- if (context == null) {
- LOG.debug("no bundle context available");
- return true;
- }
- Bundle[] bundles = context.getBundles();
- if (bundles == null || bundles.length <= 0) {
- LOG.debug("no bundles found");
- return true;
- }
- LOG.debug("found {} bundles", bundles.length);
- MarkdownTable table = new MarkdownTable();
- table.setHeader(new String[] {"Bundle-Id","Version","Symbolic-Name","Status"});
- int cntNotActive=0;
-
- for (Bundle bundle : bundles) {
- if(this.bundleService!=null) {
- BundleInfo info = this.bundleService.getInfo(bundle);
- if(info.getState()==BundleState.Active ) {
- continue;
- }
- if(info.getState()==BundleState.Resolved ) {
- if(!this.isBundleImportant(bundle.getSymbolicName())) {
- LOG.trace("ignore not important bundle {} with state {}",bundle.getSymbolicName(),info.getState());
- continue;
- }
- }
-
- LOG.trace("bundle {} is in state {}",bundle.getSymbolicName(),info.getState());
- }
- else {
- LOG.warn("bundle service is null");
- }
- cntNotActive++;
- }
-
- return cntNotActive==0;
- }
-
- private boolean isBundleImportant(String symbolicName) {
- symbolicName = symbolicName.toLowerCase();
- if(symbolicName.contains("mdsal")) {
- return true;
- }
- if(symbolicName.contains("netconf")) {
- return true;
- }
- if(symbolicName.contains("ccsdk")) {
- return true;
- }
- if(symbolicName.contains("devicemanager")) {
- return true;
- }
- if(symbolicName.contains("restconf")) {
- return true;
- }
-
- return false;
- }
-
-}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java
index 90b5fd9af..64b5fab9f 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/AboutHttpServlet.java
@@ -33,6 +33,7 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.http.HttpHeaders;
//import org.apache.karaf.bundle.core.BundleInfo;
//import org.apache.karaf.bundle.core.BundleService;
import org.onap.ccsdk.features.sdnr.wt.common.Resources;
@@ -71,22 +72,27 @@ public class AboutHttpServlet extends HttpServlet {
private static final String PLACEHOLDER_KARAF_INFO = "{karaf-info}";
private static final String PLACEHOLDER_DEVICEMANAGER_TABLE = "{devicemanagers}";
private static final String README_FILE = "README.md";
+ private static final String JSON_FILE = "README.json";
private static final String NO_DEVICEMANAGERS_RUNNING_MESSAGE = null;
+ private static final String MIMETYPE_JSON = "application/json";
+ private static final String MIMETYPE_MARKDOWN = "text/markdown";
private final String groupId = this.getGroupIdOrDefault("org.onap.ccsdk.features.sdnr.wt");
private final String artifactId = "sdnr-wt-data-provider-provider";
- private final Map<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);
}
@@ -249,29 +256,6 @@ public class AboutHttpServlet extends HttpServlet {
}
/**
- * 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
*
* @return
@@ -293,35 +277,35 @@ public class AboutHttpServlet extends HttpServlet {
return null;
}
- private String getDevicemanagerBundles() {
+ private String getDevicemanagerBundles(ContentType ctype) {
Bundle thisbundle = FrameworkUtil.getBundle(this.getClass());
- BundleContext context = thisbundle ==null?null:thisbundle.getBundleContext();
+ BundleContext context = thisbundle == null ? null : thisbundle.getBundleContext();
if (context == null) {
LOG.debug("no bundle context available");
- return "";
+ return ctype==ContentType.MARKDOWN?"":"[]";
}
Bundle[] bundles = context.getBundles();
if (bundles == null || bundles.length <= 0) {
LOG.debug("no bundles found");
- return NO_DEVICEMANAGERS_RUNNING_MESSAGE;
+ return ctype==ContentType.MARKDOWN?NO_DEVICEMANAGERS_RUNNING_MESSAGE:"[]";
}
LOG.debug("found {} bundles", bundles.length);
MarkdownTable table = new MarkdownTable();
- table.setHeader(new String[] {"Bundle-Id","Version","Symbolic-Name","Status"});
+ table.setHeader(new String[] {"Bundle-Id", "Version", "Symbolic-Name", "Status"});
String name;
for (Bundle bundle : bundles) {
name = bundle.getSymbolicName();
- if(!(name.contains("devicemanager") && name.contains("provider"))) {
+ if (!(name.contains("devicemanager") && name.contains("provider"))) {
continue;
}
- if(name.equals("org.onap.ccsdk.features.sdnr.wt.sdnr-wt-devicemanager-core-provider")) {
+ if (name.equals("org.onap.ccsdk.features.sdnr.wt.sdnr-wt-devicemanager-provider")) {
continue;
}
table.addRow(new String[] {String.valueOf(bundle.getBundleId()), bundle.getVersion().toString(), name,
- BUNDLESTATE_LUT.getOrDefault(bundle.getState(),"unknown")});
+ BUNDLESTATE_LUT.getOrDefault(bundle.getState(), "unknown")});
}
- return table.toMarkDown();
+ return ctype==ContentType.MARKDOWN?table.toMarkDown():table.toJson();
}
/**
@@ -382,10 +366,12 @@ public class AboutHttpServlet extends HttpServlet {
/**
* render this.readmeContent with this.data
*
+ * @param ctype
+ *
* @return
*/
- private String render() {
- return this.render(null);
+ private String render(ContentType ctype) {
+ return this.render(ctype, null);
}
/**
@@ -394,9 +380,9 @@ public class AboutHttpServlet extends HttpServlet {
* @param content
* @return
*/
- private String render(String content) {
+ private String render(ContentType ctype, String content) {
if (content == null) {
- content = this.readmeContent;
+ content = ctype==ContentType.MARKDOWN? this.readmeContent:this.jsonContent;
}
if (content == null) {
return null;
@@ -413,4 +399,30 @@ public class AboutHttpServlet extends HttpServlet {
public void setClusterSize(String value) {
this.data.put(PLACEHOLDER_CLUSTER_SIZE, value);
}
+
+ private ContentType detectContentType(HttpServletRequest req, ContentType def) {
+ String accept = req.getHeader(HttpHeaders.ACCEPT);
+ if (accept != null) {
+ if (accept.equals(MIMETYPE_JSON)) {
+ return ContentType.JSON;
+ } else if (accept.equals(MIMETYPE_MARKDOWN)) {
+ return ContentType.MARKDOWN;
+ }
+ }
+ return def;
+ }
+
+ private enum ContentType {
+ MARKDOWN(MIMETYPE_MARKDOWN), JSON(MIMETYPE_JSON);
+
+ private String mimeType;
+
+ ContentType(String mimeType) {
+ this.mimeType = mimeType;
+ }
+
+ String getMimeType() {
+ return this.mimeType;
+ }
+ }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java
index ac9cb44fe..1580a0fe3 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/MarkdownTable.java
@@ -23,6 +23,8 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about;
import java.util.ArrayList;
import java.util.List;
+import org.json.JSONArray;
+import org.json.JSONObject;
/**
* @author Michael Dürre
@@ -48,7 +50,7 @@ public class MarkdownTable {
public String toMarkDown() {
StringBuilder sb = new StringBuilder();
final int cols =
- this.columns != null ? this.columns.length : !this.rows.isEmpty() ? this.rows.get(0).length : 0;
+ this.columns != null ? this.columns.length : this.rows.size() > 0 ? this.rows.get(0).length : 0;
if (cols > 0) {
sb.append("|");
for (int i = 0; i < cols; i++) {
@@ -67,9 +69,23 @@ public class MarkdownTable {
}
sb.append("\n");
}
-
-
}
return sb.toString();
}
+
+ public String toJson() {
+ JSONArray a = new JSONArray();
+ final int cols =
+ this.columns != null ? this.columns.length : this.rows.size() > 0 ? this.rows.get(0).length : 0;
+ if (cols > 0) {
+ for (String[] row : this.rows) {
+ JSONObject o = new JSONObject();
+ for (int i = 0; i < cols; i++) {
+ o.put(this.columns[i], row[i]);
+ }
+ a.put(o);
+ }
+ }
+ return a.toString();
+ }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java
index 491775eb0..0e43cd251 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/about/ODLVersionLUT.java
@@ -32,6 +32,9 @@ public class ODLVersionLUT {
if (onapCCSDKVersion == null) {
return def;
}
+ if (onapCCSDKVersion.startsWith("2.2.")) {
+ return "ONAP Istanbul";
+ }
if (onapCCSDKVersion.startsWith("2.1.")) {
return "ONAP Honolulu";
}
@@ -60,6 +63,10 @@ public class ODLVersionLUT {
}
if(odlMdsalVersionLUT==null) {
odlMdsalVersionLUT = new HashMap<>();
+ odlMdsalVersionLUT.put("7.0.7","silicon-SR1 (0.14.1)");
+ odlMdsalVersionLUT.put("7.0.6","silicon-SR0 (0.14.0)");
+ odlMdsalVersionLUT.put("6.0.8","aluminium-SR3 (0.13.3)");
+ //odlMdsalVersionLUT.put("6.0.7","aluminium-SR2 (0.13.2)");
odlMdsalVersionLUT.put("6.0.7","aluminium-SR1 (0.13.1)");
odlMdsalVersionLUT.put("6.0.4","aluminium-SR0 (0.13.0)");
odlMdsalVersionLUT.put("5.0.14","magnesium-SR2 (0.12.2)");
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java
index 0d46ad098..c6758e240 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/yangschema/YangFileProvider.java
@@ -33,10 +33,8 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,22 +69,21 @@ public class YangFileProvider {
}
private List<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
index 000000000..5e8dc92fc
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderConfig.java
@@ -0,0 +1,74 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
+
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+
+public class DataProviderConfig implements Configuration {
+
+ private static final String PROPERTY_KEY_DBTYPE = "dbType";
+ private static final Object DEFAULT_DBTYPE = "${SDNRDBTYPE}";
+ private static final SdnrDbType DEFAULT_DBTYPE_VALUE = SdnrDbType.ELASTICSEARCH;
+ private final EsConfig esConfig;
+ private final SqlDBConfig maridadbConfig;
+ private ConfigurationFileRepresentation configuration;
+
+ public DataProviderConfig(ConfigurationFileRepresentation configuration) {
+ this.configuration = configuration;
+ defaults();
+ this.esConfig = new EsConfig(configuration);
+ this.maridadbConfig = new SqlDBConfig(configuration);
+ }
+
+ public EsConfig getEsConfig() {
+ return this.esConfig;
+ }
+
+ public SqlDBConfig getMariadbConfig() {
+ return this.maridadbConfig;
+ }
+
+ @Override
+ public void defaults() {
+
+ configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_DBTYPE, DEFAULT_DBTYPE);
+ }
+
+ @Override
+ public String getSectionName() {
+ return ConfigurationFileRepresentation.SECTIONNAME_ROOT;
+ }
+
+ public SdnrDbType getDbType() {
+ String value = this.configuration.getProperty(this.getSectionName(), PROPERTY_KEY_DBTYPE);
+ if (value.isEmpty()) {
+ return DEFAULT_DBTYPE_VALUE;
+ }
+ return SdnrDbType.valueOf(value);
+ }
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
index 190c78904..e06a1a9a2 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
@@ -25,7 +25,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClientException;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
@@ -36,6 +35,7 @@ import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.StatusChangedHandler.StatusKey;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.RpcProviderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,6 +52,7 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
private DataTreeHttpServlet treeServlet;
private UserdataHttpServlet userdataServlet;
private HtDatabaseClient dbClient;
+ private DataBroker dataBroker;
// Blueprint 1
public DataProviderImpl() {
@@ -77,12 +78,15 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
public void setUserdataServlet(UserdataHttpServlet userdataServlet) {
this.userdataServlet = userdataServlet;
}
+ public void setDataBroker(DataBroker dataBroker) {
+ this.dataBroker = dataBroker;
+ }
public void init() throws Exception {
LOG.info("Session Initiated start {}", APPLICATION_NAME);
try {
// Start RPC Service
- this.rpcApiService = new DataProviderServiceImpl(rpcProviderService, this.mediatorServerServlet);
+ this.rpcApiService = new DataProviderServiceImpl(rpcProviderService, this.mediatorServerServlet, this.dataBroker);
this.treeServlet.setDatabaseClient(this.rpcApiService.getRawClient());
this.userdataServlet.setDatabaseClient(this.rpcApiService.getHtDatabaseUserManager());
LOG.info("Session Initiated end. Initialization done");
@@ -137,11 +141,6 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
}
@Override
- public void setReadyStatus(boolean status) {
- ReadyHttpServlet.setStatus(status);
- }
-
- @Override
public void setStatus(StatusKey key, String value) {
if (this.aboutServlet != null) {
if (key == StatusKey.CLUSTER_SIZE) {
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
index 9e7fc18bc..ad712847f 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
@@ -25,19 +25,31 @@ import com.google.common.util.concurrent.ListenableFuture;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredential;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredentialKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput;
@@ -92,9 +104,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.concepts.ObjectRegistration;
import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -103,24 +118,30 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
private static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
+ private static final @NonNull InstanceIdentifier<Keystore> KEYSTORE_IIF = InstanceIdentifier.create(Keystore.class);
+ private static final long DEFAULT_PAGESIZE = 20;
+ private static final long DEFAULT_PAGE = 1;
private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
- private final ElasticSearchDataProvider dataProvider;
+ private final DatabaseDataProvider dataProvider;
private final ConfigurationFileRepresentation configuration;
- private final EsConfig esConfig;
- private final MediatorServerDataProvider mediatorServerDataProvider;
+ private final DataProviderConfig dbConfig;
private final HtUserdataManager dbUserManager;
-
- DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet)
- throws Exception {
+ private final DataBroker dataBroker;
+ private final MsServlet mediatorServerServlet;
+ public DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet,
+ DataBroker dataBroker) throws Exception {
this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
- this.esConfig = new EsConfig(configuration);
- this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(), esConfig.getBasicAuthUsername(),
- esConfig.getBasicAuthPassword(), esConfig.trustAllCerts());
+ this.dbConfig = new DataProviderConfig(configuration);
+ this.dataBroker = dataBroker;
+ this.mediatorServerServlet = mediatorServerServlet;
+ if (this.dbConfig.getDbType() == SdnrDbType.ELASTICSEARCH) {
+ this.dataProvider = new ElasticSearchDataProvider(this.dbConfig.getEsConfig());
+ } else {
+ this.dataProvider = new SqlDBDataProvider(this.dbConfig.getMariadbConfig());
+ }
this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),
- esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts());
- mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
+ mediatorServerServlet.setDataProvider(this.dataProvider.getHtDatabaseMediatorServer());
this.dbUserManager = new HtUserdataManagerImpl(this.dataProvider.getRawClient());
// Register ourselves as the REST API RPC implementation
LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
@@ -128,7 +149,7 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
}
private void sendResyncCallbackToApiGateway() {
- mediatorServerDataProvider.triggerReloadSync();
+ this.mediatorServerServlet.triggerReloadSync();
}
/**
@@ -153,7 +174,7 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
* @return configuration object
*/
public IEsConfig getEsConfig() {
- return esConfig;
+ return dbConfig.getEsConfig();
}
@@ -385,7 +406,6 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
read(() -> DataProviderServiceImpl.this.dataProvider.readGuiCutThroughEntry(input));
return result.buildFuture();
}
- // -- private classes and functions
private static String assembleExceptionMessage(Exception e) {
StringWriter sw = new StringWriter();
@@ -420,4 +440,6 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
return this.dbUserManager;
}
+
+
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
index b44906289..cb62e3326 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
@@ -70,12 +70,6 @@ public class DataTreeProviderImpl {
if (nodeId != null) {
bquery.must(QueryBuilders.matchQuery(nodeKey, nodeId));
}
- // if (parentKey != null && parentValue != null) {
- // bquery.must(QueryBuilders.matchQuery(parentKey, parentValue));
- // }
- // if (childKey != null && childValue != null) {
- // bquery.must(QueryBuilders.matchQuery(childKey, childValue));
- // }
query = bquery;
}
@@ -134,7 +128,7 @@ public class DataTreeProviderImpl {
public DataTreeObject readInventoryTree(List<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,
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java
index c4fe672cd..7ae7a7d40 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/MediatorServerDataProvider.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/MediatorServerDataProvider.java
@@ -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
index 000000000..f39a4c233
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/resources/about/README.json
@@ -0,0 +1,16 @@
+{
+ "version-info":{
+ "ONAP-release":"{release-name}",
+ "ONAP-release-version":"{release-version}",
+ "Opendaylight-release":"{odl-version}",
+ "ONAP-CCSDK-version":"{ccsdk-version}",
+ "Build-timestamp":"{build-time}",
+ "Yangtools-version":"{yangtools-version}",
+ "MD-SAL-version":"{mdsal-version}",
+ "SDN-R packages version":"{package-version} ({package-githash})",
+ "Cluster size":"{cluster-size}"
+ },
+ "device-managers":{devicemanagers},
+ "system-info":{}
+
+} \ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
index 686af61d6..d5f8a991a 100644
--- a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
+++ b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
@@ -28,23 +28,10 @@
<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"
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
index 48e512ad9..eb4ec3296 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
@@ -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);
}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
index 5a8c549d8..c407859d5 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
@@ -39,8 +39,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.BaseRequest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
@@ -125,7 +126,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
public class TestCRUDforDatabase {
- private static ElasticSearchDataProvider dbProvider;
+ private static DatabaseDataProvider dbProvider;
private static HtDatabaseClient dbRawProvider;
@BeforeClass
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java
index 9a96986c0..8c62ec9d5 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfig.java
@@ -31,7 +31,7 @@ import org.junit.Test;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.EsConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java
index d06486550..dd285754a 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestConfiguration.java
@@ -27,7 +27,7 @@ import org.junit.Test;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConfigurationException;
import org.onap.ccsdk.features.sdnr.wt.common.util.ResourceFileLoader;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.EsConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsConfig;
public class TestConfiguration {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
index b83034d90..dc5e049fd 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
@@ -37,8 +37,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity.HtDatabaseEventsService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.entity.HtDatabaseEventsService;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
@@ -70,7 +71,7 @@ import org.opendaylight.yangtools.yang.common.Uint32;
*
*/
public class TestEventService {
- private static ElasticSearchDataProvider dbProvider;
+ private static DatabaseDataProvider dbProvider;
private static HtDatabaseClient dbRawProvider;
private static HtDatabaseEventsService service = null;
@@ -154,7 +155,7 @@ public class TestEventService {
service.writeFaultLog(createFaultLog(NODEID2, OBJECTREFID2, "problem", SeverityType.Major, 1));
TestCRUDforDatabase.trySleep(100);
now = new Date();
- int numOlds = service.getNumberOfOldObjects(now);
+ long numOlds = service.getNumberOfOldObjects(now);
assertEquals(5, numOlds);
TestCRUDforDatabase.trySleep(100);
service.writeFaultLog(createFaultLog(NODEID, OBJECTREFID2, "problem", SeverityType.Major, 3));
@@ -205,11 +206,12 @@ public class TestEventService {
clearDbEntity(Entity.NetworkelementConnection);
List<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();
}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
index 68d367668..8a4e3e202 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
@@ -29,7 +29,7 @@ import java.util.List;
import org.junit.Test;
import org.mockito.Mockito;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder;
@@ -66,7 +66,7 @@ public class TestFilterConversion extends Mockito {
List<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
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
index 16dfa0ec6..3c983e7a7 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
@@ -81,7 +81,6 @@ public class TestImplementation {
}
impl.setStatus(StatusKey.CLUSTER_SIZE, "3");
- impl.setReadyStatus(true);
try {
impl.close();
} catch (Exception e) {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java
index ed8eac949..ce1bd78fa 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestInventoryConsistency.java
@@ -28,10 +28,10 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
@@ -39,16 +39,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
public class TestInventoryConsistency {
private static final String TEST1NODEID = "sim1";
- private static String resourceDirectoryPath = "/" + TestTree.class.getSimpleName() + "/";
- private static ElasticSearchDataProvider dbProvider;
- private static HtDatabaseClient dbRawProvider;
+ private static DatabaseDataProvider dbProvider;
@BeforeClass
public static void init() throws Exception {
HostInfo[] hosts = HostInfoForTest.get();
dbProvider = new ElasticSearchDataProvider(hosts);
dbProvider.waitForYellowDatabaseStatus(30, TimeUnit.SECONDS);
- dbRawProvider = HtDatabaseClient.getClient(hosts);
}
@Test
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java
index b9516b363..e85ed8cdd 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMaintenanceServiceData.java
@@ -33,7 +33,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
@@ -45,7 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
*/
public class TestMaintenanceServiceData {
- private static ElasticSearchDataProvider dbProvider;
+ private static DatabaseDataProvider dbProvider;
private static HtDatabaseClient dbRawProvider;
private static HtDatabaseMaintenance service = null;
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java
index 5b4bc3e0f..408f6a636 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestMediatorServerService.java
@@ -32,8 +32,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.MediatorServerDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutputBuilder;
@@ -43,7 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
* @author Michael Dürre
*/
public class TestMediatorServerService {
- private static ElasticSearchDataProvider dbProvider;
+ private static DatabaseDataProvider dbProvider;
private static HtDatabaseClient dbRawProvider;
private static MediatorServerDataProvider service = null;
@@ -54,7 +55,7 @@ public class TestMediatorServerService {
dbProvider = new ElasticSearchDataProvider(hosts);
dbProvider.waitForYellowDatabaseStatus(30, TimeUnit.SECONDS);
dbRawProvider = HtDatabaseClient.getClient(hosts);
- service = new MediatorServerDataProvider(hosts);
+ service = new MediatorServerDataProvider(dbProvider.getHtDatabaseMediatorServer());
}
@Test
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
index ad525b910..4a36262fd 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
@@ -30,7 +30,7 @@ import org.json.JSONObject;
import org.junit.Test;
import org.mockito.Mockito;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.rpctypehelper.QueryByFilter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper.QueryByFilter;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter;
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
index 28f7d49fe..29f35560e 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
@@ -35,7 +35,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet.EntityWithTree;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeObject;
@@ -46,7 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
public class TestTree {
private static String resourceDirectoryPath = "/" + TestTree.class.getSimpleName() + "/";
- private static ElasticSearchDataProvider dbProvider;
+ private static DatabaseDataProvider dbProvider;
private static HtDatabaseClient dbRawProvider;
@BeforeClass
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
index fd397840e..3fcbdb84c 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
public class TestUserdata {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
index 524659e99..611533ba1 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
@@ -37,7 +37,7 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.EsDataObjectReaderWriter2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper;
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java
new file mode 100644
index 000000000..276bcf4a1
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/util/MariaDBTestBase.java
@@ -0,0 +1,169 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util;
+
+import static org.junit.Assert.fail;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper.UnableToMapClassException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata15mEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata24hEntity;
+import ch.vorburger.exec.ManagedProcessException;
+import ch.vorburger.mariadb4j.DB;
+import ch.vorburger.mariadb4j.DBConfigurationBuilder;
+
+public class MariaDBTestBase {
+
+ private final SqlDBDataProvider dbProvider;
+ private final DB db;
+ private static final Map<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
index 000000000..30a4e0a45
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/tlskeys/keys1.json
@@ -0,0 +1,40 @@
+{
+ "key-credential": [
+ {
+ "key-id": "ODL_private_key_0",
+ "passphrase": "jKNzkicDKmVrpOehbo/Jtw==",
+ "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd"
+ },
+ {
+ "key-id": "ODL_private_key_1",
+ "passphrase": "jKNzkicDKmVrpOehbo/Jtw==",
+ "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd"
+ },
+ {
+ "key-id": "ODL_private_key_2",
+ "passphrase": "jKNzkicDKmVrpOehbo/Jtw==",
+ "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd"
+ },
+ {
+ "key-id": "ODL_private_key_3",
+ "passphrase": "jKNzkicDKmVrpOehbo/Jtw==",
+ "private-key": "o9CI/v3k6c39t4THCi25Zs+2QZ3UlPv2Nax2TZCEjfA0kxbiZvfukYA5CrAQi5edqf8ZLBulD/ojSOO+c/AhR52tV59idN4krBd3JXfVbkXI1osZz2lPYnUfgGuZN/iBGYBYlWDe8BuwejK8e/8mEFL36oeKB9PG/f2NJFrMFv0LSG8TTjVxRyU5QRN64MN3d/yju0OAUdCfnJDyLr7VvsH9cP0essQ4uXByWeZIUYUPqSMIdGqGlAJSgYvVPrlKtEJyVmNVo3hG697/oouty/38nz93Jhiet7OA0fXlcAm+9lCfMJwedq4P+AUbCvrLrcAx7h4EYY7eW0irSQxiFreg+hcVxzmKjNDT/GwIaUnkL7fu7Y8PKuhBMUuq8hHcf2EqT/0WStX/QecRhnIy/tkNwboml/kHuTN7mJAcUqZ1r5/mEdn6YYUp6bwRbS9HkakPmjMOR3XuWU5ttBxBhUYOVpkDxITOA4NZr8YUD33PHWq10asPwJEVL8doEysONQHLcFnVluUgovSEaUnH2HicZGF/3JIhs3B6pnU/b3znNesXf3tCjIb2fvfajZPQMPhycDjeulDAHR64/9+6YN4/KUTWEV7nwljAYPlYddm/SFNf1xNgCqAkO6qoVHwcGH8BKB2cR0Rm2H3nBMsIXUABQ2FI+2wlCsnWm/UV/+uDeSKa7uASpArNbnvJM8lkbJC/ZEBzKYAeidOj2md6VNNWetBKaM0XsgnYd3iyr8Rp2QeGxGQz9v8ZdlLrx0J34mE/jsPNbh+ZIFyfEK8BoAWtGxQll5ranoNaBYIGX14ZuZDH63DVraI0p0U6DfKV26lJJoyBLfmMg5mKw7ov/aC81MEhI0lNFtJwpvtSEXwbdgCas24x/q+NxIso3Skdp67hXqVVQXFyc0Trb4Ci7Xgu3kxa8E0thKuKTjfFyDj5o/5/W1ncsh+noXfWCG4ENGWb0PYHKT2XLPbcE8B007zKXv10qFYq4w+JPg6ZYMdIlf9c+bCBJBEiUSd8oYMjXbdiVLKAzStBMvsQQpIKmkyv+07JPVRe3JlFeLoQrysZosJjlblIAiTygRu8fr4rLZl3YhGGE9BUfabBKemtuqS5SwCv0S+XCBq50nt4BsXqafJ7pkijORp4WJ/WXnIbzwIBPFpa8w6YhJpOqVHp2xMahoaEvzCcVpIhhZqoAjXw7hKyOPNAOmv+QXnCpFHidRnxOBpMNwHHHbBLWgTzD4KP0LIldfx10Njrq+i1VR+nf9kxt868ZP6a6MiMXITiuvi5L+I9KJpWZUhSOKAJspiLcWDMp4fDQdDa42vOqOhB5SAntmJap/V+rJEe9G6PqiZBOx7tDr8Q4PI7uCm1o5rWrHkgp/TFJWdrEfVoEcmOccRCWkypWM9GzDkB0BXlJiXLMflqiT4JumgvbB2kxnX45KP0u3dOY4MKc0M3143YaglUXegTDgv6EjyNDUfKCEro8F/zLjsWjVyGKz2kjsj6ZY+MrNb48cZKVmhK8lUfQ+b+zbLWzX6Yc+NRfsYJl8YX9Pb2rY+XCQrTFHaTOgb5RZ4QPTqgaO5TIs9PBez/sH1+T3IiVUP2RSh9E5b3OZ2k/Xrud4xgbuOXVtZXgI1y8wEiPxm4sVS5wLirlRhELmhy1d4yQYNcMPBAhhegPqy1yUCW3A2GSCaZCZuwwf5Lqj6wH3R8WS8pnFa2j+WpbEsZlymnsm/04jlHca2LXJ+4wCpqACOUgKsYc6sV7QDC/T7XoMcfhua89E6S5iHXBDkqTqk0Iy+Wedf37q7H7NgOheBUk651nEZhqOVWQMc8sVJZDyCqQ9Pwgt4ZiMy8rZIDwIviKeHsRN84SPUbOhVBPfnE1Q+9JZcFMBihf0lX9AHebT5aj3XfMQOCp9VrStcMUEzJXdlKTfPuDmalFtg+QpyvQyDz2c15YbMYptLgDj4Bpi7Zsvkn3/b3SsH4HZTxfRF/DMa1rzBWJQHAjd2ATLMX9T/zbwNXP5WiQiEvPF2pyyXfKNbkv6jJ9I3bcTX0vzXIMdlG+m9EPeROwPd0Uc/dnXxuagdZTeS7jR3q5CFixoiOYBhKDSWRT+TstKiOUvwELoqGiIuMCWMjh6PGY2pihpHGcjl5c1KoyxmpBQuCDDUw9wVopv916fOOKkPjXFV665CJrXc644xd"
+ }
+ ],
+ "trusted-certificate": [
+ {
+ "name": "xNF_CA_certificate_0_0",
+ "certificate": "MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYD\nVQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEP\nMA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUg\nQ0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0\nMTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgM\nDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEM\nMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkB\nFhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTS\nL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12\nuOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCU\nbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3Q\naDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyW\ncm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZ\nsHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/\nIKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fT\nUhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKi\nh+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyV\nhBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D\n8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/\n9g=="
+ }
+ ],
+ "private-key": [
+ {
+ "name": "ODL_private_key_0",
+ "data": "MIIEpAIBAAKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68\nSfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt\n6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4\nVDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuH\nQwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UE\nFI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABAoIBAQCZN9kR8DGu6V7y\nt0Ax68asL8O5B/OKaHWKQ9LqpVrXmikZJOxkbzoGldow/CIFoU+q+Zbwu9aDa65a\n0wiP7Hoa4Py3q5XNNUrOQDyU/OYC7cI0I83WS0lJ2zOJGYj8wKae5Z81IeQFKGHK\n4lsy1OGPAvPRGh7RjUUgRavA2MCwe07rWRuDb/OJFe4Oh56UMEjwMiNBtMNtncog\nj1vr/qgRJdf9tf0zlJmLvUJ9+HSFFV9I/97LJyFhb95gAfHkjdVroLVgT3Cho+4P\nWtZaKCIGD0OwfOG2nLV4leXvRUk62/LMlB8NI9+JF7Xm+HCKbaWHNWC7mvWSLV58\nZl4AbUWRAoGBANyJ6SFHFRHSPDY026SsdMzXR0eUxBAK7G70oSBKKhY+O1j0ocLE\njI2krHJBhHbLlnvJVyMUaCUOTS5m0uDw9hgSsAqeSL3hL38kxVZw+KNG9Ouno1Fl\nKnE/xXHlPQyeGs/P8nAMzHZxQtEsQdQayJEhK2XXHTsy7Q3MxDisfVJ1AoGBANfD\n34gB+OMx6pwj7zk3qWbYXSX8xjCZMR0ciko+h4xeMP2N8B0oyoqC+v1ABMAtJ3wG\nsGZd0hV9gwM7OUM3SEwkn6oeg1GemWLcn4rlSmTnZc4aeVwrEWlnSNFX3s4g9l4u\nk8Ugu4MVJYqH8HuDQ5Ggl6/QAwPzMSEdCW0O+jOfAoGAIBRbegC5+t6m7Yegz4Ja\ndxV1g98K6f58x+MDsQu4tYWV4mmrQgaPH2dtwizvlMwmdpkh+LNWNtWuumowkJHc\nakIFo3XExQIFg6wYnGtQb4e5xrGa2xMpKlIJaXjb+YLiCYqJDG2ALFZrTrvuU2kV\n9a5qfqTc1qigvNolTM0iaaUCgYApmrZWhnLUdEKV2wP813PNxfioI4afxlpHD8LG\nsCn48gymR6E+Lihn7vuwq5B+8fYEH1ISWxLwW+RQUjIneNhy/jjfV8TgjyFqg7or\n0Sy4KjpiNI6kLBXOakELRNNMkeSPopGR2E7v5rr3bGD9oAD+aqX1G7oJH/KgPPYd\nVl7+ZwKBgQDcHyWYrimjyUgKaQD2GmoO9wdcJYQ59ke9K+OuGlp4ti5arsi7N1tP\nB4f09aeELM2ASIuk8Q/Mx0jQFnm8lzRFXdewgvdPoZW/7VufM9O7dGPOc41cm2Dh\nyrTcXx/VmUBb+/fnXVEgCv7gylp/wtdTGHQBQJHR81jFBz0lnLj+gg==",
+ "certificate-chain": [
+ "MIIECTCCAvGgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCQ1ox\nFjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoM\nBkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJ\nKoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MB4XDTE1MDczMDA3MjcxOFoX\nDTM1MDcyNTA3MjcxOFowgYUxCzAJBgNVBAYTAkNaMRYwFAYDVQQIDA1Tb3V0aCBN\nb3JhdmlhMQ8wDQYDVQQKDAZDRVNORVQxDDAKBgNVBAsMA1RNQzEXMBUGA1UEAwwO\nZXhhbXBsZSBjbGllbnQxJjAkBgkqhkiG9w0BCQEWF2V4YW1wbGVjbGllbnRAbG9j\nYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueCQaNQWoNmF\nK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68SfFNaY06zZl8QB9W02nr5kWeeMY0\nVA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt6jAWZDzVfopwpJPAzRPxACDftIqF\nGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4VDUHSNVbglc+u4UbEzNIFXMdEFsJ\nZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuHQwAHdubuB07ObM2z01UhyEdDvEYG\nHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UEFI1yTYw+xZ42HgFx3uGwApCImxhb\nj69GBYWFqwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu\nU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUXGpLeLnh2cSDARAV\nA7KrBxGYpo8wHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gwDQYJKoZI\nhvcNAQELBQADggEBAJPV3RTXFRtNyOU4rjPpYeBAIAFp2aqGc4t2J1c7oPp/1n+l\nZvjnwtlJpZHxMM783e2ryDQ6dkvXDf8kpwKlg3U3mkJ3xKkDdWrM4QwghXdCN519\naa9qmu0zdFL+jUAaWlQ5tsceOrvbusCcbMqiFGk/QfpHqPv52SVWbYyUx7IX7DE+\nUjgsLHycfV/tlcx4ZE6soTzl9VdgSL/zmzG3rjsr58J80rXckLgBhvijgBlIAJvW\nfC7D0vaouvBInSFXymdPVoUDZ30cdGLf+hI/i/TfsEMOinLrXVdkSGNo6FXAHKSv\nXeB9oFKSzhQ7OPyRyqvEPycUSw/qD6FVr80oDDc=",
+ "MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYD\nVQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEP\nMA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUg\nQ0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0\nMTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgM\nDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEM\nMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkB\nFhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTS\nL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12\nuOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCU\nbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3Q\naDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyW\ncm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZ\nsHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gw\nDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/\nIKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fT\nUhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKi\nh+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyV\nhBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D\n8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/\n9g==\n"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/sdnr/wt/data-provider/setup/pom.xml b/sdnr/wt/data-provider/setup/pom.xml
index d5a64a3e5..97b739c2c 100644
--- a/sdnr/wt/data-provider/setup/pom.xml
+++ b/sdnr/wt/data-provider/setup/pom.xml
@@ -58,6 +58,11 @@
<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>
</dependency>
@@ -76,9 +81,23 @@
</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>
@@ -133,7 +152,7 @@
</execution>
</executions>
<configuration>
- <appendAssemblyId>false</appendAssemblyId>
+ <appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.Program</mainClass>
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java
index 7d2adc5ad..466a3e290 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderImpl.java
@@ -21,127 +21,33 @@
*/
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);
}
-
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java
index 0f1fc6c73..53ab32636 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/DataMigrationProviderService.java
@@ -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);
+
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java
index 54204f170..56973f459 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/Program.java
@@ -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);
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java
index 8362b0030..6e5bdc522 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/ReleaseInformation.java
@@ -21,13 +21,17 @@
*/
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
index 000000000..956790942
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/MariaDBTableInfo.java
@@ -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);
+ }
+
+
+}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java
index 119479b97..22338e89a 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/Release.java
@@ -22,34 +22,51 @@
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);
+ }
}
}
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java
index 664dce677..58e8d2055 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/ReleaseGroup.java
@@ -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
index 000000000..3cfa8c17f
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/ElasticsearchDataMigrationProvider.java
@@ -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
index 000000000..d46fc4e2e
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/database/MariaDbDataMigrationProvider.java
@@ -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;
+ }
+
+}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java
index 739afaf0e..4165080b5 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/elalto/ElAltoReleaseInformation.java
@@ -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;
+ }
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java
index 7b8c40bca..83ad6c4e7 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformation.java
@@ -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;
+ }
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java
index f972777b9..8882a8b68 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/frankfurt/FrankfurtReleaseInformationR2.java
@@ -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;
+ }
+
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java
index e057d82f2..5efaf9331 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/guilin/GuilinReleaseInformation.java
@@ -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;
+ }
+
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java
index 41f8175db..148c004a6 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/honolulu/HonoluluReleaseInformation.java
@@ -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;
+ }
+
}
diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java
index 67200bb2f..0dcd3ae3c 100644
--- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java
+++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java
@@ -21,33 +21,154 @@
*/
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
index 000000000..264f1203c
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/MariaDBTestBase.java
@@ -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
index 000000000..072ce2f6b
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBIstanbul.java
@@ -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
index 000000000..f39f9b088
--- /dev/null
+++ b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMariaDBMapper.java
@@ -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;
+ }
+}
diff --git a/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java
index 311582a08..412c8b857 100644
--- a/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java
+++ b/sdnr/wt/data-provider/setup/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/TestMigrationProvider.java
@@ -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 {
diff --git a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java
index 0b69830c7..ed452cb7e 100644
--- a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java
+++ b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java
@@ -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
diff --git a/sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java b/sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java
index ed7f56f4b..06b825934 100644
--- a/sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java
+++ b/sdnr/wt/devicemanager-core/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestDevicemanager.java
@@ -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);