From 790f175c24e529c0ce81e091d5a1ea6e8680d6e1 Mon Sep 17 00:00:00 2001 From: JvD_Ericsson Date: Fri, 14 Mar 2025 11:22:44 +0000 Subject: [PATCH] Fix support for geographical queries in teiv Issue-ID: SMO-169 Change-Id: Ie1d4a17948394a079b49e202f18dc44be27f5a06 Signed-off-by: JvD_Ericsson --- CopyrightSample.txt | 2 +- .../charts/topology-exposure-inventory/values.yaml | 2 +- .../init_sql/00_init-teiv-exposure-model.sql | 46 +- .../init_sql/01_init-teiv-exposure-data.sql | 966 ++++++------ .../02_init-teiv-exposure-consumer-data.sql | 16 +- .../init_sql/03_init-teiv-exposure-groups.sql | 24 +- charts/smo/topology-exposure-inventory/values.yaml | 2 +- code_conventions.xml | 4 +- .../events/cloudEventExampleMerge.txt | 2 +- .../sql_scripts/00_init-teiv-exposure-model.sql | 38 +- .../sql_scripts/01_init-teiv-exposure-data.sql | 964 ++++++------ .../02_init-teiv-exposure-consumer-data.sql | 14 +- .../sql_scripts/03_init-teiv-exposure-groups.sql | 22 +- docs/groupings.rst | 2 +- docs/offeredapis/html/index.html | 69 +- docs/offeredapis/index.html | 69 +- .../topology-exposure-inventory-openapi.json | 129 +- .../topology-exposure-inventory-openapi.yaml | 202 ++- docs/pgsql-schema-generator-guide.rst | 18 +- license/copyright-2024.txt | 18 - license/javaHeaderDefinition.xml | 34 - license/xmlHeaderDefinition.xml | 34 - pgsql-schema-generator/README.md | 40 +- pgsql-schema-generator/pom.xml | 12 + .../oran/smo/teiv/pgsqlgenerator/Constants.java | 13 +- .../oran/smo/teiv/pgsqlgenerator/IndexType.java | 6 +- .../pgsqlgenerator/PgSchemaGeneratorException.java | 4 +- .../pgsqlgenerator/schema/SchemaGenerator.java | 6 +- .../teiv/pgsqlgenerator/schema/SchemaParser.java | 16 +- .../consumerdata/ConsumerDataSchemaGenerator.java | 4 +- .../schema/data/DataSchemaGenerator.java | 10 +- .../schema/data/DataSchemaHelper.java | 22 +- .../schema/groups/GroupsSchemaGenerator.java | 4 +- .../schema/model/ModelSchemaGenerator.java | 20 +- .../scripts/00_init-oran-smo-teiv-data.sql | 22 +- .../scripts/01_init-oran-smo-teiv-model.sql | 22 +- .../02_init-oran-smo-teiv-consumer-data.sql | 14 +- .../scripts/03_init-oran-smo-teiv-groups.sql | 22 +- .../oran/smo/teiv/pgsqlgenerator/TestHelper.java | 4 +- .../pgsqlgenerator/schema/SchemaParserTest.java | 6 +- .../entities/mock_00_init-oran-smo-teiv-data.sql | 22 +- .../manyToMany/mock_00_init-oran-smo-teiv-data.sql | 36 +- .../manyToOne/mock_00_init-oran-smo-teiv-data.sql | 30 +- .../oneToMany/mock_00_init-oran-smo-teiv-data.sql | 30 +- .../oneToOne/mock_00_init-oran-smo-teiv-data.sql | 34 +- .../mock_00_init-oran-smo-teiv-data.sql | 30 +- .../model/mock_01_init-oran-smo-teiv-model.sql | 30 +- .../baseline-schema/00_init-oran-smo-teiv-data.sql | 74 +- .../01_init-oran-smo-teiv-model.sql | 30 +- .../02_init-oran-smo-teiv-consumer-data.sql | 14 +- .../03_init-oran-smo-teiv-groups.sql | 22 +- .../baseline-schema/custom-sql-script.sql | 14 +- .../result_00_init-oran-smo-teiv-data.sql | 394 ++--- .../result_01_init-oran-smo-teiv-model.sql | 26 +- .../result_02_init-oran-smo-teiv-consumer-data.sql | 14 +- .../result_03_init-oran-smo-teiv-groups.sql | 22 +- pom.xml | 93 +- teiv/pom.xml | 20 +- .../smo/teiv/antlr4/{tiesPath.g4 => teivPath.g4} | 8 +- .../java/org/oran/smo/teiv/CoreApplication.java | 31 +- .../main/java/org/oran/smo/teiv/CustomMetrics.java | 84 +- ...cator.java => TeivExposureHealthIndicator.java} | 8 +- ...dicator.java => TeivGroupsHealthIndicator.java} | 8 +- ...althIndicator.java => TeivHealthIndicator.java} | 6 +- ...ator.java => TeivIngestionHealthIndicator.java} | 8 +- ...ndicator.java => TeivKafkaHealthIndicator.java} | 6 +- .../{TiesException.java => TeivException.java} | 79 +- .../api/impl/ClassifiersServiceImpl.java | 20 +- .../rest/controller/ClassifiersRestController.java | 14 +- .../consumerdata/ConsumerDataRepositoryImpl.java | 32 +- .../consumerdata/ConsumerDataValidator.java | 8 +- .../operation/ClassifiersOperation.java | 4 +- .../operation/ConsumerDataOperation.java | 8 +- .../operation/DecoratorsOperation.java | 4 +- .../operation/DeleteClassifiersOperation.java | 4 +- .../operation/DeleteDecoratorsOperation.java | 4 +- .../operation/MergeClassifiersOperation.java | 4 +- .../operation/MergeDecoratorsOperation.java | 4 +- .../exposure/data/api/impl/DataServiceImpl.java | 22 +- .../data/rest/controller/DataController.java | 27 +- .../decorators/api/impl/DecoratorsServiceImpl.java | 19 +- .../rest/controller/DecoratorsRestController.java | 14 +- .../exception/ApplicationExceptionHandler.java | 14 +- .../exposure/model/api/impl/ModelServiceImpl.java | 16 +- .../model/rest/controller/ModelController.java | 12 +- .../oran/smo/teiv/exposure/spi/DataRepository.java | 16 +- .../teiv/exposure/spi/impl/DataRepositoryImpl.java | 36 +- .../exposure/spi/impl/ModelRepositoryImpl.java | 56 +- .../teiv/exposure/spi/mapper/ResponseMapper.java | 18 +- .../innerlanguage/AndLogicalBlock.java | 4 +- .../innerlanguage/AndOrLogicalBlock.java | 7 +- .../innerlanguage/ConditionFactory.java | 153 +- .../innerlanguage/ContainerType.java | 8 +- .../innerlanguage/EmptyLogicalBlock.java | 4 +- .../innerlanguage/FilterCriteria.java | 4 +- .../innerlanguage/InnerFilterCriteria.java | 31 +- .../innerlanguage/LogicalBlock.java | 4 +- .../innerlanguage/OrLogicalBlock.java | 4 +- .../innerlanguage/PathObject.java | 4 +- .../innerlanguage/QueryFunction.java | 12 +- .../innerlanguage/ScopeLogicalBlock.java | 120 +- .../innerlanguage/ScopeObject.java | 6 +- .../innerlanguage/TargetObject.java | 4 +- .../innerlanguage/TopologyObjectType.java | 5 +- .../refiner/AliasMapper.java | 8 +- .../refiner/BasePathRefinement.java | 530 ++++--- .../refiner/PathToJooqRefinement.java | 14 +- .../resolver/PathResolver.java | 26 +- .../resolver/ResolverDataType.java | 4 +- .../exposure/teivpath/resolver/ResolverUtil.java | 139 ++ .../resolver/ScopeFilterListener.java | 107 +- .../resolver/ScopeResolver.java | 26 +- .../resolver/TargetFilterListener.java | 46 +- .../resolver/TargetResolver.java | 20 +- .../exposure/tiespath/resolver/ResolverUtil.java | 86 -- .../smo/teiv/exposure/utils/PaginationUtil.java | 8 +- .../smo/teiv/exposure/utils/RequestValidator.java | 24 +- .../oran/smo/teiv/groups/GroupsCustomMetrics.java | 18 +- .../api/impl/creator/DynamicGroupCreator.java | 23 +- .../resolver/RelationshipByEntityIdResolver.java | 5 +- .../org/oran/smo/teiv/groups/audit/AuditInfo.java | 14 +- .../groups/rest/controller/GroupsConstants.java | 3 +- .../groups/rest/controller/GroupsController.java | 35 +- .../groups/spi/StaticGroupMemberProcessor.java | 30 +- .../teiv/groups/spi/impl/GroupsRepositoryImpl.java | 14 +- .../groups/utils/CachedBodyHttpServletRequest.java | 56 + .../groups/utils/CachedBodyServletInputStream.java | 61 + .../groups/utils/GroupCreationRequestFilter.java | 140 ++ .../validation/IngestionOperationValidator.java | 10 +- .../IngestionOperationValidatorFactory.java | 4 +- ...dation.java => TeivDbServiceForValidation.java} | 8 +- .../smo/teiv/listener/CreateTopologyProcessor.java | 15 +- .../smo/teiv/listener/DeleteTopologyProcessor.java | 20 +- .../smo/teiv/listener/MergeTopologyProcessor.java | 15 +- .../SourceEntityDeleteTopologyProcessor.java | 18 +- .../oran/smo/teiv/listener/TopologyListener.java | 30 +- .../teiv/listener/TopologyProcessorRegistry.java | 12 +- .../org/oran/smo/teiv/schema/BidiDbNameMapper.java | 4 +- .../java/org/oran/smo/teiv/schema/DataType.java | 8 +- .../java/org/oran/smo/teiv/schema/EntityType.java | 89 +- .../java/org/oran/smo/teiv/schema/Persistable.java | 15 +- .../oran/smo/teiv/schema/PostgresSchemaLoader.java | 24 +- .../org/oran/smo/teiv/schema/RelationType.java | 50 +- .../java/org/oran/smo/teiv/schema/Reliability.java | 6 +- .../oran/smo/teiv/schema/ResponsibleAdapter.java | 14 +- .../org/oran/smo/teiv/schema/SchemaRegistry.java | 57 +- .../smo/teiv/schema/SchemaRegistryErrorCode.java | 4 +- .../teiv/service/RelationshipMergeValidator.java | 4 +- ...TiesDbOperations.java => TeivDbOperations.java} | 161 +- .../{TiesDbService.java => TeivDbService.java} | 14 +- .../smo/teiv/service/TeivMetadataResolver.java | 231 +++ .../teiv/service/cloudevent/CloudEventParser.java | 10 +- .../smo/teiv/service/cloudevent/data/Entity.java | 4 +- .../teiv/service/cloudevent/data/ModuleObject.java | 4 +- .../oran/smo/teiv/utils/ConvertToJooqTypeUtil.java | 84 -- .../org/oran/smo/teiv/utils/JooqTypeConverter.java | 8 +- .../{TiesConstants.java => TeivConstants.java} | 20 +- .../java/org/oran/smo/teiv/utils/YangParser.java | 20 +- .../{TiesPathBuilder.java => TeivPathBuilder.java} | 78 +- ...rorListener.java => TeivPathErrorListener.java} | 4 +- .../{TiesPathLexer.java => TeivPathLexer.java} | 8 +- .../{TiesPathParser.java => TeivPathParser.java} | 8 +- .../{TiesPathQuery.java => TeivPathQuery.java} | 6 +- .../path/{TiesPathUtil.java => TeivPathUtil.java} | 28 +- ...esPathException.java => TeivPathException.java} | 67 +- .../org/oran/smo/teiv/utils/schema/Geography.java | 19 +- .../teiv/utils/yangparser/ExposureYangParser.java | 16 +- .../teiv/utils/yangparser/YangFindingsManager.java | 14 +- .../smo/teiv/utils/yangparser/YangModelLoader.java | 2 +- teiv/src/main/resources/application.yaml | 2 +- .../models/o-ran-smo-teiv-common-yang-types.yang | 29 +- .../v1/topology-exposure-inventory-openapi.yaml | 202 ++- .../org/oran/smo/teiv/CoreApplicationTest.java | 84 +- .../DependentServiceAvailabilityKafkaTest.java | 24 +- ...t.java => TeivExposureHealthIndicatorTest.java} | 12 +- ...est.java => TeivGroupsHealthIndicatorTest.java} | 12 +- ....java => TeivIngestionHealthIndicatorTest.java} | 12 +- .../oran/smo/teiv/db/TestPostgresqlContainer.java | 40 +- .../api/contract/TopologyExposureApiBase.java | 10 +- .../api/ClassifiersServiceContainerizedTest.java | 37 +- .../data/api/impl/ExposureMetricsTest.java | 30 +- .../api/DecoratorsServiceContainerizedTest.java | 39 +- ...RepositoryImplGETRequestsContainerizedTest.java | 60 +- .../spi/mapper/RelationshipMapperTest.java | 10 +- .../innerlanguage/DtoToJooqTest.java | 480 +++--- .../innerlanguage/FilterCriteriaTest.java | 34 +- .../innerlanguage/PathObjectTest.java | 4 +- .../innerlanguage/ScopeLogicalBlockTest.java | 78 +- .../innerlanguage/SelectBlockTest.java | 108 +- .../refiner/AliasMapperTest.java | 4 +- .../refiner/BasePathRefinementTest.java | 798 +++++----- .../refiner/PathToJooqRefinementTest.java | 38 +- .../resolver/ScopeResolverTest.java | 95 +- .../resolver/TargetResolverTest.java | 32 +- .../teiv/exposure/utils/PaginationUtilTest.java | 6 +- .../teiv/exposure/utils/RequestValidatorTest.java | 14 +- .../smo/teiv/groups/TopologyGroupsApiBase.java | 40 +- .../IngestionOperationValidatorTest.java | 84 +- .../teiv/listener/CreateTopologyProcessorTest.java | 27 +- .../teiv/listener/DeleteTopologyProcessorTest.java | 23 +- .../teiv/listener/MergeTopologyProcessorTest.java | 27 +- .../SourceEntityDeleteTopologyProcessorTest.java | 34 +- .../org/oran/smo/teiv/schema/MockSchemaLoader.java | 12 +- .../oran/smo/teiv/schema/SchemaRegistryTest.java | 67 +- .../org/oran/smo/teiv/service/EndToEndDbTest.java | 248 ++- .../smo/teiv/service/KafkaTopicServiceTest.java | 10 +- ...tsTest.java => TeivDbOperationResultsTest.java} | 392 +++-- ...st.java => TeivDbServiceContainerizedTest.java} | 282 ++-- .../smo/teiv/utils/ExposureYangParserTest.java | 12 +- .../oran/smo/teiv/utils/JooqTypeConverterTest.java | 8 +- ...esTestConstants.java => TeivTestConstants.java} | 4 +- .../org/oran/smo/teiv/utils/YangParserTest.java | 6 +- .../oran/smo/teiv/utils/schema/GeographyTest.java | 7 +- .../{application.yaml => application-test.yaml} | 2 - .../cloudeventdata/common/ce-null-attribute.json | 2 +- .../end-to-end/ce-create-attribute-null.json | 2 +- .../end-to-end/ce-create-geo-location-null.json | 2 +- .../end-to-end/ce-create-inferred.json | 4 +- .../end-to-end/ce-create-second-case.json | 2 +- .../end-to-end/ce-merge-many-to-many.json | 8 +- .../end-to-end/ce-merge-one-to-many3.json | 101 ++ .../expected-results/exp-create-inferred.json | 64 +- .../expected-results/exp-create-many-to-many.json | 38 +- .../expected-results/exp-create-one-to-one.json | 14 +- .../expected-results/exp-create-second-case.json | 42 +- .../expected-results/exp-delete-one-to-one.json | 2 +- .../expected-results/exp-merge-many-to-many.json | 65 + .../expected-results/exp-merge-one-to-many.json | 43 +- .../expected-results/exp-merge-one-to-many3.json | 69 + .../expected-results/exp-merge-reliability.json | 72 +- .../many-to-one/ce-create-many-to-one9.json | 2 +- .../ce-merge-many-to-one-null-attribute.json | 2 +- ...tClassifiers_getTopologyByEntityTypeName.groovy | 152 +- ...01_getClassifiers_getRelationshipsByType.groovy | 2 +- .../02_getClassifiers_getEntitiesByDomain.groovy | 48 +- .../classifiers/03_postClassifiers_merge.groovy | 76 +- .../classifiers/04_postClassifiers_delete.groovy | 2 +- .../exposure/data/00_getAllDomains.groovy | 2 +- .../exposure/data/01_getTopologyEntityTypes.groovy | 2 +- .../data/02_getTopologyByEntityTypeName.groovy | 1595 +++++++++++++++++++- .../exposure/data/03_getTopologyById.groovy | 26 +- .../data/04_getAllRelationshipsForEntityId.groovy | 387 ++++- .../exposure/data/05_getRelationshipTypes.groovy | 2 +- .../exposure/data/06_getRelationshipsByType.groovy | 58 +- .../exposure/data/07_getRelationshipById.groovy | 46 +- .../exposure/data/08_getEntitiesByDomain.groovy | 523 ++++++- ...etDecorators_getTopologyByEntityTypeName.groovy | 64 +- .../01_getDecorators_getRelationshipsByType.groovy | 2 +- .../02_getDecorators_getEntitiesByDomain.groovy | 154 +- .../decorators/03_postDecoratorsMerge.groovy | 82 +- .../decorators/04_postDecoratorsDelete.groovy | 2 +- .../exposure/schemas/00_getAllSchemas.groovy | 4 +- .../exposure/schemas/01_getSchemaContent.groovy | 2 +- .../exposure/schemas/02_postSchemas.groovy | 4 +- .../exposure/schemas/03_deleteSchemas.groovy | 2 +- .../contracts/groups/00_createGroup.groovy | 352 ++++- .../resources/contracts/groups/01_getGroups.groovy | 6 +- .../contracts/groups/02_getGroupById.groovy | 6 +- .../contracts/groups/03_deleteGroup.groovy | 2 +- .../resources/contracts/groups/04_putGroup.groovy | 2 +- .../contracts/groups/05_getMembers.groovy | 101 +- .../contracts/groups/06_getProvidedMembers.groovy | 2 +- .../groups/07_updateProvidedMembers.groovy | 45 +- .../pgsqlschema/00_init-oran-smo-teiv-data.sql | 964 ++++++------ .../pgsqlschema/01_init-oran-smo-teiv-model.sql | 32 +- .../02_init-oran-smo-teiv-consumer-data.sql | 14 +- .../pgsqlschema/03_init-oran-smo-teiv-groups.sql | 22 +- .../04_init-oran-smo-teiv-data-update.sql | 175 +++ teiv/src/test/resources/pgsqlschema/README.md | 21 + .../test/resources/pgsqlschema/consumer-data.sql | 6 +- teiv/src/test/resources/pgsqlschema/data.sql | 272 ++-- teiv/src/test/resources/pgsqlschema/groups.sql | 14 +- .../resources/pgsqlschema/ingestion-test-data.sql | 374 +++-- .../resources/pgsqlschema/ingestion-test-model.sql | 8 +- teiv/src/test/resources/pgsqlschema/model.sql | 8 +- .../test-data-for-ingestion-validation.sql | 97 +- .../test-model-for-ingestion-validation.sql | 6 +- .../parser/simple/example/JsonParserExample.java | 2 +- .../smo/yangtools/parser/simple/example/Main.java | 2 +- .../parser/simple/example/YangParserExample.java | 2 +- yang-parser/yang-parser-jar/pom.xml | 12 + .../parser/CheckYangLibraryAgainstSchema.java | 2 +- .../oran/smo/yangtools/parser/CustomProcessor.java | 2 +- .../yangtools/parser/ParserExecutionContext.java | 2 +- .../oran/smo/yangtools/parser/PrefixResolver.java | 2 +- .../oran/smo/yangtools/parser/YangDeviceModel.java | 2 +- .../oran/smo/yangtools/parser/data/YangData.java | 2 +- .../parser/data/dom/YangDataDomDocumentRoot.java | 2 +- .../yangtools/parser/data/dom/YangDataDomNode.java | 2 +- .../data/dom/YangDataDomNodeAnnotationValue.java | 2 +- .../data/instance/AbstractContentInstance.java | 2 +- .../parser/data/instance/AbstractDataInstance.java | 2 +- .../data/instance/AbstractStructureInstance.java | 2 +- .../parser/data/instance/AnyDataInstance.java | 2 +- .../parser/data/instance/AnyXmlInstance.java | 2 +- .../parser/data/instance/ContainerInstance.java | 2 +- .../data/instance/DataTreeBuilderPredicate.java | 2 +- .../data/instance/InstanceDataTreeBuilder.java | 2 +- .../parser/data/instance/LeafInstance.java | 2 +- .../parser/data/instance/LeafListInstance.java | 2 +- .../parser/data/instance/ListInstance.java | 2 +- .../parser/data/instance/RootInstance.java | 2 +- .../yangtools/parser/data/parser/JsonParser.java | 2 +- .../yangtools/parser/data/parser/JsonWriter.java | 2 +- .../yangtools/parser/data/parser/XmlParser.java | 2 +- .../yangtools/parser/data/util/BinaryValue.java | 2 +- .../smo/yangtools/parser/data/util/BitsValue.java | 2 +- .../parser/data/util/IdentityRefValue.java | 2 +- .../yangtools/parser/data/util/ValueHelper.java | 2 +- .../smo/yangtools/parser/findings/Finding.java | 2 +- .../parser/findings/FindingFilterPredicate.java | 2 +- .../yangtools/parser/findings/FindingSeverity.java | 2 +- .../parser/findings/FindingSeverityCalculator.java | 2 +- .../yangtools/parser/findings/FindingsManager.java | 2 +- .../ModifyableFindingSeverityCalculator.java | 2 +- ...indingTypeAndSchemaNodePathFilterPredicate.java | 2 +- .../findings/ModuleAndSeverityFilterPredicate.java | 2 +- .../parser/findings/ParserFindingType.java | 2 +- .../SeverityCalculatorFilterPredicate.java | 2 +- .../findings/SuppressAllFilterPredicate.java | 2 +- .../parser/input/BufferedStreamYangInput.java | 2 +- .../yangtools/parser/input/ByteArrayYangInput.java | 2 +- .../parser/input/DirectYangInputResolver.java | 2 +- .../yangtools/parser/input/FileBasedYangInput.java | 2 +- .../parser/input/FileBasedYangInputResolver.java | 2 +- .../yangtools/parser/input/StringYangInput.java | 2 +- .../oran/smo/yangtools/parser/input/YangInput.java | 2 +- .../yangtools/parser/input/YangInputResolver.java | 2 +- .../yangtools/parser/model/ConformanceType.java | 2 +- .../smo/yangtools/parser/model/ModuleIdentity.java | 2 +- .../parser/model/ModulePrefixResolver.java | 2 +- .../oran/smo/yangtools/parser/model/YangModel.java | 2 +- .../smo/yangtools/parser/model/YangModelUtil.java | 2 +- .../smo/yangtools/parser/model/parser/Token.java | 2 +- .../parser/model/parser/TokenIterator.java | 2 +- .../parser/model/parser/YamTokenizer.java | 2 +- .../parser/model/resolvers/AugmentResolver.java | 2 +- .../parser/model/resolvers/DeviationResolver.java | 2 +- .../yangtools/parser/model/resolvers/Helper.java | 2 +- .../parser/model/resolvers/TypeResolver.java | 2 +- .../parser/model/resolvers/UsesResolver.java | 2 +- .../parser/model/schema/AnnotationRegistry.java | 2 +- .../parser/model/schema/IdentityRegistry.java | 2 +- .../model/schema/ModuleAndNamespaceResolver.java | 2 +- .../parser/model/schema/ModuleRegistry.java | 2 +- .../smo/yangtools/parser/model/schema/Schema.java | 2 +- .../schema/SchemaCheckModuleRelationships.java | 2 +- .../parser/model/schema/SchemaProcessor.java | 2 +- .../parser/model/statements/AbstractStatement.java | 2 +- .../statements/AbstractStatementClassSupplier.java | 2 +- .../model/statements/ExtensionStatement.java | 2 +- .../parser/model/statements/SimpleStatement.java | 2 +- .../model/statements/StatementClassSupplier.java | 2 +- .../parser/model/statements/StatementFactory.java | 2 +- .../model/statements/StatementModuleAndName.java | 2 +- .../parser/model/statements/YangModelRoot.java | 2 +- .../parser/model/statements/ietf/CIETF.java | 2 +- .../ietf/IetfExtensionsClassSupplier.java | 2 +- .../model/statements/ietf/YIetfAnnotation.java | 2 +- .../model/statements/ietf/YIetfDefaultDenyAll.java | 2 +- .../statements/ietf/YIetfDefaultDenyWrite.java | 2 +- .../model/statements/ietf/YIetfMountPoint.java | 2 +- .../parser/model/statements/oran/CORAN.java | 2 +- .../oran/OranExtensionsClassSupplier.java | 2 +- .../model/statements/oran/YOranSmoTeivASide.java | 2 +- .../model/statements/oran/YOranSmoTeivBSide.java | 2 +- ...anSmoTeivBiDirectionalTopologyRelationship.java | 2 +- .../model/statements/oran/YOranSmoTeivLabel.java | 2 +- .../parser/model/statements/threegpp/C3GPP.java | 2 +- .../threegpp/ThreeGppExtensionsClassSupplier.java | 2 +- .../model/statements/threegpp/Y3gppInVariant.java | 2 +- .../statements/threegpp/Y3gppInitialValue.java | 2 +- .../statements/threegpp/Y3gppNotNotifyable.java | 2 +- .../yangtools/parser/model/statements/yang/CY.java | 2 +- .../parser/model/statements/yang/YAction.java | 2 +- .../parser/model/statements/yang/YAnydata.java | 2 +- .../parser/model/statements/yang/YAnyxml.java | 2 +- .../parser/model/statements/yang/YArgument.java | 2 +- .../parser/model/statements/yang/YAugment.java | 2 +- .../parser/model/statements/yang/YBase.java | 2 +- .../parser/model/statements/yang/YBelongsTo.java | 2 +- .../parser/model/statements/yang/YBit.java | 2 +- .../parser/model/statements/yang/YCase.java | 2 +- .../parser/model/statements/yang/YChoice.java | 2 +- .../parser/model/statements/yang/YConfig.java | 2 +- .../parser/model/statements/yang/YContact.java | 2 +- .../parser/model/statements/yang/YContainer.java | 2 +- .../parser/model/statements/yang/YDefault.java | 2 +- .../parser/model/statements/yang/YDescription.java | 2 +- .../parser/model/statements/yang/YDeviate.java | 2 +- .../parser/model/statements/yang/YDeviation.java | 2 +- .../parser/model/statements/yang/YEnum.java | 2 +- .../parser/model/statements/yang/YErrorAppTag.java | 2 +- .../model/statements/yang/YErrorMessage.java | 2 +- .../parser/model/statements/yang/YExtension.java | 2 +- .../parser/model/statements/yang/YFeature.java | 2 +- .../model/statements/yang/YFractionDigits.java | 2 +- .../parser/model/statements/yang/YGrouping.java | 2 +- .../parser/model/statements/yang/YIdentity.java | 2 +- .../parser/model/statements/yang/YIfFeature.java | 2 +- .../parser/model/statements/yang/YImport.java | 2 +- .../parser/model/statements/yang/YInclude.java | 2 +- .../parser/model/statements/yang/YInput.java | 2 +- .../parser/model/statements/yang/YKey.java | 2 +- .../parser/model/statements/yang/YLeaf.java | 2 +- .../parser/model/statements/yang/YLeafList.java | 2 +- .../parser/model/statements/yang/YLength.java | 2 +- .../parser/model/statements/yang/YList.java | 2 +- .../parser/model/statements/yang/YMandatory.java | 2 +- .../parser/model/statements/yang/YMaxElements.java | 2 +- .../parser/model/statements/yang/YMinElements.java | 2 +- .../parser/model/statements/yang/YModifier.java | 2 +- .../parser/model/statements/yang/YModule.java | 2 +- .../parser/model/statements/yang/YMust.java | 2 +- .../parser/model/statements/yang/YNamespace.java | 2 +- .../model/statements/yang/YNotification.java | 2 +- .../parser/model/statements/yang/YOrderedBy.java | 2 +- .../model/statements/yang/YOrganization.java | 2 +- .../parser/model/statements/yang/YOutput.java | 2 +- .../parser/model/statements/yang/YPath.java | 2 +- .../parser/model/statements/yang/YPattern.java | 2 +- .../parser/model/statements/yang/YPosition.java | 2 +- .../parser/model/statements/yang/YPrefix.java | 2 +- .../parser/model/statements/yang/YPresence.java | 2 +- .../parser/model/statements/yang/YRange.java | 2 +- .../parser/model/statements/yang/YReference.java | 2 +- .../parser/model/statements/yang/YRefine.java | 2 +- .../model/statements/yang/YRequireInstance.java | 2 +- .../parser/model/statements/yang/YRevision.java | 2 +- .../model/statements/yang/YRevisionDate.java | 2 +- .../parser/model/statements/yang/YRpc.java | 2 +- .../parser/model/statements/yang/YStatus.java | 2 +- .../parser/model/statements/yang/YSubmodule.java | 2 +- .../parser/model/statements/yang/YType.java | 2 +- .../parser/model/statements/yang/YTypedef.java | 2 +- .../parser/model/statements/yang/YUnique.java | 2 +- .../parser/model/statements/yang/YUnits.java | 2 +- .../parser/model/statements/yang/YUses.java | 2 +- .../parser/model/statements/yang/YValue.java | 2 +- .../parser/model/statements/yang/YWhen.java | 2 +- .../parser/model/statements/yang/YYangVersion.java | 2 +- .../parser/model/statements/yang/YYinElement.java | 2 +- .../statements/yang/YangCoreClassSupplier.java | 2 +- .../parser/model/util/DataTypeHelper.java | 2 +- .../yangtools/parser/model/util/GrammarHelper.java | 2 +- .../yangtools/parser/model/util/NumberHelper.java | 2 +- .../yangtools/parser/model/util/PatternHelper.java | 2 +- .../yangtools/parser/model/util/StringHelper.java | 2 +- .../parser/model/util/YangAnnotation.java | 2 +- .../yangtools/parser/model/util/YangFeature.java | 2 +- .../yangtools/parser/model/util/YangIdentity.java | 2 +- .../yangdom/DefaultOutputFileNameResolver.java | 2 +- .../OriginalFileNameOutputFileNameResolver.java | 2 +- .../model/yangdom/OutputFileNameResolver.java | 2 +- .../parser/model/yangdom/OutputStreamResolver.java | 2 +- .../parser/model/yangdom/YangDomDocumentRoot.java | 2 +- .../parser/model/yangdom/YangDomElement.java | 2 +- .../parser/model/yangdom/YangDomWriter.java | 2 +- .../yangtools/parser/util/InstanceIdentifier.java | 2 +- .../parser/util/NamespaceModuleIdentifier.java | 2 +- .../smo/yangtools/parser/util/QNameHelper.java | 2 +- .../yangtools/parser/util/StackTraceHelper.java | 2 +- .../yangtools/parser/yanglibrary/Datastore.java | 2 +- .../parser/yanglibrary/IetfYangLibraryParser.java | 2 +- .../smo/yangtools/parser/yanglibrary/Module.java | 2 +- .../yangtools/parser/yanglibrary/ModuleSet.java | 2 +- .../yangtools/parser/yanglibrary/ModulesState.java | 2 +- .../parser/yanglibrary/RFC8525Populator.java | 2 +- .../yangtools/parser/yanglibrary/Submodule.java | 2 +- .../yangtools/parser/yanglibrary/YangLibrary.java | 2 +- .../parser/yanglibrary/YangLibraryPopulator.java | 2 +- .../yangtools/parser/data/dom/test/JsonTest.java | 2 +- .../parser/data/dom/test/XmlPrefixesTest.java | 2 +- .../parser/data/dom/test/XmlRootElementsTest.java | 2 +- .../parser/data/parser/test/JsonParserTest.java | 2 +- .../parser/data/parser/test/JsonWriterTest.java | 2 +- .../parser/data/test/ComplexInstanceDataTest.java | 2 +- .../data/test/DataTreeBuilderPredicateTest.java | 2 +- .../data/test/InstanceDataTreeBuilderTest.java | 2 +- .../parser/data/util/test/BinaryValueTest.java | 2 +- .../parser/data/util/test/BitsValueTest.java | 2 +- .../data/util/test/IdentityRefValueTest.java | 2 +- .../parser/data/util/test/ValueHelperTest.java | 2 +- .../parser/findings/test/FindingsManagerTest.java | 2 +- .../parser/input/test/ByteArrayYangInputTest.java | 2 +- .../input/test/FileBasedYangInputResolverTest.java | 2 +- .../parser/input/test/FileBasedYangInputTest.java | 2 +- .../model/schema/test/AnnotationRegistryTest.java | 2 +- .../model/schema/test/IdentityRegistryTest.java | 2 +- .../model/schema/test/ModuleRegistryTest.java | 2 +- .../test/PrefixAndNamespaceResolverTest.java | 2 +- .../RemoveFindingsOnUnusedSchemaNodesTest.java | 2 +- .../test/RemoveProtocolAccessibleObjectsTest.java | 2 +- .../schema/test/StopAfterInitialParseTest.java | 2 +- .../statements/ietf/test/OtherExtensionsTest.java | 2 +- .../oran/test/OranSmoTeivExtensionsTest.java | 10 +- .../model/statements/yang/test/AugmentTest.java | 2 +- .../model/statements/yang/test/BelongsToTest.java | 2 +- .../model/statements/yang/test/BitsTest.java | 2 +- .../statements/yang/test/ConformanceTypeTest.java | 2 +- .../model/statements/yang/test/DataTypeTest.java | 2 +- .../model/statements/yang/test/DeviationTest.java | 2 +- .../statements/yang/test/GeneralSyntaxTest.java | 2 +- .../model/statements/yang/test/GroupingTest.java | 2 +- .../model/statements/yang/test/IdentityTest.java | 2 +- .../model/statements/yang/test/IfFeatureTest.java | 2 +- .../model/statements/yang/test/ImportTest.java | 2 +- .../model/statements/yang/test/IncludeTest.java | 2 +- .../model/statements/yang/test/LengthTest.java | 2 +- .../model/statements/yang/test/ModuleTest.java | 2 +- .../model/statements/yang/test/NamespaceTest.java | 2 +- .../model/statements/yang/test/PrefixesTest.java | 2 +- .../model/statements/yang/test/RangeTest.java | 2 +- .../model/statements/yang/test/RevisionTest.java | 2 +- .../model/statements/yang/test/StatusTest.java | 2 +- .../yang/test/StringTokenizationTest.java | 2 +- .../model/statements/yang/test/SubmoduleTest.java | 2 +- .../model/statements/yang/test/TypedefTest.java | 2 +- .../model/statements/yang/test/WhenTest.java | 2 +- .../parser/model/test/ModuleIdentityTest.java | 2 +- .../parser/model/util/test/DataTypeHelperTest.java | 2 +- .../parser/model/util/test/GrammarHelperTest.java | 2 +- .../parser/model/util/test/NumberHelperTest.java | 2 +- .../parser/model/util/test/PatternHelperTest.java | 2 +- .../parser/model/util/test/StringHelperTest.java | 2 +- .../parser/model/util/test/YangAnnotationTest.java | 2 +- .../parser/model/util/test/YangIdentityTest.java | 2 +- .../model/yangdom/test/BasicParsingTest.java | 2 +- .../test/CheckYangLibraryAgainstSchemaTest.java | 2 +- .../smo/yangtools/parser/test/FailFastTest.java | 2 +- .../parser/test/ParseIetfModulesTest.java | 2 +- .../test/UnsatisfiedIfFeatureRemoveTest.java | 2 +- .../yangtools/parser/test/YangDeviceModelTest.java | 2 +- .../yangtools/parser/test/YangDomWriteOutTest.java | 2 +- .../yangtools/parser/testutils/YangTestCommon.java | 2 +- .../parser/util/test/InstanceIdentifierTest.java | 2 +- .../util/test/NamespaceAndIdentifierTest.java | 2 +- .../parser/util/test/QNameHelperTest.java | 2 +- .../test/IetfYangLibraryParserTest.java | 2 +- ...-ran-smo-teiv-common-yang-types@2023-12-12.yang | 6 +- 540 files changed, 11470 insertions(+), 6430 deletions(-) delete mode 100644 license/copyright-2024.txt delete mode 100644 license/javaHeaderDefinition.xml delete mode 100644 license/xmlHeaderDefinition.xml rename teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/{tiesPath.g4 => teivPath.g4} (95%) rename teiv/src/main/java/org/oran/smo/teiv/controller/health/{TiesExposureHealthIndicator.java => TeivExposureHealthIndicator.java} (87%) rename teiv/src/main/java/org/oran/smo/teiv/controller/health/{TiesGroupsHealthIndicator.java => TeivGroupsHealthIndicator.java} (86%) rename teiv/src/main/java/org/oran/smo/teiv/controller/health/{TiesHealthIndicator.java => TeivHealthIndicator.java} (89%) rename teiv/src/main/java/org/oran/smo/teiv/controller/health/{TiesIngestionHealthIndicator.java => TeivIngestionHealthIndicator.java} (88%) rename teiv/src/main/java/org/oran/smo/teiv/controller/health/{TiesKafkaHealthIndicator.java => TeivKafkaHealthIndicator.java} (88%) rename teiv/src/main/java/org/oran/smo/teiv/exception/{TiesException.java => TeivException.java} (69%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/AndLogicalBlock.java (90%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/AndOrLogicalBlock.java (89%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/ConditionFactory.java (74%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/ContainerType.java (89%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/EmptyLogicalBlock.java (93%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/FilterCriteria.java (95%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/InnerFilterCriteria.java (87%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/LogicalBlock.java (90%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/OrLogicalBlock.java (90%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/PathObject.java (91%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/QueryFunction.java (80%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/ScopeLogicalBlock.java (50%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/ScopeObject.java (89%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/TargetObject.java (92%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/TopologyObjectType.java (87%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/AliasMapper.java (93%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/BasePathRefinement.java (65%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/PathToJooqRefinement.java (92%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/PathResolver.java (69%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/ResolverDataType.java (88%) create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverUtil.java rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/ScopeFilterListener.java (69%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/ScopeResolver.java (81%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/TargetFilterListener.java (71%) rename teiv/src/main/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/TargetResolver.java (82%) delete mode 100644 teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverUtil.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java rename teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/{TiesDbServiceForValidation.java => TeivDbServiceForValidation.java} (92%) rename teiv/src/main/java/org/oran/smo/teiv/service/{TiesDbOperations.java => TeivDbOperations.java} (82%) rename teiv/src/main/java/org/oran/smo/teiv/service/{TiesDbService.java => TeivDbService.java} (88%) create mode 100644 teiv/src/main/java/org/oran/smo/teiv/service/TeivMetadataResolver.java delete mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/ConvertToJooqTypeUtil.java rename teiv/src/main/java/org/oran/smo/teiv/utils/{TiesConstants.java => TeivConstants.java} (87%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathBuilder.java => TeivPathBuilder.java} (69%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathErrorListener.java => TeivPathErrorListener.java} (91%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathLexer.java => TeivPathLexer.java} (86%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathParser.java => TeivPathParser.java} (85%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathQuery.java => TeivPathQuery.java} (93%) rename teiv/src/main/java/org/oran/smo/teiv/utils/path/{TiesPathUtil.java => TeivPathUtil.java} (60%) rename teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/{TiesPathException.java => TeivPathException.java} (70%) rename teiv/src/test/java/org/oran/smo/teiv/controller/health/{TiesExposureHealthIndicatorTest.java => TeivExposureHealthIndicatorTest.java} (93%) rename teiv/src/test/java/org/oran/smo/teiv/controller/health/{TiesGroupsHealthIndicatorTest.java => TeivGroupsHealthIndicatorTest.java} (92%) rename teiv/src/test/java/org/oran/smo/teiv/controller/health/{TiesIngestionHealthIndicatorTest.java => TeivIngestionHealthIndicatorTest.java} (93%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/DtoToJooqTest.java (77%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/FilterCriteriaTest.java (86%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/PathObjectTest.java (91%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/ScopeLogicalBlockTest.java (71%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/innerlanguage/SelectBlockTest.java (75%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/AliasMapperTest.java (93%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/BasePathRefinementTest.java (71%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/refiner/PathToJooqRefinementTest.java (74%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/ScopeResolverTest.java (84%) rename teiv/src/test/java/org/oran/smo/teiv/exposure/{tiespath => teivpath}/resolver/TargetResolverTest.java (88%) rename teiv/src/test/java/org/oran/smo/teiv/service/{TiesDbOperationResultsTest.java => TeivDbOperationResultsTest.java} (81%) rename teiv/src/test/java/org/oran/smo/teiv/service/{TiesDbServiceContainerizedTest.java => TeivDbServiceContainerizedTest.java} (72%) rename teiv/src/test/java/org/oran/smo/teiv/utils/{TiesTestConstants.java => TeivTestConstants.java} (93%) rename teiv/src/test/resources/{application.yaml => application-test.yaml} (98%) create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many3.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many3.json create mode 100644 teiv/src/test/resources/pgsqlschema/04_init-oran-smo-teiv-data-update.sql diff --git a/CopyrightSample.txt b/CopyrightSample.txt index 9bf94c8..73e95db 100644 --- a/CopyrightSample.txt +++ b/CopyrightSample.txt @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) $YEAR OpenInfra Foundation Europe + * Modifications Copyright (C) 2024 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/charts/smo/topology-exposure-inventory/charts/topology-exposure-inventory/values.yaml b/charts/smo/topology-exposure-inventory/charts/topology-exposure-inventory/values.yaml index 127e963..289d12d 100644 --- a/charts/smo/topology-exposure-inventory/charts/topology-exposure-inventory/values.yaml +++ b/charts/smo/topology-exposure-inventory/charts/topology-exposure-inventory/values.yaml @@ -57,7 +57,7 @@ application: validate-group-membership: "false" group: readiness: - include: "readinessState,${HEALTH_CHECK_INDICATOR:tiesExposure}" + include: "readinessState,${HEALTH_CHECK_INDICATOR:teivExposure}" endpoints: web: exposure: diff --git a/charts/smo/topology-exposure-inventory/resources/init_sql/00_init-teiv-exposure-model.sql b/charts/smo/topology-exposure-inventory/resources/init_sql/00_init-teiv-exposure-model.sql index dbb7b9d..964a4fa 100644 --- a/charts/smo/topology-exposure-inventory/resources/init_sql/00_init-teiv-exposure-model.sql +++ b/charts/smo/topology-exposure-inventory/resources/init_sql/00_init-teiv-exposure-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO topology_exposure_user; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; -SET ROLE 'topology_exposure_user'; +SET ROLE topology_exposure_user; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "domain" TEXT, @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" TEXT PRIMARY KEY, "name" TEXT NOT NULL, "moduleReferenceName" TEXT NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,12 +70,12 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN CD_sourceIds CD_sourceIds COLUMN @@ -465,25 +465,25 @@ totalTilt totalTilt COLUMN verticalBeamWidth verticalBeamWidth COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; _3gpp-common-yang-extensions urn:3gpp:sa5:_3gpp-common-yang-extensions \N [] 2019-06-23 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZHVsZSBkZWZpbmVzIFlBTkcgZXh0ZW5zaW9ucyBuZWVkZWQgCiAgICAzR1BQIFlBTkcgbW9kZWxpbmcuCgogICAgQ29weXJpZ2h0IChjKSAyMDE5IDNHUFAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgRXh0ZW5zaW9ucyBNVVNUIGJlIGRlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUKICAgIGRlc2NyaXB0aW9uIHN0YXRlbWVudDoKICAgICAgICAtIFdoYXQgaXMgdGhpcyBzdGF0ZW1lbnQuCiAgICAgICAgLSBOZXdsaW5lLAogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSB4eHggc3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIFRoaXMgc3RhdGVtZW50IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgc3Vic3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIE5ld2xpbmUKICAgICAgICAtIElzIGNoYW5naW5nIHRoaXMgc3RhdGVtZW50IGFuIGVkaXRvcmlhbCwgQkMoYmFja3dhcmRzIGNvbXBhdGlibGUpIAogICAgICAgIG9yIE5CQyhub24tQkMpIGNoYW5nZT8KICAgICAgICAtIE5ld2xpbmUuCiAgICAgICAgLSBUaGUgYXJndW1lbnQgaXRzIG1lYW5pbmcgYW5kIHR5cGUuIFByZWZlcmFibHkgdXNlIFlBTkcgdHlwZXMgYW5kCiAgICAgICAgICBjb25zdHJhaW50cyB0byBkZWZpbmUgdGhlIGFyZ3VtZW50J3MgdHlwZS4KCiAgICBBbnkgZXh0ZW5zaW9uIHN0YXRlbWVudCBjYW4gYmUgYWRkZWQgd2l0aCBhCiAgICBkZXZpYXRpb24vZGV2aWF0ZSBhZGQgc3RhdGVtZW50LiBJbiB0aGlzIGNhc2UgdGhlIHJlc3RyaWN0aW9uIGFib3V0CiAgICB0aGUgcGFyZW50IHN0YXRlbWVudCBvZiB0aGUgZXh0ZW5zaW9uIFNIQUxMIGJlIGV2YWx1YXRlZCBiYXNlZCBvbiB0aGUKICAgIHRhcmdldCBvZiB0aGUgZGV2aWF0aW9uIHN0YXRlbWVudC4KCiAgICBTdXBwb3J0IGZvciB0aGlzIG1vZHVsZSBkb2VzIG5vdCBtZWFuIHRoYXQgYSBZQU5HIHNlcnZlciBpbXBsZW1lbnRzCiAgICBzdXBwb3J0IGZvciBlYWNoIG9mIHRoZXNlIGV4dGVuc2lvbnMuCiAgICBJbXBsZW1lbnRlcnMgb2YgZWFjaCBzcGVjaWZpYyBtb2R1bGUgdXNpbmcgYW4gZXh0ZW5zaW9ucyBNVVNUIGNoZWNrCiAgICBpZiB0aGUgc2VydmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIHVzZWQgZXh0ZW5zaW9uLgogICAgTm90ZTogbW9kdWxlcyB1c2UgbWFueSBleHRlbnNpb25zIHdoaWNoIGluZGl2aWR1YWwKICAgIGltcGxlbWVudGF0aW9ucyBNQVkgb3IgTUFZIE5PVCBzdXBwb3J0LgogICAgSWYgc3VwcG9ydCBmb3IgYW4gZXh0ZW5zaW9uIGlzIG1pc3NpbmcgdGhlIGV4dGVuc2lvbiBzdGF0ZW1lbnQgbmVlZHMKICAgIGluZGl2aWR1YWwgaGFuZGxpbmcgb3IgaXQgU0hPVUxEIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kdWxlIHVzaW5nCiAgICB0aGUgZXh0ZW5zaW9uIGUuZy4gd2l0aCBhIGRldmlhdGlvbi4KICAgICAgICAgICI7CgogIHJldmlzaW9uICIyMDE5LTA2LTIzIiB7CiAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCB2ZXJzaW9uIjsKICB9CgogIGV4dGVuc2lvbiBpblZhcmlhbnQgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlIGRhdGEgbm9kZSBjYW4gb25seSBiZSBzZXQgd2hlbiBpdHMKICAgICAgcGFyZW50IGRhdGEgbm9kZSBpcyBiZWluZyBjcmVhdGVkLiBUbyBjaGFuZ2UgdGhlIHZhbHVlIGFmdGVyIHRoYXQsIHRoZQogICAgICBwYXJlbnQgZGF0YSBub2RlIG11c3QgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIHdpdGggdGhlIGRhdGEgbm9kZQogICAgICBoYXZpbmcgdGhlIG5ldyB2YWx1ZS4KCiAgICAgIEl0IGlzIHVubmVjZXNzYXJ5IHRvIHVzZSBhbmQgTVVTVCBOT1QgYmUgdXNlZCBmb3Iga2V5IGxlYWZzLgoKICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSBsZWFmLCBsZWFmLWxpc3QsIGxpc3QgCiAgICAgIHN0YXRlbWVudHMgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0IAogICAgICBoYXMgYSBkZWZhdWx0IHN0YXRlbWVudCBvciB0aGUgdHlwZSB1c2VkIGZvciB0aGUgZGF0YSBub2RlIAogICAgICBoYXMgYSBkZWZhdWx0IHZhbHVlLgogICAgICBUaGUgc3RhdGVtZW50IE1VU1QgTk9UIGJlIHVzZWQgZm9yIGNvbmZpZz1mYWxzZSBkYXRhIG9yIGluIGFuIAogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9 _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbCAKICAgIGluZm9ybWF0aW9uIGNsYXNzZXMgdXNlZCBmb3IgbWFuYWdlbWVudCBvZiA1RyBuZXR3b3JrcyBhbmQgCiAgICBuZXR3b3JrIHNsaWNpbmcuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMi0wNy0yNiB7IHJlZmVyZW5jZSBDUi0wMTgwIDsgfQogIHJldmlzaW9uIDIwMjItMDItMDkgeyByZWZlcmVuY2UgIkNSLTAxNDQiOyB9CiAgcmV2aXNpb24gMjAyMS0xMS0wMSB7IHJlZmVyZW5jZSAiQ1ItMDE0MSI7IH0KICAKICByZXZpc2lvbiAyMDIxLTA5LTMwIHsKICAgIGRlc2NyaXB0aW9uICJBZGRlZCBMb25naXR1ZGUsIExhdGl0dWRlLCBUZW50aE9mRGVncmVlcywgT25PZmYuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDEzOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTExLTA2IHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGluY29ycmVjdCBTLU5TU0FJIGRlZmluaXRpb25zLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMTgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0wMy0xMCB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBmYXVsdHkgd2hlbiBzdGF0ZW1lbnRzLiI7CiAgICByZWZlcmVuY2UgIlNQLTIwMDIyOSI7CiAgfQogCiAgcmV2aXNpb24gMjAxOS0xMC0yNSB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTWFuYWdlZE5GUHJvZmlsZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTQ0NTciOwogIH0KCiAgcmV2aXNpb24gMjAxOS0xMC0xNiB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgU0FQIGFuZCB1c2FnZVN0YXRlLiI7CiAgICByZWZlcmVuY2UgIlM1LTE5MzUxOCI7CiAgfQoKICByZXZpc2lvbiAyMDE5LTA2LTIzIHsKICAgIHJlZmVyZW5jZSAgIkluaXRpYWwgdmVyc2lvbi4iOwogIH0KCiAgdHlwZWRlZiBFbmFibGVkRGlzYWJsZWQgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgOwogICAgICBlbnVtIEVOQUJMRUQgOwogICAgfQogIH0KICAKICBncm91cGluZyBQcm9jZXNzTW9uaXRvciB7CiAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgYXR0cmlidXRlcyB0byBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZiBwcm9jZXNzZXMgCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuIAogICAgICBJdCBtYXkgYmUgdXNlZCBhcyBkYXRhIHR5cGUgZm9yIGRlZGljYXRlZCBwcm9ncmVzcyBtb25pdG9yIGF0dHJpYnV0ZXMgCiAgICAgIHdoZW4gc3BlY2lmeWluZyB0aGUgbWFuYWdlbWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSBwcm9jZXNzZXMuIAogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LiAKICAgICAgRm9yIHNvbWUgYXR0cmlidXRlcyBzcGVjaWFsaXNhdGlvbnMgbWF5IGJlIHByb3ZpZGVkIHdoZW4gc3BlY2lmeWluZyBhIAogICAgICBjb25jcmV0ZSBwcm9jZXNzIHJlcHJlc2VudGF0aW9uLgoKICAgICAgSWYgYSBtYW5hZ2VtZW50IG9wZXJhdGlvbiBvbiBzb21lIElPQ3MgdHJpZ2dlcnMgYW4gYXNzb2NpYXRlZCAKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkIAogICAgICBhbHNvIHJlc3VsdCBpbiBjcmVhdGluZyBhbiBhdHRyaWJ1dGUgbmFtZWQgJ3Byb2Nlc3NNb25pdG9yJyAob2YgdHlwZSAKICAgICAgJ1Byb2Nlc3NNb25pdG9yJykgaW4gdGhlc2UgSU9DKHMpLiBUaGUgcHJvY2Vzc01vbml0b3IgYXR0cmlidXRlIG1heSBiZSAKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGVzLiBBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbnMgZm9yIAogICAgICB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIG1heSBiZSBwcm92aWRlZCBieSB0aGUgJ3Byb2dyZXNzU3RhdGVJbmZvJyBhbmQgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnIAogICAgICBhbmQgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvICcwJy4gVGhlIE1uUyBwcm9kdWNlciBkZWNpZGVzIHdoZW4gdG8gCiAgICAgIHN0YXJ0IGV4ZWN1dGluZyB0aGUgcHJvY2VzcyBhbmQgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSAnUlVOTklORycgc3RhdGUuIAogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlIAogICAgICBwcm9jZXNzIG1heSBzdGFydCB0byBleGVjdXRlIGRpcmVjdGx5IHVwb24gaXRzIGluc3RhbnRpYXRpb24uIE9uZSAKICAgICAgYWx0ZXJuYXRpdmUgbXVzdCBiZSBzZWxlY3RlZCB3aGVuIHVzaW5nIHRoaXMgZGF0YSB0eXBlLgoKICAgICAgRHVyaW5nIHRoZSAnUlVOTklORycgc3RhdGUgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZSBtYXkgYmUgCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8gCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24uIFRoZSAncHJvZ3Jlc3NJbmZvJyBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gCiAgICAgIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIGluIHRoZSAnTk9UX1JVTk5JTkcnLCAnQ0FOQ0VMTElORycgCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mIAogICAgICAncHJvZ3Jlc3NTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyAKICAgICAgdXNlZC4KCiAgICAgIFVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBwcm9jZXNzLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIHNldCAKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluIAogICAgICB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gQWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIG1heSBiZSBwcm92aWRlZCAKICAgICAgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4gVGhlIHR5cGUgb2YgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuIAogICAgICBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mICdyZXN1bHRTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCAKICAgICAgd2hlcmUgdGhpcyBkYXRhIHR5cGUgaXMgdXNlZC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgZmFpbHMgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCB0aGUgJ3N0YXR1cycgCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZiAKICAgICAgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLCBhbmQgdGhlIHRpbWUgY2FwdHVyZWQgaW4gJ2VuZFRpbWUnLiBUaGUgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIHNwZWNpZmllcyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZS4gCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbiAKICAgICAgdGhpcyBjbGF1c2UgaXMgdXNlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIGZhaWx1cmUgbWF5IGJlIHN1YmplY3QgZm9yIAogICAgICBmdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIGFzIHdlbGwuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGlzIGNhbmNlbGxlZCwgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBmaXJzdCBzZXQgdG8gCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuIAogICAgICBUaGUgdHJhbnNpdGlvbiB0byAnQ0FOQ0VMTEVEJyBpcyBjYXB0dXJlZCBpbiB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gCiAgICAgIFRoZSB2YWx1ZSBvZiAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4uIEFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCcgb3IgCiAgICAgICdDQU5DRUxMRUQnLiBJdCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgbWFraW5nIHRoZSBvdXRjb21lLCB0aGF0IHRoZSAKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzIAogICAgICBjcmVhdGlvbiwgZm9yIGV4YW1wbGUgYmVjYXVzZSByZXF1aXJlZCBkYXRhIG1heSBub3QgYmUgYXZhaWxhYmxlIGFueSAKICAgICAgbW9yZSBhZnRlciBhIGNlcnRhaW4gdGltZSwgb3IgdGhlIHByb2Nlc3Mgb3V0Y29tZSBpcyBuZWVkZWQgdW50aWwgYSAKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4gCiAgICAgIFRoZSB0aW1lIHVudGlsIHRoZSBNblMgcHJvZHVjZXIgYXV0b21hdGljYWxseSBjYW5jZWxzIHRoZSBwcm9jZXNzIGlzIAogICAgICBpbmRpY2F0ZWQgYnkgdGhlICd0aW1lcicgYXR0cmlidXRlLiI7CiAgICAgIAogICAgbGVhZiBpZCB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIklkIG9mIHRoZSBwcm9jZXNzLiBJdCBpcyB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIAogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KICAgIAogICAgbGVhZiBzdGF0dXMgeyAKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBOT1RfU1RBUlRFRCA7CiAgICAgICAgZW51bSBSVU5OSU5HIDsKICAgICAgICBlbnVtIENBTkNFTExJTkcgOwogICAgICAgIGVudW0gRklOSVNIRUQgOwogICAgICAgIGVudW0gRkFJTEVEIDsKICAgICAgICBlbnVtIFBBUlRJQUxMWV9GQUlMRUQgOwogICAgICAgIGVudW0gQ0FOQ0VMTEVEIDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlZmF1bHQgIFJVTk5JTkc7CiAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLiAKICAgICAgICBJdCBkb2VzIG5vdCByZXByZXNlbnQgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCAKICAgICAgICBwcm9jZXNzLiAiOwogICAgfQoKICAgIGxlYWYgcHJvZ3Jlc3NQZXJjZW50YWdlIHsKICAgICAgdHlwZSB1aW50OCB7CiAgICAgICAgcmFuZ2UgMC4uMTAwOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlByb2dyZXNzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MgYXMgcGVyY2VudGFnZSI7CiAgICB9CgogICAgbGVhZi1saXN0IHByb2dyZXNzU3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZyAKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgcmVzdWx0U3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEIGFuZCAnQ0FOQ0VMTEVEJy4gCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcyAKICAgICAgICBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBlcnJvciByZWFzb25zLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzaGFsbCBub3QgYmUgdXNlZCB0byBtYWtlIHRoZSBvdXRjb21lIG9mIHRoZSBwcm9jZXNzIAogICAgICAgIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsLCBpZiBhbnkuIEZvciB0aGlzIHB1cnBvc2UsIGRlZGljYXRlZCAKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mIAogICAgICAgIGEgc3BlY2lmaWMgcHJvY2Vzcy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiBzdGFydFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiU3RhcnQgdGltZSBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCBpLmUuIHRoZSB0aW1lIHdoZW4gdGhlIAogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsIAogICAgICAgICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJy4gCgogICAgICAgIElmIHRoZSB0aW1lIGlzIGluIHRoZSBmdXR1cmUsIGl0IGlzIHRoZSBlc3RpbWF0ZWQgdGltZSAKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvIAogICAgICAgIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIAogICAgICAgIE1uU19Qcm9kdWNlci4gCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCiAgICAgICAgCiAgICAgICAgT25jZSB0aGUgdGltZXIgaXMgc2V0LCB0aGUgY29uc3VtZXIgY2FuIG5vdCBjaGFuZ2UgaXQgYW55bW9yZS4gCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgIH0KICB9CiAgCiAgdHlwZWRlZiBUZW50aE9mRGVncmVlcyB7IAogICAgdHlwZSB1aW50MTYgeyAKICAgICAgcmFuZ2UgMC4uMzYwMDsgCiAgICB9CiAgICB1bml0cyAiMC4xIGRlZ3JlZXMiOwogICAgZGVzY3JpcHRpb24gIkEgc2luZ2xlIGludGVncmFsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gYW5nbGUgaW4gZGVncmVlcyAKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxhdGl0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIExvbmdpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTE4MC4wMDAwLi4rMTgwLjAwMDAiOyAKICAgIH0KICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgT25PZmYgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gT047CiAgICAgIGVudW0gT0ZGOwogICAgfQogIH0KICAKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcyAKICAvLyAgYmVpbmcgbW92ZWQgdG8gXzNncHAtNWdjLW5ybS1uZnByb2ZpbGUKICBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHsKICAgIGRlc2NyaXB0aW9uICJEZWZpbmVzIHByb2ZpbGUgZm9yIG1hbmFnZWQgTkYiOwogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjUwMSI7CiAgICAKICAgIGxlYWYgaWR4IHsgdHlwZSB1aW50MzIgOyB9CiAgICAKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLiAKICAgICAgICBUaGUgZm9ybWF0IG9mIHRoZSBORiBJbnN0YW5jZSBJRCBzaGFsbCBiZSBhIAogICAgICAgIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIChVVUlEKSB2ZXJzaW9uIDQsIAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMjMuNjU4IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggOwogICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgbGVuZ3RoIDg7CiAgICAgICAgcGF0dGVybiAnWzAxXSonOwogICAgICB9CiAgICB9CiAgICByZWZlcmVuY2UgImNsYXVzZSAyLjEwLjEgb2YgM0dQUCBUUyAyMy4wMDMiOwogIH0KCiAgdHlwZWRlZiBBbWZTZXRJZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDE2IHsKICAgICAgICByYW5nZSAnMC4uMTAyMyc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mUG9pbnRlciB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CiAgICAgICAgCiAgZ3JvdXBpbmcgQW1mSWRlbnRpZmllciB7ICAgICAgICAKICAgIGxlYWYgYW1mUmVnaW9uSWQgewogICAgICB0eXBlIEFtZlJlZ2lvbklkOwogICAgfQogICAgbGVhZiBhbWZTZXRJZCB7CiAgICAgIHR5cGUgQW1mU2V0SWQ7CiAgICB9CiAgICBsZWFmIGFtZlBvaW50ZXIgewogICAgICB0eXBlIEFtZlBvaW50ZXI7CiAgICB9IAogICAgZGVzY3JpcHRpb24gIlRoZSBBTUZJIGlzIGNvbnN0cnVjdGVkIGZyb20gYW4gQU1GIFJlZ2lvbiBJRCwgCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLiAKICAgICAgVGhlIEFNRiBSZWdpb24gSUQgaWRlbnRpZmllcyB0aGUgcmVnaW9uLCAKICAgICAgdGhlIEFNRiBTZXQgSUQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgQU1GIFNldCB3aXRoaW4gdGhlIEFNRiBSZWdpb24sIGFuZCAKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7IAogIH0gICAgCgovLyB0eXBlIGRlZmluaXRpb25zIGVzcGVjaWFsbHkgZm9yIGNvcmUgTkZzCgogIHR5cGVkZWYgTmZUeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE5SRjsKICAgICAgZW51bSBVRE07CiAgICAgIGVudW0gQU1GOwogICAgICBlbnVtIFNNRjsKICAgICAgZW51bSBBVVNGOwogICAgICBlbnVtIE5FRjsKICAgICAgZW51bSBQQ0Y7CiAgICAgIGVudW0gU01TRjsKICAgICAgZW51bSBOU1NGOwogICAgICBlbnVtIFVEUjsKICAgICAgZW51bSBMTUY7CiAgICAgIGVudW0gR01MQzsKICAgICAgZW51bSA1R19FSVI7CiAgICAgIGVudW0gU0VQUDsKICAgICAgZW51bSBVUEY7CiAgICAgIGVudW0gTjNJV0Y7CiAgICAgIGVudW0gQUY7CiAgICAgIGVudW0gVURTRjsKICAgICAgZW51bSBCU0Y7CiAgICAgIGVudW0gQ0hGOwogICAgfSAgICAgICAgICAKICB9CiAgCiAgdHlwZWRlZiBOb3RpZmljYXRpb25UeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE4xX01FU1NBR0VTOwogICAgICBlbnVtIE4yX0lORk9STUFUSU9OOwogICAgICBlbnVtIExPQ0FUSU9OX05PVElGSUNBVElPTjsKICAgIH0gICAgICAKICB9CiAgCiAgdHlwZWRlZiBMb2FkIHsKICAgIGRlc2NyaXB0aW9uICJMYXRlc3Qga25vd24gbG9hZCBpbmZvcm1hdGlvbiBvZiB0aGUgTkYsIHBlcmNlbnRhZ2UgIjsKICAgIHR5cGUgdWludDggewogICAgICByYW5nZSAwLi4xMDA7CiAgICB9CiAgfQoKICB0eXBlZGVmIE4xTWVzc2FnZUNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIDVHTU07CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTFBQOwogICAgICBlbnVtIFNNUzsgCiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTjJJbmZvcm1hdGlvbkNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNNOwogICAgICBlbnVtIE5SUFBBOwogICAgICBlbnVtIFBXUzsKICAgICAgZW51bSBQV1NfQkNBTDsKICAgICAgZW51bSBQV1NfUkY7CiAgICB9ICAgICAgICAgICAgICAKICB9CiAgCiAgZ3JvdXBpbmcgRGVmYXVsdE5vdGlmaWNhdGlvblN1YnNjcmlwdGlvbiB7CiAgICAKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KICAgIAogICAgbGVhZiBjYWxsYmFja1VyaSB7CiAgICAgIHR5cGUgaW5ldDp1cmk7CiAgICB9CiAgICAKICAgIGxlYWYgbjFNZXNzYWdlQ2xhc3MgewogICAgICB0eXBlIE4xTWVzc2FnZUNsYXNzOwogICAgfQogICAgCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfSAgICAKICB9ICAKICAgICAgICAKICBncm91cGluZyBJcHY0QWRkcmVzc1JhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjQtYWRkcmVzczsKICAgIH0gICAgCiAgfQogICAgCiAgZ3JvdXBpbmcgSXB2NlByZWZpeFJhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICBsZWFmIGVuZCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9ICAgIAogIH0KICAgICAKICB0eXBlZGVmIE5zaUlkIHsKICAgIHR5cGUgc3RyaW5nOwogIH0KICAgIAogIHR5cGVkZWYgVWVNb2JpbGl0eUxldmVsIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNUQVRJT05BUlk7CiAgICAgIGVudW0gTk9NQURJQzsKICAgICAgZW51bSBSRVNUUklDVEVEX01PQklMSVRZOwogICAgICBlbnVtIEZVTExZX01PQklMSVRZOwogICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBSZXNvdXJjZVNoYXJpbmdMZXZlbCB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU0hBUkVEOwogICAgICAgIGVudW0gTk9UX1NIQVJFRDsKICAgICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBUeERpcmVjdGlvbiB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gREw7CiAgICAgICAgZW51bSBVTDsKICAgICAgICBlbnVtIERMX0FORF9VTDsKICAgICAgfQogIH0KICAgICAgCiAgZ3JvdXBpbmcgQWRkcmVzc1dpdGhWbGFuIHsKICAgIGxlYWYgaXBBZGRyZXNzIHsKICAgICAgdHlwZSBpbmV0OmlwLWFkZHJlc3M7ICAgCiAgICB9CiAgICBsZWFmIHZsYW5JZCB7CiAgICAgICB0eXBlIHVpbnQxNjsKICAgIH0gIAogIH0KICAKICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgLy8gVE9ETyBpcyB0aGlzIGVxdWl2YWxlbnQgdG8gVFMgMzIuMzAwID8KICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissXSkqJwogICAgICAgICsgJyhcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nCiAgICAgICAgKyAnWyxcK10pKlthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KScKICAgICAgICArICd8W15cXD48OyIrLF0pKihcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nOyAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIAogICAgICBvZiBEaXN0aW5ndWlzaGVkIE5hbWUgKFJGQyA0NTEyKS4gCiAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIERpc3Rpbmd1aXNoZWROYW1lIFJFR0VYIGlzOgogICAgICB7QXR0cmlidXRlVHlwZSA9IEF0dHJpYnV0ZVZhbHVlfSAgIAoKICAgICAgQXR0cmlidXRlVHlwZSBjb25zaXN0cyBvZiBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbiAoT0lEcyBub3QgYWxsb3dlZCkuIAogICAgICBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcmVzdHJpY3RlZC4KICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW5ub3QgY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgb3IgdGhlIAogICAgICAgIGZvbGxvd2luZyBjaGFyYWN0ZXJzIDogXFwgPiA8IDsgXCIgKyAsIChDb21tYSkgYW5kIFdoaXRlIHNwYWNlCiAgICAgIFRoZSBBdHRyaWJ1dGUgdmFsdWUgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGlmIHRoZXkgCiAgICAgICAgYXJlIGV4Y2FwZWQgOiBcXCA+IDwgOyBcIiArICwgKENvbW1hKSBhbmQgV2hpdGUgc3BhY2UKICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW4gY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgaWYgaXRzIGFuIGVzY2FwZWQgCiAgICAgICAgZG91YmxlIGRpZ2l0IGhleCBudW1iZXIuCiAgICAgICAgRXhhbXBsZXMgY291bGQgYmUgCiAgICAgICAgICBVSUQ9bm9ib2R5QGV4YW1wbGUuY29tLERDPWV4YW1wbGUsREM9Y29tCiAgICAgICAgICAgIENOPUpvaG4gU21pdGgsT1U9U2FsZXMsTz1BQ01FIExpbWl0ZWQsTD1Nb2FiLFNUPVV0YWgsQz1VUyI7CiAgICByZWZlcmVuY2UgICJSRkMgNDUxMiBMaWdodHdlaWdodCBEaXJlY3RvcnkgQWNjZXNzIFByb3RvY29sIChMREFQKToKICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBJbmZvcm1hdGlvbiBNb2RlbHMiOwogIH0gLy8gcmVjaGVjayByZWdleHAgaXQgZG9lc24ndCBoYW5kbGUgcG9zaXggWzpjbnRybDpdCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KfQ== ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= ietf-inet-types urn:ietf:params:xml:ns:yang:ietf-inet-types \N [] 2013-07-15 bW9kdWxlIGlldGYtaW5ldC10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtaW5ldC10eXBlcyI7CiAgcHJlZml4ICJpbmV0IjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcyBmb3IgSW50ZXJuZXQgYWRkcmVzc2VzIGFuZCByZWxhdGVkIHRoaW5ncy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSBpcC1hZGRyZXNzLW5vLXpvbmUKICAgICAgLSBpcHY0LWFkZHJlc3Mtbm8tem9uZQogICAgICAtIGlwdjYtYWRkcmVzcy1uby16b25lIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBwcm90b2NvbCBmaWVsZHMgKioqLwoKICB0eXBlZGVmIGlwLXZlcnNpb24gewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gdW5rbm93biB7CiAgICAgICAgdmFsdWUgIjAiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJBbiB1bmtub3duIG9yIHVuc3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlIEludGVybmV0CiAgICAgICAgICBwcm90b2NvbC4iOwogICAgICB9CiAgICAgIGVudW0gaXB2NCB7CiAgICAgICAgdmFsdWUgIjEiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJUaGUgSVB2NCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA3OTEuIjsKICAgICAgfQogICAgICBlbnVtIGlwdjYgewogICAgICAgIHZhbHVlICIyIjsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAiVGhlIElQdjYgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMgMjQ2MC4iOwogICAgICB9CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgdGhlIElQIHByb3RvY29sLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEluZXRWZXJzaW9uIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgIDc5MTogSW50ZXJuZXQgUHJvdG9jb2wKICAgICAgUkZDIDI0NjA6IEludGVybmV0IFByb3RvY29sLCBWZXJzaW9uIDYgKElQdjYpIFNwZWNpZmljYXRpb24KICAgICAgUkZDIDQwMDE6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIEludGVybmV0IE5ldHdvcmsgQWRkcmVzc2VzIjsKICB9CgogIHR5cGVkZWYgZHNjcCB7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgIjAuLjYzIjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBkc2NwIHR5cGUgcmVwcmVzZW50cyBhIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIENvZGUgUG9pbnQKICAgICAgdGhhdCBtYXkgYmUgdXNlZCBmb3IgbWFya2luZyBwYWNrZXRzIGluIGEgdHJhZmZpYyBzdHJlYW0uCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBEc2NwIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzI4OTogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGZvciB0aGUgRGlmZmVyZW50aWF0ZWQKICAgICAgICAgICAgICAgIFNlcnZpY2VzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgMjQ3NDogRGVmaW5pdGlvbiBvZiB0aGUgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgRmllbGQKICAgICAgICAgICAgICAgIChEUyBGaWVsZCkgaW4gdGhlIElQdjQgYW5kIElQdjYgSGVhZGVycwogICAgICBSRkMgMjc4MDogSUFOQSBBbGxvY2F0aW9uIEd1aWRlbGluZXMgRm9yIFZhbHVlcyBJbgogICAgICAgICAgICAgICAgdGhlIEludGVybmV0IFByb3RvY29sIGFuZCBSZWxhdGVkIEhlYWRlcnMiOwogIH0KCiAgdHlwZWRlZiBpcHY2LWZsb3ctbGFiZWwgewogICAgdHlwZSB1aW50MzIgewogICAgICByYW5nZSAiMC4uMTA0ODU3NSI7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2Ni1mbG93LWxhYmVsIHR5cGUgcmVwcmVzZW50cyB0aGUgZmxvdyBpZGVudGlmaWVyIG9yIEZsb3cKICAgICAgTGFiZWwgaW4gYW4gSVB2NiBwYWNrZXQgaGVhZGVyIHRoYXQgbWF5IGJlIHVzZWQgdG8KICAgICAgZGlzY3JpbWluYXRlIHRyYWZmaWMgZmxvd3MuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSVB2NkZsb3dMYWJlbCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM1OTU6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIElQdjYgRmxvdyBMYWJlbAogICAgICBSRkMgMjQ2MDogSW50ZXJuZXQgUHJvdG9jb2wsIFZlcnNpb24gNiAoSVB2NikgU3BlY2lmaWNhdGlvbiI7CiAgfQoKICB0eXBlZGVmIHBvcnQtbnVtYmVyIHsKICAgIHR5cGUgdWludDE2IHsKICAgICAgcmFuZ2UgIjAuLjY1NTM1IjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBwb3J0LW51bWJlciB0eXBlIHJlcHJlc2VudHMgYSAxNi1iaXQgcG9ydCBudW1iZXIgb2YgYW4KICAgICAgSW50ZXJuZXQgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sIHN1Y2ggYXMgVURQLCBUQ1AsIERDQ1AsIG9yCiAgICAgIFNDVFAuICBQb3J0IG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IElBTkEuICBBIGN1cnJlbnQgbGlzdCBvZgogICAgICBhbGwgYXNzaWdubWVudHMgaXMgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuaWFuYS5vcmcvPi4KCiAgICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBudW1iZXIgdmFsdWUgemVybyBpcyByZXNlcnZlZCBieSBJQU5BLiAgSW4KICAgICAgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdmFsdWUgemVybyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4KICAgICAgYmUgZXhjbHVkZWQgYnkgc3VidHlwaW5nIHRoZSBwb3J0LW51bWJlciB0eXBlLgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSW5ldFBvcnROdW1iZXIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgNzY4OiBVc2VyIERhdGFncmFtIFByb3RvY29sCiAgICAgIFJGQyAgNzkzOiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbAogICAgICBSRkMgNDk2MDogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sCiAgICAgIFJGQyA0MzQwOiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKERDQ1ApCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBhdXRvbm9tb3VzIHN5c3RlbXMgKioqLwoKICB0eXBlZGVmIGFzLW51bWJlciB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBhcy1udW1iZXIgdHlwZSByZXByZXNlbnRzIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlcnMKICAgICAgd2hpY2ggaWRlbnRpZnkgYW4gQXV0b25vbW91cyBTeXN0ZW0gKEFTKS4gIEFuIEFTIGlzIGEgc2V0CiAgICAgIG9mIHJvdXRlcnMgdW5kZXIgYSBzaW5nbGUgdGVjaG5pY2FsIGFkbWluaXN0cmF0aW9uLCB1c2luZwogICAgICBhbiBpbnRlcmlvciBnYXRld2F5IHByb3RvY29sIGFuZCBjb21tb24gbWV0cmljcyB0byByb3V0ZQogICAgICBwYWNrZXRzIHdpdGhpbiB0aGUgQVMsIGFuZCB1c2luZyBhbiBleHRlcmlvciBnYXRld2F5CiAgICAgIHByb3RvY29sIHRvIHJvdXRlIHBhY2tldHMgdG8gb3RoZXIgQVNlcy4gIElBTkEgbWFpbnRhaW5zCiAgICAgIHRoZSBBUyBudW1iZXIgc3BhY2UgYW5kIGhhcyBkZWxlZ2F0ZWQgbGFyZ2UgcGFydHMgdG8gdGhlCiAgICAgIHJlZ2lvbmFsIHJlZ2lzdHJpZXMuCgogICAgICBBdXRvbm9tb3VzIHN5c3RlbSBudW1iZXJzIHdlcmUgb3JpZ2luYWxseSBsaW1pdGVkIHRvIDE2CiAgICAgIGJpdHMuICBCR1AgZXh0ZW5zaW9ucyBoYXZlIGVubGFyZ2VkIHRoZSBhdXRvbm9tb3VzIHN5c3RlbQogICAgICBudW1iZXIgc3BhY2UgdG8gMzIgYml0cy4gIFRoaXMgdHlwZSB0aGVyZWZvcmUgdXNlcyBhbiB1aW50MzIKICAgICAgYmFzZSB0eXBlIHdpdGhvdXQgYSByYW5nZSByZXN0cmljdGlvbiBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgIGEgbGFyZ2VyIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlciBzcGFjZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBJbmV0QXV0b25vbW91c1N5c3RlbU51bWJlciB0ZXh0dWFsIGNvbnZlbnRpb24gb2YKICAgICAgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDE5MzA6IEd1aWRlbGluZXMgZm9yIGNyZWF0aW9uLCBzZWxlY3Rpb24sIGFuZCByZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgIG9mIGFuIEF1dG9ub21vdXMgU3lzdGVtIChBUykKICAgICAgUkZDIDQyNzE6IEEgQm9yZGVyIEdhdGV3YXkgUHJvdG9jb2wgNCAoQkdQLTQpCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcwogICAgICBSRkMgNjc5MzogQkdQIFN1cHBvcnQgZm9yIEZvdXItT2N0ZXQgQXV0b25vbW91cyBTeXN0ZW0gKEFTKQogICAgICAgICAgICAgICAgTnVtYmVyIFNwYWNlIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIElQIGFkZHJlc3NlcyBhbmQgaG9zdG5hbWVzICoqKi8KCiAgdHlwZWRlZiBpcC1hZGRyZXNzIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgICB0eXBlIGluZXQ6aXB2Ni1hZGRyZXNzOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGlwLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBzdXBwb3J0cyBzY29wZWQgYWRkcmVzc2VzCiAgICAgIGJ5IGFsbG93aW5nIHpvbmUgaWRlbnRpZmllcnMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQwMDc6IElQdjYgU2NvcGVkIEFkZHJlc3MgQXJjaGl0ZWN0dXJlIjsKICB9CgogIHR5cGVkZWYgaXB2NC1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybgogICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICsgICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKScKICAgICAgKyAnKCVbXHB7Tn1ccHtMfV0rKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIlRoZSBpcHY0LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBpbgogICAgICAgZG90dGVkLXF1YWQgbm90YXRpb24uICBUaGUgSVB2NCBhZGRyZXNzIG1heSBpbmNsdWRlIGEgem9uZQogICAgICAgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgICBUaGUgem9uZSBpbmRleCBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBpZGVudGljYWwgYWRkcmVzcwogICAgICAgdmFsdWVzLiAgRm9yIGxpbmstbG9jYWwgYWRkcmVzc2VzLCB0aGUgem9uZSBpbmRleCB3aWxsCiAgICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgIGludGVyZmFjZS4gIElmIHRoZSB6b25lIGluZGV4IGlzIG5vdCBwcmVzZW50LCB0aGUgZGVmYXVsdAogICAgICAgem9uZSBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgdXNlZC4KCiAgICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgdGhlIHpvbmUgaW5kZXggaXMgdGhlIG51bWVyaWNhbAogICAgICAgZm9ybWF0IjsKICB9CgogIHR5cGVkZWYgaXB2Ni1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoJVtccHtOfVxwe0x9XSspPyc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKCUuKyk/JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzcyBpbiBmdWxsLAogICAgICBtaXhlZCwgc2hvcnRlbmVkLCBhbmQgc2hvcnRlbmVkLW1peGVkIG5vdGF0aW9uLiAgVGhlIElQdjYKICAgICAgYWRkcmVzcyBtYXkgaW5jbHVkZSBhIHpvbmUgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgIFRoZSB6b25lIGluZGV4IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGlkZW50aWNhbCBhZGRyZXNzCiAgICAgIHZhbHVlcy4gIEZvciBsaW5rLWxvY2FsIGFkZHJlc3NlcywgdGhlIHpvbmUgaW5kZXggd2lsbAogICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgaW50ZXJmYWNlLiAgSWYgdGhlIHpvbmUgaW5kZXggaXMgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0CiAgICAgIHpvbmUgb2YgdGhlIGRldmljZSB3aWxsIGJlIHVzZWQuCgogICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBvZiBJUHY2IGFkZHJlc3NlcyB1c2VzIHRoZSB0ZXh0dWFsCiAgICAgIHJlcHJlc2VudGF0aW9uIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiAgVGhlCiAgICAgIGNhbm9uaWNhbCBmb3JtYXQgZm9yIHRoZSB6b25lIGluZGV4IGlzIHRoZSBudW1lcmljYWwKICAgICAgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDExLjIgb2YgUkZDIDQwMDcuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDI5MTogSVAgVmVyc2lvbiA2IEFkZHJlc3NpbmcgQXJjaGl0ZWN0dXJlCiAgICAgIFJGQyA0MDA3OiBJUHY2IFNjb3BlZCBBZGRyZXNzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNTk1MjogQSBSZWNvbW1lbmRhdGlvbiBmb3IgSVB2NiBBZGRyZXNzIFRleHQKICAgICAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIjsKICB9CgogIHR5cGVkZWYgaXAtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzLW5vLXpvbmU7CiAgICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3Mtbm8tem9uZTsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcC1hZGRyZXNzLW5vLXpvbmUgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzCiAgICAgIElQIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHNjb3BlZAogICAgICBhZGRyZXNzZXMgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgem9uZSBpZGVudGlmaWVycyBpbiB0aGUKICAgICAgYWRkcmVzcyBmb3JtYXQuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUiOwogIH0KCiAgdHlwZWRlZiBpcHY0LWFkZHJlc3Mtbm8tem9uZSB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzIHsKICAgICAgcGF0dGVybiAnWzAtOVwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjQgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY0LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3MgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GOlwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjYgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY2LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQyOTE6IElQIFZlcnNpb24gNiBBZGRyZXNzaW5nIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICB0eXBlZGVmIGlwLXByZWZpeCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSBpbmV0OmlwdjQtcHJlZml4OwogICAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXAtcHJlZml4IHR5cGUgcmVwcmVzZW50cyBhbiBJUCBwcmVmaXggYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb25zCiAgICAgIGltcGxpZXMgdGhlIElQIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgaXB2NC1wcmVmaXggewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICArICAnKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSknCiAgICAgICArICcvKChbMC05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMl0pKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2NC1wcmVmaXggdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXguCiAgICAgIFRoZSBwcmVmaXggbGVuZ3RoIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZQogICAgICBzbGFzaCBjaGFyYWN0ZXIgYW5kIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYW4gSVB2NCBwcmVmaXggaGFzIGFsbCBiaXRzIG9mCiAgICAgIHRoZSBJUHY0IGFkZHJlc3Mgc2V0IHRvIHplcm8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCiAgICAgIElQdjQgcHJlZml4LiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtcHJlZml4IHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoLygoWzAtOV0pfChbMC05XXsyfSl8KDFbMC0xXVswLTldKXwoMTJbMC04XSkpKSc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKC8uKyknOwogICAgfQoKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LXByZWZpeCB0eXBlIHJlcHJlc2VudHMgYW4gSVB2NiBhZGRyZXNzIHByZWZpeC4KICAgICAgVGhlIHByZWZpeCBsZW5ndGggaXMgZ2l2ZW4gYnkgdGhlIG51bWJlciBmb2xsb3dpbmcgdGhlCiAgICAgIHNsYXNoIGNoYXJhY3RlciBhbmQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTI4LgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIElQdjYgYWRkcmVzcyBzaG91bGQgaGF2ZSBhbGwgYml0cyB0aGF0IGRvIG5vdCBiZWxvbmcKICAgICAgdG8gdGhlIHByZWZpeCBzZXQgdG8gemVyby4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGFuIElQdjYgcHJlZml4IGhhcyBhbGwgYml0cyBvZgogICAgICB0aGUgSVB2NiBhZGRyZXNzIHNldCB0byB6ZXJvIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZQogICAgICBJUHY2IHByZWZpeC4gIEZ1cnRoZXJtb3JlLCB0aGUgSVB2NiBhZGRyZXNzIGlzIHJlcHJlc2VudGVkCiAgICAgIGFzIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgZG9tYWluIG5hbWUgYW5kIFVSSSB0eXBlcyAqKiovCgogIHR5cGVkZWYgZG9tYWluLW5hbWUgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgJygoKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4pKicKICAgICAgKyAnKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4/KScKICAgICAgKyAnfFwuJzsKICAgICAgbGVuZ3RoICIxLi4yNTMiOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGRvbWFpbi1uYW1lIHR5cGUgcmVwcmVzZW50cyBhIEROUyBkb21haW4gbmFtZS4gIFRoZQogICAgICBuYW1lIFNIT1VMRCBiZSBmdWxseSBxdWFsaWZpZWQgd2hlbmV2ZXIgcG9zc2libGUuCgogICAgICBJbnRlcm5ldCBkb21haW4gbmFtZXMgYXJlIG9ubHkgbG9vc2VseSBzcGVjaWZpZWQuICBTZWN0aW9uCiAgICAgIDMuNSBvZiBSRkMgMTAzNCByZWNvbW1lbmRzIGEgc3ludGF4IChtb2RpZmllZCBpbiBTZWN0aW9uCiAgICAgIDIuMSBvZiBSRkMgMTEyMykuICBUaGUgcGF0dGVybiBhYm92ZSBpcyBpbnRlbmRlZCB0byBhbGxvdwogICAgICBmb3IgY3VycmVudCBwcmFjdGljZSBpbiBkb21haW4gbmFtZSB1c2UsIGFuZCBzb21lIHBvc3NpYmxlCiAgICAgIGZ1dHVyZSBleHBhbnNpb24uICBJdCBpcyBkZXNpZ25lZCB0byBob2xkIHZhcmlvdXMgdHlwZXMgb2YKICAgICAgZG9tYWluIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXMgdXNlZCBmb3IgQSBvciBBQUFBIHJlY29yZHMKICAgICAgKGhvc3QgbmFtZXMpIGFuZCBvdGhlciByZWNvcmRzLCBzdWNoIGFzIFNSViByZWNvcmRzLiAgTm90ZQogICAgICB0aGF0IEludGVybmV0IGhvc3QgbmFtZXMgaGF2ZSBhIHN0cmljdGVyIHN5bnRheCAoZGVzY3JpYmVkCiAgICAgIGluIFJGQyA5NTIpIHRoYW4gdGhlIEROUyByZWNvbW1lbmRhdGlvbnMgaW4gUkZDcyAxMDM0IGFuZAogICAgICAxMTIzLCBhbmQgdGhhdCBzeXN0ZW1zIHRoYXQgd2FudCB0byBzdG9yZSBob3N0IG5hbWVzIGluCiAgICAgIHNjaGVtYSBub2RlcyB1c2luZyB0aGUgZG9tYWluLW5hbWUgdHlwZSBhcmUgcmVjb21tZW5kZWQgdG8KICAgICAgYWRoZXJlIHRvIHRoaXMgc3RyaWN0ZXIgc3RhbmRhcmQgdG8gZW5zdXJlIGludGVyb3BlcmFiaWxpdHkuCgogICAgICBUaGUgZW5jb2Rpbmcgb2YgRE5TIG5hbWVzIGluIHRoZSBETlMgcHJvdG9jb2wgaXMgbGltaXRlZAogICAgICB0byAyNTUgY2hhcmFjdGVycy4gIFNpbmNlIHRoZSBlbmNvZGluZyBjb25zaXN0cyBvZiBsYWJlbHMKICAgICAgcHJlZml4ZWQgYnkgYSBsZW5ndGggYnl0ZXMgYW5kIHRoZXJlIGlzIGEgdHJhaWxpbmcgTlVMTAogICAgICBieXRlLCBvbmx5IDI1MyBjaGFyYWN0ZXJzIGNhbiBhcHBlYXIgaW4gdGhlIHRleHR1YWwgZG90dGVkCiAgICAgIG5vdGF0aW9uLgoKICAgICAgVGhlIGRlc2NyaXB0aW9uIGNsYXVzZSBvZiBzY2hlbWEgbm9kZXMgdXNpbmcgdGhlIGRvbWFpbi1uYW1lCiAgICAgIHR5cGUgTVVTVCBkZXNjcmliZSB3aGVuIGFuZCBob3cgdGhlc2UgbmFtZXMgYXJlIHJlc29sdmVkIHRvCiAgICAgIElQIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdCB0aGUgcmVzb2x1dGlvbiBvZiBhIGRvbWFpbi1uYW1lIHZhbHVlCiAgICAgIG1heSByZXF1aXJlIHRvIHF1ZXJ5IG11bHRpcGxlIEROUyByZWNvcmRzIChlLmcuLCBBIGZvciBJUHY0CiAgICAgIGFuZCBBQUFBIGZvciBJUHY2KS4gIFRoZSBvcmRlciBvZiB0aGUgcmVzb2x1dGlvbiBwcm9jZXNzIGFuZAogICAgICB3aGljaCBETlMgcmVjb3JkIHRha2VzIHByZWNlZGVuY2UgY2FuIGVpdGhlciBiZSBkZWZpbmVkCiAgICAgIGV4cGxpY2l0bHkgb3IgbWF5IGRlcGVuZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKICAgICAgcmVzb2x2ZXIuCgogICAgICBEb21haW4tbmFtZSB2YWx1ZXMgdXNlIHRoZSBVUy1BU0NJSSBlbmNvZGluZy4gIFRoZWlyIGNhbm9uaWNhbAogICAgICBmb3JtYXQgdXNlcyBsb3dlcmNhc2UgVVMtQVNDSUkgY2hhcmFjdGVycy4gIEludGVybmF0aW9uYWxpemVkCiAgICAgIGRvbWFpbiBuYW1lcyBNVVNUIGJlIEEtbGFiZWxzIGFzIHBlciBSRkMgNTg5MC4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgOTUyOiBEb0QgSW50ZXJuZXQgSG9zdCBUYWJsZSBTcGVjaWZpY2F0aW9uCiAgICAgIFJGQyAxMDM0OiBEb21haW4gTmFtZXMgLSBDb25jZXB0cyBhbmQgRmFjaWxpdGllcwogICAgICBSRkMgMTEyMzogUmVxdWlyZW1lbnRzIGZvciBJbnRlcm5ldCBIb3N0cyAtLSBBcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgYW5kIFN1cHBvcnQKICAgICAgUkZDIDI3ODI6IEEgRE5TIFJSIGZvciBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiBzZXJ2aWNlcwogICAgICAgICAgICAgICAgKEROUyBTUlYpCiAgICAgIFJGQyA1ODkwOiBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgaW4gQXBwbGljYXRpb25zCiAgICAgICAgICAgICAgICAoSUROQSk6IERlZmluaXRpb25zIGFuZCBEb2N1bWVudCBGcmFtZXdvcmsiOwogIH0KCiAgdHlwZWRlZiBob3N0IHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXAtYWRkcmVzczsKICAgICAgdHlwZSBpbmV0OmRvbWFpbi1uYW1lOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGhvc3QgdHlwZSByZXByZXNlbnRzIGVpdGhlciBhbiBJUCBhZGRyZXNzIG9yIGEgRE5TCiAgICAgIGRvbWFpbiBuYW1lLiI7CiAgfQoKICB0eXBlZGVmIHVyaSB7CiAgICB0eXBlIHN0cmluZzsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB1cmkgdHlwZSByZXByZXNlbnRzIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyCiAgICAgIChVUkkpIGFzIGRlZmluZWQgYnkgU1REIDY2LgoKICAgICAgT2JqZWN0cyB1c2luZyB0aGUgdXJpIHR5cGUgTVVTVCBiZSBpbiBVUy1BU0NJSSBlbmNvZGluZywKICAgICAgYW5kIE1VU1QgYmUgbm9ybWFsaXplZCBhcyBkZXNjcmliZWQgYnkgUkZDIDM5ODYgU2VjdGlvbnMKICAgICAgNi4yLjEsIDYuMi4yLjEsIGFuZCA2LjIuMi4yLiAgQWxsIHVubmVjZXNzYXJ5CiAgICAgIHBlcmNlbnQtZW5jb2RpbmcgaXMgcmVtb3ZlZCwgYW5kIGFsbCBjYXNlLWluc2Vuc2l0aXZlCiAgICAgIGNoYXJhY3RlcnMgYXJlIHNldCB0byBsb3dlcmNhc2UgZXhjZXB0IGZvciBoZXhhZGVjaW1hbAogICAgICBkaWdpdHMsIHdoaWNoIGFyZSBub3JtYWxpemVkIHRvIHVwcGVyY2FzZSBhcyBkZXNjcmliZWQgaW4KICAgICAgU2VjdGlvbiA2LjIuMi4xLgoKICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGhlbHAgcHJvdmlkZQogICAgICB1bmlxdWUgVVJJcy4gIE5vdGUgdGhhdCB0aGlzIG5vcm1hbGl6YXRpb24gaXMgbm90CiAgICAgIHN1ZmZpY2llbnQgdG8gcHJvdmlkZSB1bmlxdWVuZXNzLiAgVHdvIFVSSXMgdGhhdCBhcmUKICAgICAgdGV4dHVhbGx5IGRpc3RpbmN0IGFmdGVyIHRoaXMgbm9ybWFsaXphdGlvbiBtYXkgc3RpbGwgYmUKICAgICAgZXF1aXZhbGVudC4KCiAgICAgIE9iamVjdHMgdXNpbmcgdGhlIHVyaSB0eXBlIG1heSByZXN0cmljdCB0aGUgc2NoZW1lcyB0aGF0CiAgICAgIHRoZXkgcGVybWl0LiAgRm9yIGV4YW1wbGUsICdkYXRhOicgYW5kICd1cm46JyBzY2hlbWVzCiAgICAgIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZS4KCiAgICAgIEEgemVyby1sZW5ndGggVVJJIGlzIG5vdCBhIHZhbGlkIFVSSS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICAgZXhwcmVzcyAnVVJJIGFic2VudCcgd2hlcmUgcmVxdWlyZWQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgVXJpIFNNSXYyIHRleHR1YWwgY29udmVudGlvbiBkZWZpbmVkIGluIFJGQyA1MDE3LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM5ODY6IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKTogR2VuZXJpYyBTeW50YXgKICAgICAgUkZDIDMzMDU6IFJlcG9ydCBmcm9tIHRoZSBKb2ludCBXM0MvSUVURiBVUkkgUGxhbm5pbmcgSW50ZXJlc3QKICAgICAgICAgICAgICAgIEdyb3VwOiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUklzKSwgVVJMcywKICAgICAgICAgICAgICAgIGFuZCBVbmlmb3JtIFJlc291cmNlIE5hbWVzIChVUk5zKTogQ2xhcmlmaWNhdGlvbnMKICAgICAgICAgICAgICAgIGFuZCBSZWNvbW1lbmRhdGlvbnMKICAgICAgUkZDIDUwMTc6IE1JQiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBVbmlmb3JtIFJlc291cmNlCiAgICAgICAgICAgICAgICBJZGVudGlmaWVycyAoVVJJcykiOwogIH0KCn0K ietf-yang-types urn:ietf:params:xml:ns:yang:ietf-yang-types \N [] 2013-07-15 bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQo= -o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5ncywgT3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycCBvciBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9wb2xvZ3kgb2JqZWN0cy4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOwoKICAgIGxpc3QgQ2xvdWRpZmllZE5GIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBSQU4gTmV0d29yayBGdW5jdGlvbiBzb2Z0d2FyZSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBPLUNsb3VkIHZpYSBvbmUgb3IgbW9yZSBORiBEZXBsb3ltZW50cy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWRpZmllZCBORiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5GRGVwbG95bWVudCB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgc29mdHdhcmUgZGVwbG95bWVudCBvbiBPLUNsb3VkIHJlc291cmNlcyB0aGF0IHJlYWxpemVzLCBhbGwgb3IgcGFydCBvZiwgYSBDbG91ZGlmaWVkIE5GLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBORiBEZXBsb3ltZW50IjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkTmFtZXNwYWNlIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGlzb2xhdGluZwogICAgICAgIGdyb3VwcyBvZiByZXNvdXJjZXMgd2l0aGluIGEgc2luZ2xlIGNsdXN0ZXIuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIE5hbWVzcGFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5vZGVDbHVzdGVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBOb2RlQ2x1c3RlciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBOb2Rlcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgTm9kZSBDbHVzdGVyIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkU2l0ZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIGluZnJhc3RydWN0dXJlIHRoYXQKICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBDTE9VRElGSUVETkZfQ09NUFJJU0VTX05GREVQTE9ZTUVOVCB7IC8vIDEgdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGNvbXByaXNlZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBjb21wcmlzZXMgb2YgdGhlc2UgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQ2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBjb21wcmlzZWQtYnktY2xvdWRpZmllZE5GIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgcGFydCBvZiBDbG91ZGlmaWVkIE5GLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX0RFUExPWUVEX09OX09DTE9VRE5BTUVTUEFDRSB7IC8vIDEuLm4gdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9uLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IGRlcGxveWVkIG9uIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk9DbG91ZCBOYW1lc3BhY2UgZGVwbG95cyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NMT1VETkFNRVNQQUNFX0RFUExPWUVEX09OX05PREVDTFVTVEVSIHsgLy8gMS4ubiB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLW9uLW5vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgTmFtZXNwYWNlIGRlcGxveWVkIG9uIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0Nsb3VkTmFtZXNwYWNlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb2RlIENsdXN0ZXIgZGVwbG95cyBPLUNsb3VkIE5hbWVzcGFjZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTk9ERUNMVVNURVJfTE9DQVRFRF9BVF9PQ0xPVURTSVRFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRlZC1hdC1vY2xvdWRTaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBsb2NhdGVkIGF0IE8tQ2xvdWQgU2l0ZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRpb24tb2Ytb25vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgU2l0ZSBpcyBsb2NhdGlvbiBvZiBOb2RlIENsdXN0ZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMgJ3gueS56JyAtIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2025-01-17 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgaWV0Zi15YW5nLXR5cGVzIHsgcHJlZml4IHlhbmc7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNS0wMS0xNyIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBmaXJzdERpc2NvdmVyZWQgYW5kIGxhc3RNb2RpZmllZCB0byBtZXRhZGF0YSBjb250YWluZXIiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyBhbmQgRGlzY292ZXJ5IGFuZCBSZWNvbmNpbGlhdGlvbiBBZGFwdGVyLgogICAgICAgICAgICBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwKICAgICAgICAgICAgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgbGVhZiByZWxpYWJpbGl0eUluZGljYXRvciB7CiAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgZW51bSBPSyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIGlzIGluIGFsaWdubWVudCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsCiAgICAgICAgICAgICAgICAgICAgYXMgZmFyIGFzIFRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZQogICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIGFuZCBwb3RlbnRpYWxseSBub3QgYWxpZ25lZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGguIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxlYWYgZmlyc3REaXNjb3ZlcmVkIHsKICAgICAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGFuIGluc3RhbmNlIG9mIFRvcG9sb2d5IEVudGl0eSBvciBSZWxhdGlvbgogICAgICAgICAgICB3YXMgZmlyc3QgcmVwcmVzZW50ZWQgaW4gVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyB2aWEgZGlzY292ZXJ5LiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGxhc3RNb2RpZmllZCB7CiAgICAgICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiBhbiBpbnN0YW5jZSBvZiBUb3BvbG9neSBFbnRpdHkgb3IgUmVsYXRpb24KICAgICAgICAgICAgd2FzIGxhc3QgdXBkYXRlZCAoZXhjbHVkaW5nIGNsYXNzaWZpZXJzIGFuZCBkZWNvcmF0b3JzKS4iOwogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-10-21 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgaW5zdGFsbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9JTlNUQUxMRURfQVRfU0lURSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2l0ZSB0eXBlLgogICAgICAgICAgICBUaGUgU2l0ZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgQW50ZW5uYU1vZHVsZSBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIGF0IG9uZSBTaXRlLgogICAgICAgICAgICBBIFNpdGUgaW5zdGFuY2UgY2FuIGhhdmUgbWFueSBpbnN0YWxsZWQgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gT0FNOwoKICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9 -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== -o-ran-smo-teiv-rel-cloud-ran urn:o-ran:smo-teiv-rel-cloud-ran REL_CLOUD_RAN ["o-ran-smo-teiv-cloud", "o-ran-smo-teiv-ran"] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9DTE9VRF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09EVUZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VDUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0NVVVBGVU5DVElPTiB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1VUCBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tQ1UtVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9DVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX05FQVJSVFJJQ0ZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhclJUUklDRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBOZWFyUlRSSUNGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46TmVhclJUUklDRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== -o-ran-smo-teiv-rel-oam-cloud urn:o-ran:smo-teiv-rel-oam-cloud REL_OAM_CLOUD ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-cloud"] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX0NMT1VEOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfREVQTE9ZRURfQVNfQ0xPVURJRklFRE5GIHsgIC8vIDAuLjEgdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBkZXBsb3llZC1hcy1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IGRlcGxveWVkIGFzIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGRlcGxveWVkLW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkaWZpZWQgTkYgZGVwbG95cyBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtY2xvdWQ6Q2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTUFOQUdFREVMRU1FTlQgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgc2VydmljZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 -o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-cloud-ran urn:o-ran:smo-teiv-rel-cloud-ran REL_CLOUD_RAN ["o-ran-smo-teiv-cloud", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBncm91cGluZywgT3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycCB0byB0aGUgdG9wb2xvZ3kgb2JqZWN0LiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0NMT1VEX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0RVRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09DVUNQRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VVUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-oam-cloud urn:o-ran:smo-teiv-rel-oam-cloud REL_OAM_CLOUD ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-cloud"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fQ0xPVUQ7CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9ERVBMT1lFRF9BU19DTE9VRElGSUVETkYgeyAgLy8gMC4uMSB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLWFzLWNsb3VkaWZpZWRORiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgZGVwbG95ZWQgYXMgQ2xvdWRpZmllZCBORi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZGVwbG95ZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBkZXBsb3lzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1jbG91ZDpDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19NQU5BR0VERUxFTUVOVCB7IC8vIDEuLm4gdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBzZXJ2aWNlZC1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LW9hbTpNYW5hZ2VkRWxlbWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud ["name"] @@ -504,7 +504,7 @@ o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran ["oruId"] o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran ["azimuth", "geo-location", "sectorId"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ANTENNAMODULE_INSTALLED_AT_SITE installed-at-site AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 installed-antennaModule Site o-ran-smo-teiv-equipment 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran ANTENNAMODULE_SERVES_NRCELLDU serviced-nrCellDu AntennaModule o-ran-smo-teiv-equipment 1 9223372036854775807 serving-antennaModule NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran diff --git a/charts/smo/topology-exposure-inventory/resources/init_sql/01_init-teiv-exposure-data.sql b/charts/smo/topology-exposure-inventory/resources/init_sql/01_init-teiv-exposure-data.sql index 138e865..18d54ef 100644 --- a/charts/smo/topology-exposure-inventory/resources/init_sql/01_init-teiv-exposure-data.sql +++ b/charts/smo/topology-exposure-inventory/resources/init_sql/01_init-teiv-exposure-data.sql @@ -29,27 +29,27 @@ GRANT USAGE ON SCHEMA topology to topology_exposure_user; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO topology_exposure_user; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO topology_exposure_user; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; -SET ROLE 'topology_exposure_user'; +SET ROLE topology_exposure_user; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -59,24 +59,24 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' -);CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' +);CREATE TABLE IF NOT EXISTS teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, @@ -86,13 +86,13 @@ SELECT ties_data.create_constraint_if_not_exists( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( +CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_AntennaCapability" TEXT, @@ -102,13 +102,13 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "metadata" jsonb ); -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -117,13 +117,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCloudNamespace" TEXT, @@ -133,13 +133,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -160,25 +160,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( "id" TEXT, "aSide_NodeCluster" TEXT, "bSide_OCloudSite" TEXT, @@ -188,13 +188,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -203,13 +203,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -224,19 +224,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -246,13 +246,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, @@ -283,25 +283,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_Site" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -311,13 +311,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-oam_ManagedElement" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -331,19 +331,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ( "id" TEXT, "eUtranFqBands" jsonb, "geranFqBands" jsonb, @@ -354,13 +354,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellCU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -378,19 +378,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellDU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -414,25 +414,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "id" TEXT, "arfcnDL" INTEGER, "arfcnUL" INTEGER, @@ -463,31 +463,31 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "id" TEXT, "nearRtRicId" BIGINT, "pLMNId" jsonb, @@ -503,19 +503,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "id" TEXT, "gNBCUName" TEXT, "gNBId" BIGINT, @@ -533,19 +533,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "id" TEXT, "gNBId" BIGINT, "gNBIdLength" INTEGER, @@ -562,19 +562,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -592,19 +592,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ORUFunction" ( "id" TEXT, "oruId" BIGINT, "CD_sourceIds" jsonb, @@ -619,19 +619,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_Sector" ( "id" TEXT, "azimuth" DECIMAL, "geo-location" geography, @@ -642,13 +642,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUCPFunction" TEXT, @@ -658,13 +658,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUUPFunction" TEXT, @@ -674,13 +674,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_ODUFunction" TEXT, @@ -690,13 +690,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_NRCellDU" TEXT, @@ -706,794 +706,794 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMO "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_CloudifiedNF', 'PK_o-ran-smo-teiv-cloud_CloudifiedNF_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'PK_o-ran-smo-teiv-cloud_NFDeployment_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NodeCluster', 'PK_o-ran-smo-teiv-cloud_NodeCluster_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'PK_o-ran-smo-teiv-cloud_OCloudNamespace_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudSite', 'PK_o-ran-smo-teiv-cloud_OCloudSite_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_Site', 'PK_o-ran-smo-teiv-equipment_Site_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'PK_o-ran-smo-teiv-oam_ManagedElement_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_AntennaCapability', 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'PK_o-ran-smo-teiv-ran_NRCellCU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'PK_o-ran-smo-teiv-ran_NRCellDU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'PK_o-ran-smo-teiv-ran_NRSectorCarrier_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'PK_o-ran-smo-teiv-ran_NearRTRICFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'PK_o-ran-smo-teiv-ran_OCUCPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'PK_o-ran-smo-teiv-ran_OCUUPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'PK_o-ran-smo-teiv-ran_ODUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'PK_o-ran-smo-teiv-ran_ORUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_Sector', 'PK_o-ran-smo-teiv-ran_Sector_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'PK_E551D02D14B3C04A565DC73A386BEB29627D3C08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'PK_F41873285F3BD831F63C6041B4356A063403406D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_A08D274894ECB6799E56C2089A494AF0345B9B16', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_888BF6FF782916E61B3FE80643A549A1CFDB6117', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudSite" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES ties_data."o-ran-smo-teiv-equipment_Site" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES teiv_data."o-ran-smo-teiv-equipment_Site" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_078764B2F3D613D44CC6E3586F564C83164D2481', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'FK_899B8130A861D1450FC49D3159D8B29C0628A717', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_65D538D54EB33081C808540235FEB28823428E64', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'UNIQUE_E020461673334EB824643649B6B31670FB064EC8', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'FK_122DD9709032528D161177B3624AD7AAF6589005', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_8585D545BC37A473A298E0F5F5942F897A7105B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUUPFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_8605800A4923C52258A8CE3989E18A7C93D22E8C', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); +CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); -CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); +CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); -CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); +CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); -CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); +CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); -CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); +CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); -CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); +CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); -CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); -CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); +CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); -CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); +CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); -CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ODUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_Site"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_Site"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NodeCluster"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NodeCluster"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUCPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; +ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU"; -ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDeployment"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDeployment"; -ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability"; -ANALYZE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; +ANALYZE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ORUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ORUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellCU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellCU"; -ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; +ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUUPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier"; -ANALYZE ties_data."o-ran-smo-teiv-ran_Sector"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_Sector"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudSite"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudSite"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace"; COMMIT; diff --git a/charts/smo/topology-exposure-inventory/resources/init_sql/02_init-teiv-exposure-consumer-data.sql b/charts/smo/topology-exposure-inventory/resources/init_sql/02_init-teiv-exposure-consumer-data.sql index c38e1ee..ba51783 100644 --- a/charts/smo/topology-exposure-inventory/resources/init_sql/02_init-teiv-exposure-consumer-data.sql +++ b/charts/smo/topology-exposure-inventory/resources/init_sql/02_init-teiv-exposure-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; -SET ROLE 'topology_exposure_user'; +SET ROLE topology_exposure_user; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql b/charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql index 18ee6f3..7729d6f 100644 --- a/charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql +++ b/charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; -SET ROLE 'topology_exposure_user'; +SET ROLE topology_exposure_user; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/charts/smo/topology-exposure-inventory/values.yaml b/charts/smo/topology-exposure-inventory/values.yaml index 6a0a034..22cb6c8 100644 --- a/charts/smo/topology-exposure-inventory/values.yaml +++ b/charts/smo/topology-exposure-inventory/values.yaml @@ -73,7 +73,7 @@ application: &applicationConfig validate-group-membership: "false" group: readiness: - include: "readinessState,${HEALTH_CHECK_INDICATOR:tiesExposure}" + include: "readinessState,${HEALTH_CHECK_INDICATOR:teivExposure}" endpoints: web: exposure: diff --git a/code_conventions.xml b/code_conventions.xml index 1eb56a7..ca70bbe 100644 --- a/code_conventions.xml +++ b/code_conventions.xml @@ -2,7 +2,7 @@ diff --git a/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt b/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt index dc77c25..0626c23 100644 --- a/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt +++ b/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt @@ -1,4 +1,4 @@ -ce_specversion:::1.0,ce_id:::a30e63c9-d29e-46ff-b99a-b63ed83fd237,ce_source:::dmi-plugin:nm-1,ce_type:::ran-logical-topology.merge,content-type:::application/yang-data+json,ce_time:::2023-11-30T09:05:00Z,ce_dataschema:::https://ties:8080/schemas/v1/r1-topology,,,{ +ce_specversion:::1.0,ce_id:::a30e63c9-d29e-46ff-b99a-b63ed83fd237,ce_source:::dmi-plugin:nm-1,ce_type:::ran-logical-topology.merge,content-type:::application/yang-data+json,ce_time:::2023-11-30T09:05:00Z,ce_dataschema:::https://teiv:8080/schemas/v1/r1-topology,,,{ "entities": [ { "o-ran-smo-teiv-oam:ManagedElement": [ diff --git a/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql b/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql index 44e4861..964a4fa 100644 --- a/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql +++ b/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO topology_exposure_user; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE topology_exposure_user; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "domain" TEXT, @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" TEXT PRIMARY KEY, "name" TEXT NOT NULL, "moduleReferenceName" TEXT NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,12 +70,12 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN CD_sourceIds CD_sourceIds COLUMN @@ -465,7 +465,7 @@ totalTilt totalTilt COLUMN verticalBeamWidth verticalBeamWidth COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; _3gpp-common-yang-extensions urn:3gpp:sa5:_3gpp-common-yang-extensions \N [] 2019-06-23 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZHVsZSBkZWZpbmVzIFlBTkcgZXh0ZW5zaW9ucyBuZWVkZWQgCiAgICAzR1BQIFlBTkcgbW9kZWxpbmcuCgogICAgQ29weXJpZ2h0IChjKSAyMDE5IDNHUFAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgRXh0ZW5zaW9ucyBNVVNUIGJlIGRlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUKICAgIGRlc2NyaXB0aW9uIHN0YXRlbWVudDoKICAgICAgICAtIFdoYXQgaXMgdGhpcyBzdGF0ZW1lbnQuCiAgICAgICAgLSBOZXdsaW5lLAogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSB4eHggc3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIFRoaXMgc3RhdGVtZW50IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgc3Vic3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIE5ld2xpbmUKICAgICAgICAtIElzIGNoYW5naW5nIHRoaXMgc3RhdGVtZW50IGFuIGVkaXRvcmlhbCwgQkMoYmFja3dhcmRzIGNvbXBhdGlibGUpIAogICAgICAgIG9yIE5CQyhub24tQkMpIGNoYW5nZT8KICAgICAgICAtIE5ld2xpbmUuCiAgICAgICAgLSBUaGUgYXJndW1lbnQgaXRzIG1lYW5pbmcgYW5kIHR5cGUuIFByZWZlcmFibHkgdXNlIFlBTkcgdHlwZXMgYW5kCiAgICAgICAgICBjb25zdHJhaW50cyB0byBkZWZpbmUgdGhlIGFyZ3VtZW50J3MgdHlwZS4KCiAgICBBbnkgZXh0ZW5zaW9uIHN0YXRlbWVudCBjYW4gYmUgYWRkZWQgd2l0aCBhCiAgICBkZXZpYXRpb24vZGV2aWF0ZSBhZGQgc3RhdGVtZW50LiBJbiB0aGlzIGNhc2UgdGhlIHJlc3RyaWN0aW9uIGFib3V0CiAgICB0aGUgcGFyZW50IHN0YXRlbWVudCBvZiB0aGUgZXh0ZW5zaW9uIFNIQUxMIGJlIGV2YWx1YXRlZCBiYXNlZCBvbiB0aGUKICAgIHRhcmdldCBvZiB0aGUgZGV2aWF0aW9uIHN0YXRlbWVudC4KCiAgICBTdXBwb3J0IGZvciB0aGlzIG1vZHVsZSBkb2VzIG5vdCBtZWFuIHRoYXQgYSBZQU5HIHNlcnZlciBpbXBsZW1lbnRzCiAgICBzdXBwb3J0IGZvciBlYWNoIG9mIHRoZXNlIGV4dGVuc2lvbnMuCiAgICBJbXBsZW1lbnRlcnMgb2YgZWFjaCBzcGVjaWZpYyBtb2R1bGUgdXNpbmcgYW4gZXh0ZW5zaW9ucyBNVVNUIGNoZWNrCiAgICBpZiB0aGUgc2VydmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIHVzZWQgZXh0ZW5zaW9uLgogICAgTm90ZTogbW9kdWxlcyB1c2UgbWFueSBleHRlbnNpb25zIHdoaWNoIGluZGl2aWR1YWwKICAgIGltcGxlbWVudGF0aW9ucyBNQVkgb3IgTUFZIE5PVCBzdXBwb3J0LgogICAgSWYgc3VwcG9ydCBmb3IgYW4gZXh0ZW5zaW9uIGlzIG1pc3NpbmcgdGhlIGV4dGVuc2lvbiBzdGF0ZW1lbnQgbmVlZHMKICAgIGluZGl2aWR1YWwgaGFuZGxpbmcgb3IgaXQgU0hPVUxEIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kdWxlIHVzaW5nCiAgICB0aGUgZXh0ZW5zaW9uIGUuZy4gd2l0aCBhIGRldmlhdGlvbi4KICAgICAgICAgICI7CgogIHJldmlzaW9uICIyMDE5LTA2LTIzIiB7CiAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCB2ZXJzaW9uIjsKICB9CgogIGV4dGVuc2lvbiBpblZhcmlhbnQgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlIGRhdGEgbm9kZSBjYW4gb25seSBiZSBzZXQgd2hlbiBpdHMKICAgICAgcGFyZW50IGRhdGEgbm9kZSBpcyBiZWluZyBjcmVhdGVkLiBUbyBjaGFuZ2UgdGhlIHZhbHVlIGFmdGVyIHRoYXQsIHRoZQogICAgICBwYXJlbnQgZGF0YSBub2RlIG11c3QgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIHdpdGggdGhlIGRhdGEgbm9kZQogICAgICBoYXZpbmcgdGhlIG5ldyB2YWx1ZS4KCiAgICAgIEl0IGlzIHVubmVjZXNzYXJ5IHRvIHVzZSBhbmQgTVVTVCBOT1QgYmUgdXNlZCBmb3Iga2V5IGxlYWZzLgoKICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSBsZWFmLCBsZWFmLWxpc3QsIGxpc3QgCiAgICAgIHN0YXRlbWVudHMgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0IAogICAgICBoYXMgYSBkZWZhdWx0IHN0YXRlbWVudCBvciB0aGUgdHlwZSB1c2VkIGZvciB0aGUgZGF0YSBub2RlIAogICAgICBoYXMgYSBkZWZhdWx0IHZhbHVlLgogICAgICBUaGUgc3RhdGVtZW50IE1VU1QgTk9UIGJlIHVzZWQgZm9yIGNvbmZpZz1mYWxzZSBkYXRhIG9yIGluIGFuIAogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9 _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbCAKICAgIGluZm9ybWF0aW9uIGNsYXNzZXMgdXNlZCBmb3IgbWFuYWdlbWVudCBvZiA1RyBuZXR3b3JrcyBhbmQgCiAgICBuZXR3b3JrIHNsaWNpbmcuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMi0wNy0yNiB7IHJlZmVyZW5jZSBDUi0wMTgwIDsgfQogIHJldmlzaW9uIDIwMjItMDItMDkgeyByZWZlcmVuY2UgIkNSLTAxNDQiOyB9CiAgcmV2aXNpb24gMjAyMS0xMS0wMSB7IHJlZmVyZW5jZSAiQ1ItMDE0MSI7IH0KICAKICByZXZpc2lvbiAyMDIxLTA5LTMwIHsKICAgIGRlc2NyaXB0aW9uICJBZGRlZCBMb25naXR1ZGUsIExhdGl0dWRlLCBUZW50aE9mRGVncmVlcywgT25PZmYuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDEzOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTExLTA2IHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGluY29ycmVjdCBTLU5TU0FJIGRlZmluaXRpb25zLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMTgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0wMy0xMCB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBmYXVsdHkgd2hlbiBzdGF0ZW1lbnRzLiI7CiAgICByZWZlcmVuY2UgIlNQLTIwMDIyOSI7CiAgfQogCiAgcmV2aXNpb24gMjAxOS0xMC0yNSB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTWFuYWdlZE5GUHJvZmlsZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTQ0NTciOwogIH0KCiAgcmV2aXNpb24gMjAxOS0xMC0xNiB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgU0FQIGFuZCB1c2FnZVN0YXRlLiI7CiAgICByZWZlcmVuY2UgIlM1LTE5MzUxOCI7CiAgfQoKICByZXZpc2lvbiAyMDE5LTA2LTIzIHsKICAgIHJlZmVyZW5jZSAgIkluaXRpYWwgdmVyc2lvbi4iOwogIH0KCiAgdHlwZWRlZiBFbmFibGVkRGlzYWJsZWQgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgOwogICAgICBlbnVtIEVOQUJMRUQgOwogICAgfQogIH0KICAKICBncm91cGluZyBQcm9jZXNzTW9uaXRvciB7CiAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgYXR0cmlidXRlcyB0byBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZiBwcm9jZXNzZXMgCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuIAogICAgICBJdCBtYXkgYmUgdXNlZCBhcyBkYXRhIHR5cGUgZm9yIGRlZGljYXRlZCBwcm9ncmVzcyBtb25pdG9yIGF0dHJpYnV0ZXMgCiAgICAgIHdoZW4gc3BlY2lmeWluZyB0aGUgbWFuYWdlbWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSBwcm9jZXNzZXMuIAogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LiAKICAgICAgRm9yIHNvbWUgYXR0cmlidXRlcyBzcGVjaWFsaXNhdGlvbnMgbWF5IGJlIHByb3ZpZGVkIHdoZW4gc3BlY2lmeWluZyBhIAogICAgICBjb25jcmV0ZSBwcm9jZXNzIHJlcHJlc2VudGF0aW9uLgoKICAgICAgSWYgYSBtYW5hZ2VtZW50IG9wZXJhdGlvbiBvbiBzb21lIElPQ3MgdHJpZ2dlcnMgYW4gYXNzb2NpYXRlZCAKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkIAogICAgICBhbHNvIHJlc3VsdCBpbiBjcmVhdGluZyBhbiBhdHRyaWJ1dGUgbmFtZWQgJ3Byb2Nlc3NNb25pdG9yJyAob2YgdHlwZSAKICAgICAgJ1Byb2Nlc3NNb25pdG9yJykgaW4gdGhlc2UgSU9DKHMpLiBUaGUgcHJvY2Vzc01vbml0b3IgYXR0cmlidXRlIG1heSBiZSAKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGVzLiBBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbnMgZm9yIAogICAgICB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIG1heSBiZSBwcm92aWRlZCBieSB0aGUgJ3Byb2dyZXNzU3RhdGVJbmZvJyBhbmQgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnIAogICAgICBhbmQgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvICcwJy4gVGhlIE1uUyBwcm9kdWNlciBkZWNpZGVzIHdoZW4gdG8gCiAgICAgIHN0YXJ0IGV4ZWN1dGluZyB0aGUgcHJvY2VzcyBhbmQgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSAnUlVOTklORycgc3RhdGUuIAogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlIAogICAgICBwcm9jZXNzIG1heSBzdGFydCB0byBleGVjdXRlIGRpcmVjdGx5IHVwb24gaXRzIGluc3RhbnRpYXRpb24uIE9uZSAKICAgICAgYWx0ZXJuYXRpdmUgbXVzdCBiZSBzZWxlY3RlZCB3aGVuIHVzaW5nIHRoaXMgZGF0YSB0eXBlLgoKICAgICAgRHVyaW5nIHRoZSAnUlVOTklORycgc3RhdGUgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZSBtYXkgYmUgCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8gCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24uIFRoZSAncHJvZ3Jlc3NJbmZvJyBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gCiAgICAgIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIGluIHRoZSAnTk9UX1JVTk5JTkcnLCAnQ0FOQ0VMTElORycgCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mIAogICAgICAncHJvZ3Jlc3NTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyAKICAgICAgdXNlZC4KCiAgICAgIFVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBwcm9jZXNzLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIHNldCAKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluIAogICAgICB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gQWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIG1heSBiZSBwcm92aWRlZCAKICAgICAgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4gVGhlIHR5cGUgb2YgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuIAogICAgICBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mICdyZXN1bHRTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCAKICAgICAgd2hlcmUgdGhpcyBkYXRhIHR5cGUgaXMgdXNlZC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgZmFpbHMgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCB0aGUgJ3N0YXR1cycgCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZiAKICAgICAgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLCBhbmQgdGhlIHRpbWUgY2FwdHVyZWQgaW4gJ2VuZFRpbWUnLiBUaGUgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIHNwZWNpZmllcyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZS4gCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbiAKICAgICAgdGhpcyBjbGF1c2UgaXMgdXNlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIGZhaWx1cmUgbWF5IGJlIHN1YmplY3QgZm9yIAogICAgICBmdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIGFzIHdlbGwuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGlzIGNhbmNlbGxlZCwgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBmaXJzdCBzZXQgdG8gCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuIAogICAgICBUaGUgdHJhbnNpdGlvbiB0byAnQ0FOQ0VMTEVEJyBpcyBjYXB0dXJlZCBpbiB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gCiAgICAgIFRoZSB2YWx1ZSBvZiAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4uIEFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCcgb3IgCiAgICAgICdDQU5DRUxMRUQnLiBJdCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgbWFraW5nIHRoZSBvdXRjb21lLCB0aGF0IHRoZSAKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzIAogICAgICBjcmVhdGlvbiwgZm9yIGV4YW1wbGUgYmVjYXVzZSByZXF1aXJlZCBkYXRhIG1heSBub3QgYmUgYXZhaWxhYmxlIGFueSAKICAgICAgbW9yZSBhZnRlciBhIGNlcnRhaW4gdGltZSwgb3IgdGhlIHByb2Nlc3Mgb3V0Y29tZSBpcyBuZWVkZWQgdW50aWwgYSAKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4gCiAgICAgIFRoZSB0aW1lIHVudGlsIHRoZSBNblMgcHJvZHVjZXIgYXV0b21hdGljYWxseSBjYW5jZWxzIHRoZSBwcm9jZXNzIGlzIAogICAgICBpbmRpY2F0ZWQgYnkgdGhlICd0aW1lcicgYXR0cmlidXRlLiI7CiAgICAgIAogICAgbGVhZiBpZCB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIklkIG9mIHRoZSBwcm9jZXNzLiBJdCBpcyB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIAogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KICAgIAogICAgbGVhZiBzdGF0dXMgeyAKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBOT1RfU1RBUlRFRCA7CiAgICAgICAgZW51bSBSVU5OSU5HIDsKICAgICAgICBlbnVtIENBTkNFTExJTkcgOwogICAgICAgIGVudW0gRklOSVNIRUQgOwogICAgICAgIGVudW0gRkFJTEVEIDsKICAgICAgICBlbnVtIFBBUlRJQUxMWV9GQUlMRUQgOwogICAgICAgIGVudW0gQ0FOQ0VMTEVEIDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlZmF1bHQgIFJVTk5JTkc7CiAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLiAKICAgICAgICBJdCBkb2VzIG5vdCByZXByZXNlbnQgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCAKICAgICAgICBwcm9jZXNzLiAiOwogICAgfQoKICAgIGxlYWYgcHJvZ3Jlc3NQZXJjZW50YWdlIHsKICAgICAgdHlwZSB1aW50OCB7CiAgICAgICAgcmFuZ2UgMC4uMTAwOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlByb2dyZXNzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MgYXMgcGVyY2VudGFnZSI7CiAgICB9CgogICAgbGVhZi1saXN0IHByb2dyZXNzU3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZyAKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgcmVzdWx0U3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEIGFuZCAnQ0FOQ0VMTEVEJy4gCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcyAKICAgICAgICBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBlcnJvciByZWFzb25zLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzaGFsbCBub3QgYmUgdXNlZCB0byBtYWtlIHRoZSBvdXRjb21lIG9mIHRoZSBwcm9jZXNzIAogICAgICAgIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsLCBpZiBhbnkuIEZvciB0aGlzIHB1cnBvc2UsIGRlZGljYXRlZCAKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mIAogICAgICAgIGEgc3BlY2lmaWMgcHJvY2Vzcy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiBzdGFydFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiU3RhcnQgdGltZSBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCBpLmUuIHRoZSB0aW1lIHdoZW4gdGhlIAogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsIAogICAgICAgICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJy4gCgogICAgICAgIElmIHRoZSB0aW1lIGlzIGluIHRoZSBmdXR1cmUsIGl0IGlzIHRoZSBlc3RpbWF0ZWQgdGltZSAKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvIAogICAgICAgIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIAogICAgICAgIE1uU19Qcm9kdWNlci4gCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCiAgICAgICAgCiAgICAgICAgT25jZSB0aGUgdGltZXIgaXMgc2V0LCB0aGUgY29uc3VtZXIgY2FuIG5vdCBjaGFuZ2UgaXQgYW55bW9yZS4gCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgIH0KICB9CiAgCiAgdHlwZWRlZiBUZW50aE9mRGVncmVlcyB7IAogICAgdHlwZSB1aW50MTYgeyAKICAgICAgcmFuZ2UgMC4uMzYwMDsgCiAgICB9CiAgICB1bml0cyAiMC4xIGRlZ3JlZXMiOwogICAgZGVzY3JpcHRpb24gIkEgc2luZ2xlIGludGVncmFsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gYW5nbGUgaW4gZGVncmVlcyAKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxhdGl0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIExvbmdpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTE4MC4wMDAwLi4rMTgwLjAwMDAiOyAKICAgIH0KICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgT25PZmYgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gT047CiAgICAgIGVudW0gT0ZGOwogICAgfQogIH0KICAKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcyAKICAvLyAgYmVpbmcgbW92ZWQgdG8gXzNncHAtNWdjLW5ybS1uZnByb2ZpbGUKICBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHsKICAgIGRlc2NyaXB0aW9uICJEZWZpbmVzIHByb2ZpbGUgZm9yIG1hbmFnZWQgTkYiOwogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjUwMSI7CiAgICAKICAgIGxlYWYgaWR4IHsgdHlwZSB1aW50MzIgOyB9CiAgICAKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLiAKICAgICAgICBUaGUgZm9ybWF0IG9mIHRoZSBORiBJbnN0YW5jZSBJRCBzaGFsbCBiZSBhIAogICAgICAgIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIChVVUlEKSB2ZXJzaW9uIDQsIAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMjMuNjU4IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggOwogICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgbGVuZ3RoIDg7CiAgICAgICAgcGF0dGVybiAnWzAxXSonOwogICAgICB9CiAgICB9CiAgICByZWZlcmVuY2UgImNsYXVzZSAyLjEwLjEgb2YgM0dQUCBUUyAyMy4wMDMiOwogIH0KCiAgdHlwZWRlZiBBbWZTZXRJZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDE2IHsKICAgICAgICByYW5nZSAnMC4uMTAyMyc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mUG9pbnRlciB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CiAgICAgICAgCiAgZ3JvdXBpbmcgQW1mSWRlbnRpZmllciB7ICAgICAgICAKICAgIGxlYWYgYW1mUmVnaW9uSWQgewogICAgICB0eXBlIEFtZlJlZ2lvbklkOwogICAgfQogICAgbGVhZiBhbWZTZXRJZCB7CiAgICAgIHR5cGUgQW1mU2V0SWQ7CiAgICB9CiAgICBsZWFmIGFtZlBvaW50ZXIgewogICAgICB0eXBlIEFtZlBvaW50ZXI7CiAgICB9IAogICAgZGVzY3JpcHRpb24gIlRoZSBBTUZJIGlzIGNvbnN0cnVjdGVkIGZyb20gYW4gQU1GIFJlZ2lvbiBJRCwgCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLiAKICAgICAgVGhlIEFNRiBSZWdpb24gSUQgaWRlbnRpZmllcyB0aGUgcmVnaW9uLCAKICAgICAgdGhlIEFNRiBTZXQgSUQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgQU1GIFNldCB3aXRoaW4gdGhlIEFNRiBSZWdpb24sIGFuZCAKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7IAogIH0gICAgCgovLyB0eXBlIGRlZmluaXRpb25zIGVzcGVjaWFsbHkgZm9yIGNvcmUgTkZzCgogIHR5cGVkZWYgTmZUeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE5SRjsKICAgICAgZW51bSBVRE07CiAgICAgIGVudW0gQU1GOwogICAgICBlbnVtIFNNRjsKICAgICAgZW51bSBBVVNGOwogICAgICBlbnVtIE5FRjsKICAgICAgZW51bSBQQ0Y7CiAgICAgIGVudW0gU01TRjsKICAgICAgZW51bSBOU1NGOwogICAgICBlbnVtIFVEUjsKICAgICAgZW51bSBMTUY7CiAgICAgIGVudW0gR01MQzsKICAgICAgZW51bSA1R19FSVI7CiAgICAgIGVudW0gU0VQUDsKICAgICAgZW51bSBVUEY7CiAgICAgIGVudW0gTjNJV0Y7CiAgICAgIGVudW0gQUY7CiAgICAgIGVudW0gVURTRjsKICAgICAgZW51bSBCU0Y7CiAgICAgIGVudW0gQ0hGOwogICAgfSAgICAgICAgICAKICB9CiAgCiAgdHlwZWRlZiBOb3RpZmljYXRpb25UeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE4xX01FU1NBR0VTOwogICAgICBlbnVtIE4yX0lORk9STUFUSU9OOwogICAgICBlbnVtIExPQ0FUSU9OX05PVElGSUNBVElPTjsKICAgIH0gICAgICAKICB9CiAgCiAgdHlwZWRlZiBMb2FkIHsKICAgIGRlc2NyaXB0aW9uICJMYXRlc3Qga25vd24gbG9hZCBpbmZvcm1hdGlvbiBvZiB0aGUgTkYsIHBlcmNlbnRhZ2UgIjsKICAgIHR5cGUgdWludDggewogICAgICByYW5nZSAwLi4xMDA7CiAgICB9CiAgfQoKICB0eXBlZGVmIE4xTWVzc2FnZUNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIDVHTU07CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTFBQOwogICAgICBlbnVtIFNNUzsgCiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTjJJbmZvcm1hdGlvbkNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNNOwogICAgICBlbnVtIE5SUFBBOwogICAgICBlbnVtIFBXUzsKICAgICAgZW51bSBQV1NfQkNBTDsKICAgICAgZW51bSBQV1NfUkY7CiAgICB9ICAgICAgICAgICAgICAKICB9CiAgCiAgZ3JvdXBpbmcgRGVmYXVsdE5vdGlmaWNhdGlvblN1YnNjcmlwdGlvbiB7CiAgICAKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KICAgIAogICAgbGVhZiBjYWxsYmFja1VyaSB7CiAgICAgIHR5cGUgaW5ldDp1cmk7CiAgICB9CiAgICAKICAgIGxlYWYgbjFNZXNzYWdlQ2xhc3MgewogICAgICB0eXBlIE4xTWVzc2FnZUNsYXNzOwogICAgfQogICAgCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfSAgICAKICB9ICAKICAgICAgICAKICBncm91cGluZyBJcHY0QWRkcmVzc1JhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjQtYWRkcmVzczsKICAgIH0gICAgCiAgfQogICAgCiAgZ3JvdXBpbmcgSXB2NlByZWZpeFJhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICBsZWFmIGVuZCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9ICAgIAogIH0KICAgICAKICB0eXBlZGVmIE5zaUlkIHsKICAgIHR5cGUgc3RyaW5nOwogIH0KICAgIAogIHR5cGVkZWYgVWVNb2JpbGl0eUxldmVsIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNUQVRJT05BUlk7CiAgICAgIGVudW0gTk9NQURJQzsKICAgICAgZW51bSBSRVNUUklDVEVEX01PQklMSVRZOwogICAgICBlbnVtIEZVTExZX01PQklMSVRZOwogICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBSZXNvdXJjZVNoYXJpbmdMZXZlbCB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU0hBUkVEOwogICAgICAgIGVudW0gTk9UX1NIQVJFRDsKICAgICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBUeERpcmVjdGlvbiB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gREw7CiAgICAgICAgZW51bSBVTDsKICAgICAgICBlbnVtIERMX0FORF9VTDsKICAgICAgfQogIH0KICAgICAgCiAgZ3JvdXBpbmcgQWRkcmVzc1dpdGhWbGFuIHsKICAgIGxlYWYgaXBBZGRyZXNzIHsKICAgICAgdHlwZSBpbmV0OmlwLWFkZHJlc3M7ICAgCiAgICB9CiAgICBsZWFmIHZsYW5JZCB7CiAgICAgICB0eXBlIHVpbnQxNjsKICAgIH0gIAogIH0KICAKICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgLy8gVE9ETyBpcyB0aGlzIGVxdWl2YWxlbnQgdG8gVFMgMzIuMzAwID8KICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissXSkqJwogICAgICAgICsgJyhcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nCiAgICAgICAgKyAnWyxcK10pKlthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KScKICAgICAgICArICd8W15cXD48OyIrLF0pKihcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nOyAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIAogICAgICBvZiBEaXN0aW5ndWlzaGVkIE5hbWUgKFJGQyA0NTEyKS4gCiAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIERpc3Rpbmd1aXNoZWROYW1lIFJFR0VYIGlzOgogICAgICB7QXR0cmlidXRlVHlwZSA9IEF0dHJpYnV0ZVZhbHVlfSAgIAoKICAgICAgQXR0cmlidXRlVHlwZSBjb25zaXN0cyBvZiBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbiAoT0lEcyBub3QgYWxsb3dlZCkuIAogICAgICBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcmVzdHJpY3RlZC4KICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW5ub3QgY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgb3IgdGhlIAogICAgICAgIGZvbGxvd2luZyBjaGFyYWN0ZXJzIDogXFwgPiA8IDsgXCIgKyAsIChDb21tYSkgYW5kIFdoaXRlIHNwYWNlCiAgICAgIFRoZSBBdHRyaWJ1dGUgdmFsdWUgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGlmIHRoZXkgCiAgICAgICAgYXJlIGV4Y2FwZWQgOiBcXCA+IDwgOyBcIiArICwgKENvbW1hKSBhbmQgV2hpdGUgc3BhY2UKICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW4gY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgaWYgaXRzIGFuIGVzY2FwZWQgCiAgICAgICAgZG91YmxlIGRpZ2l0IGhleCBudW1iZXIuCiAgICAgICAgRXhhbXBsZXMgY291bGQgYmUgCiAgICAgICAgICBVSUQ9bm9ib2R5QGV4YW1wbGUuY29tLERDPWV4YW1wbGUsREM9Y29tCiAgICAgICAgICAgIENOPUpvaG4gU21pdGgsT1U9U2FsZXMsTz1BQ01FIExpbWl0ZWQsTD1Nb2FiLFNUPVV0YWgsQz1VUyI7CiAgICByZWZlcmVuY2UgICJSRkMgNDUxMiBMaWdodHdlaWdodCBEaXJlY3RvcnkgQWNjZXNzIFByb3RvY29sIChMREFQKToKICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBJbmZvcm1hdGlvbiBNb2RlbHMiOwogIH0gLy8gcmVjaGVjayByZWdleHAgaXQgZG9lc24ndCBoYW5kbGUgcG9zaXggWzpjbnRybDpdCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KfQ== ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= @@ -473,17 +473,17 @@ ietf-inet-types urn:ietf:params:xml:ns:yang:ietf-inet-types \N [] 2013-07-15 bW9 ietf-yang-types urn:ietf:params:xml:ns:yang:ietf-yang-types \N [] 2013-07-15 bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQo= o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5ncywgT3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycCBvciBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9wb2xvZ3kgb2JqZWN0cy4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOwoKICAgIGxpc3QgQ2xvdWRpZmllZE5GIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBSQU4gTmV0d29yayBGdW5jdGlvbiBzb2Z0d2FyZSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBPLUNsb3VkIHZpYSBvbmUgb3IgbW9yZSBORiBEZXBsb3ltZW50cy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWRpZmllZCBORiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5GRGVwbG95bWVudCB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgc29mdHdhcmUgZGVwbG95bWVudCBvbiBPLUNsb3VkIHJlc291cmNlcyB0aGF0IHJlYWxpemVzLCBhbGwgb3IgcGFydCBvZiwgYSBDbG91ZGlmaWVkIE5GLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBORiBEZXBsb3ltZW50IjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkTmFtZXNwYWNlIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGlzb2xhdGluZwogICAgICAgIGdyb3VwcyBvZiByZXNvdXJjZXMgd2l0aGluIGEgc2luZ2xlIGNsdXN0ZXIuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIE5hbWVzcGFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5vZGVDbHVzdGVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBOb2RlQ2x1c3RlciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBOb2Rlcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgTm9kZSBDbHVzdGVyIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkU2l0ZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIGluZnJhc3RydWN0dXJlIHRoYXQKICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBDTE9VRElGSUVETkZfQ09NUFJJU0VTX05GREVQTE9ZTUVOVCB7IC8vIDEgdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGNvbXByaXNlZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBjb21wcmlzZXMgb2YgdGhlc2UgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQ2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBjb21wcmlzZWQtYnktY2xvdWRpZmllZE5GIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgcGFydCBvZiBDbG91ZGlmaWVkIE5GLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX0RFUExPWUVEX09OX09DTE9VRE5BTUVTUEFDRSB7IC8vIDEuLm4gdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9uLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IGRlcGxveWVkIG9uIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk9DbG91ZCBOYW1lc3BhY2UgZGVwbG95cyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NMT1VETkFNRVNQQUNFX0RFUExPWUVEX09OX05PREVDTFVTVEVSIHsgLy8gMS4ubiB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLW9uLW5vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgTmFtZXNwYWNlIGRlcGxveWVkIG9uIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0Nsb3VkTmFtZXNwYWNlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb2RlIENsdXN0ZXIgZGVwbG95cyBPLUNsb3VkIE5hbWVzcGFjZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTk9ERUNMVVNURVJfTE9DQVRFRF9BVF9PQ0xPVURTSVRFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRlZC1hdC1vY2xvdWRTaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBsb2NhdGVkIGF0IE8tQ2xvdWQgU2l0ZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRpb24tb2Ytb25vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgU2l0ZSBpcyBsb2NhdGlvbiBvZiBOb2RlIENsdXN0ZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMgJ3gueS56JyAtIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2025-01-17 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgaWV0Zi15YW5nLXR5cGVzIHsgcHJlZml4IHlhbmc7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNS0wMS0xNyIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBmaXJzdERpc2NvdmVyZWQgYW5kIGxhc3RNb2RpZmllZCB0byBtZXRhZGF0YSBjb250YWluZXIiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyBhbmQgRGlzY292ZXJ5IGFuZCBSZWNvbmNpbGlhdGlvbiBBZGFwdGVyLgogICAgICAgICAgICBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwKICAgICAgICAgICAgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgbGVhZiByZWxpYWJpbGl0eUluZGljYXRvciB7CiAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgZW51bSBPSyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIGlzIGluIGFsaWdubWVudCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsCiAgICAgICAgICAgICAgICAgICAgYXMgZmFyIGFzIFRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZQogICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIGFuZCBwb3RlbnRpYWxseSBub3QgYWxpZ25lZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGguIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxlYWYgZmlyc3REaXNjb3ZlcmVkIHsKICAgICAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGFuIGluc3RhbmNlIG9mIFRvcG9sb2d5IEVudGl0eSBvciBSZWxhdGlvbgogICAgICAgICAgICB3YXMgZmlyc3QgcmVwcmVzZW50ZWQgaW4gVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyB2aWEgZGlzY292ZXJ5LiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGxhc3RNb2RpZmllZCB7CiAgICAgICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiBhbiBpbnN0YW5jZSBvZiBUb3BvbG9neSBFbnRpdHkgb3IgUmVsYXRpb24KICAgICAgICAgICAgd2FzIGxhc3QgdXBkYXRlZCAoZXhjbHVkaW5nIGNsYXNzaWZpZXJzIGFuZCBkZWNvcmF0b3JzKS4iOwogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-10-21 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgaW5zdGFsbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9JTlNUQUxMRURfQVRfU0lURSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2l0ZSB0eXBlLgogICAgICAgICAgICBUaGUgU2l0ZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgQW50ZW5uYU1vZHVsZSBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIGF0IG9uZSBTaXRlLgogICAgICAgICAgICBBIFNpdGUgaW5zdGFuY2UgY2FuIGhhdmUgbWFueSBpbnN0YWxsZWQgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gT0FNOwoKICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9 -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== o-ran-smo-teiv-rel-cloud-ran urn:o-ran:smo-teiv-rel-cloud-ran REL_CLOUD_RAN ["o-ran-smo-teiv-cloud", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBncm91cGluZywgT3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycCB0byB0aGUgdG9wb2xvZ3kgb2JqZWN0LiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0NMT1VEX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0RVRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09DVUNQRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VVUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== -o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== o-ran-smo-teiv-rel-oam-cloud urn:o-ran:smo-teiv-rel-oam-cloud REL_OAM_CLOUD ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-cloud"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fQ0xPVUQ7CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9ERVBMT1lFRF9BU19DTE9VRElGSUVETkYgeyAgLy8gMC4uMSB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLWFzLWNsb3VkaWZpZWRORiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgZGVwbG95ZWQgYXMgQ2xvdWRpZmllZCBORi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZGVwbG95ZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBkZXBsb3lzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1jbG91ZDpDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19NQU5BR0VERUxFTUVOVCB7IC8vIDEuLm4gdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBzZXJ2aWNlZC1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LW9hbTpNYW5hZ2VkRWxlbWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud ["name"] @@ -504,7 +504,7 @@ o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran ["oruId"] o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran ["azimuth", "geo-location", "sectorId"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ANTENNAMODULE_INSTALLED_AT_SITE installed-at-site AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 installed-antennaModule Site o-ran-smo-teiv-equipment 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran ANTENNAMODULE_SERVES_NRCELLDU serviced-nrCellDu AntennaModule o-ran-smo-teiv-equipment 1 9223372036854775807 serving-antennaModule NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran diff --git a/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql b/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql index 39442e9..18d54ef 100644 --- a/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql +++ b/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql @@ -29,27 +29,27 @@ GRANT USAGE ON SCHEMA topology to topology_exposure_user; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO topology_exposure_user; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO topology_exposure_user; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE topology_exposure_user; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -59,24 +59,24 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' -);CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' +);CREATE TABLE IF NOT EXISTS teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, @@ -86,13 +86,13 @@ SELECT ties_data.create_constraint_if_not_exists( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( +CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_AntennaCapability" TEXT, @@ -102,13 +102,13 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "metadata" jsonb ); -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -117,13 +117,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCloudNamespace" TEXT, @@ -133,13 +133,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -160,25 +160,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( "id" TEXT, "aSide_NodeCluster" TEXT, "bSide_OCloudSite" TEXT, @@ -188,13 +188,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -203,13 +203,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -224,19 +224,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -246,13 +246,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, @@ -283,25 +283,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_Site" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -311,13 +311,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-oam_ManagedElement" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -331,19 +331,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ( "id" TEXT, "eUtranFqBands" jsonb, "geranFqBands" jsonb, @@ -354,13 +354,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellCU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -378,19 +378,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellDU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -414,25 +414,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "id" TEXT, "arfcnDL" INTEGER, "arfcnUL" INTEGER, @@ -463,31 +463,31 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "id" TEXT, "nearRtRicId" BIGINT, "pLMNId" jsonb, @@ -503,19 +503,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "id" TEXT, "gNBCUName" TEXT, "gNBId" BIGINT, @@ -533,19 +533,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "id" TEXT, "gNBId" BIGINT, "gNBIdLength" INTEGER, @@ -562,19 +562,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -592,19 +592,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ORUFunction" ( "id" TEXT, "oruId" BIGINT, "CD_sourceIds" jsonb, @@ -619,19 +619,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_Sector" ( "id" TEXT, "azimuth" DECIMAL, "geo-location" geography, @@ -642,13 +642,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUCPFunction" TEXT, @@ -658,13 +658,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUUPFunction" TEXT, @@ -674,13 +674,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_ODUFunction" TEXT, @@ -690,13 +690,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_NRCellDU" TEXT, @@ -706,794 +706,794 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMO "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_CloudifiedNF', 'PK_o-ran-smo-teiv-cloud_CloudifiedNF_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'PK_o-ran-smo-teiv-cloud_NFDeployment_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NodeCluster', 'PK_o-ran-smo-teiv-cloud_NodeCluster_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'PK_o-ran-smo-teiv-cloud_OCloudNamespace_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudSite', 'PK_o-ran-smo-teiv-cloud_OCloudSite_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_Site', 'PK_o-ran-smo-teiv-equipment_Site_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'PK_o-ran-smo-teiv-oam_ManagedElement_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_AntennaCapability', 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'PK_o-ran-smo-teiv-ran_NRCellCU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'PK_o-ran-smo-teiv-ran_NRCellDU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'PK_o-ran-smo-teiv-ran_NRSectorCarrier_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'PK_o-ran-smo-teiv-ran_NearRTRICFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'PK_o-ran-smo-teiv-ran_OCUCPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'PK_o-ran-smo-teiv-ran_OCUUPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'PK_o-ran-smo-teiv-ran_ODUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'PK_o-ran-smo-teiv-ran_ORUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_Sector', 'PK_o-ran-smo-teiv-ran_Sector_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'PK_E551D02D14B3C04A565DC73A386BEB29627D3C08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'PK_F41873285F3BD831F63C6041B4356A063403406D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_A08D274894ECB6799E56C2089A494AF0345B9B16', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_888BF6FF782916E61B3FE80643A549A1CFDB6117', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudSite" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES ties_data."o-ran-smo-teiv-equipment_Site" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES teiv_data."o-ran-smo-teiv-equipment_Site" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_078764B2F3D613D44CC6E3586F564C83164D2481', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'FK_899B8130A861D1450FC49D3159D8B29C0628A717', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_65D538D54EB33081C808540235FEB28823428E64', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'UNIQUE_E020461673334EB824643649B6B31670FB064EC8', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'FK_122DD9709032528D161177B3624AD7AAF6589005', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_8585D545BC37A473A298E0F5F5942F897A7105B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_8605800A4923C52258A8CE3989E18A7C93D22E8C', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); +CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); -CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); +CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); -CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); +CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); -CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); +CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); -CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); +CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); -CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); +CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); -CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); -CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); +CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); -CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); +CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); -CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ODUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_Site"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_Site"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NodeCluster"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NodeCluster"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUCPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; +ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU"; -ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDeployment"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDeployment"; -ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability"; -ANALYZE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; +ANALYZE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ORUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ORUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellCU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellCU"; -ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; +ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUUPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier"; -ANALYZE ties_data."o-ran-smo-teiv-ran_Sector"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_Sector"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudSite"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudSite"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace"; COMMIT; diff --git a/docker-compose/sql_scripts/02_init-teiv-exposure-consumer-data.sql b/docker-compose/sql_scripts/02_init-teiv-exposure-consumer-data.sql index 68d7305..ba51783 100644 --- a/docker-compose/sql_scripts/02_init-teiv-exposure-consumer-data.sql +++ b/docker-compose/sql_scripts/02_init-teiv-exposure-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE topology_exposure_user; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql b/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql index ba9a7fd..7729d6f 100644 --- a/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql +++ b/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO topology_exposure_user; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO topology_exposure_user; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE topology_exposure_user; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/docs/groupings.rst b/docs/groupings.rst index f60a95d..ef008f7 100644 --- a/docs/groupings.rst +++ b/docs/groupings.rst @@ -271,7 +271,7 @@ See the following 'Topology status and descriptions' table for more information. +-------------+-----------------------------------------------------------------------------------+ | not-present | Entity or relationship IDs that do not exist in your topology. | +-------------+-----------------------------------------------------------------------------------+ -| invalid | Entity or relationship IDs of a topology type that does not match the TIES model. | +| invalid | Entity or relationship IDs of a topology type that does not match the TEIV model. | +-------------+-----------------------------------------------------------------------------------+ diff --git a/docs/offeredapis/html/index.html b/docs/offeredapis/html/index.html index be8e186..f9cc62c 100644 --- a/docs/offeredapis/html/index.html +++ b/docs/offeredapis/html/index.html @@ -1664,6 +1664,14 @@ defines the relationship itself which must be unique.

well defined user specified string with an entity or relationship.

Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships.

+

Metadata provides additional information about entities and relationships within the database. +The reliabilityIndicator is used to indicate the reliability status of the topology data within the network. +The firstDiscovered timestamp is set for an entity and relationship instance when the instances are created for +the first time in Topology & Inventory. +The lastModified timestamp is set for updates to entities or relationships in Topology & Inventory, +excluding updates to classifiers or decorators. +reliabilityIndicator, firstDiscovered, and lastModified are implemented as name-value pairs within the metadata. +They apply to every entity and relationship.

Topology groups provide the capability to create user-defined collections of topology entities and/or relationships of any type. Groups can be either static or dynamic based on how they are created.

@@ -1678,23 +1686,24 @@ constructed starting from the RootObject and all other objects are joined to it. If there is no connection between the RootObject and the other object(s), the query is not constructed. The RootObject still can be retrieved and filtered using the /attributes.

-

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | -|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------| -| To return the ids for all instances of the entityTypeName used in the query. | RAN | GNBDUFunction | | | All ids of every GNBDUFunction | -| To return all attributes of every instance of the entityTypeName used in the query. | RAN | GNBDUFunction | /attributes | | All GNBDUFunctions with every attribute | -| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the targetFilter parameter.
Note: The attribute must be a valid field of the object. | RAN | GNBDUFunction | /attributes(gNBId) | | All gNBIds of every GNBDUFunction | -| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the targetFilter parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | GNBDUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every GNBDUFunction | -| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the scopeFilter parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where sourceIds contains SubNetwork=Ireland | -| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the scopeFilter parameter.
Note: The attributes must be separated by a AND or OR". | RAN | GNBDUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | -| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the scopeFilter parameter. A condition is a complete unit of scopeFilter parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | GNBDUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" |

+

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | +|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| To return the ids for all instances of the entityTypeName used in the query. | RAN | ODUFunction | | | All ids of every ODUFunction | +| To return all attributes of every instance of the entityTypeName used in the query. | RAN | ODUFunction | /attributes | | All ODUFunctions with every attribute | +| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the targetFilter parameter.
Note: The attribute must be a valid field of the object. | RAN | ODUFunction | /attributes(gNBId) | | All gNBIds of every ODUFunction | +| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the targetFilter parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | ODUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every ODUFunction | +| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the scopeFilter parameter. | RAN | ODUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where sourceIds contains SubNetwork=Ireland | +| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the scopeFilter parameter.
Note: The attributes must be separated by a AND or OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | +| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the scopeFilter parameter. A condition is a complete unit of scopeFilter parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | +| To return the metadata for all instances of the entityTypeName used in the query, that is firstDiscovered within the given timeframe in the scopeFilter parameter.
Note: The timestamps can be queried in any timezone. | RAN | ODUFunction | | /metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30'] | Unique set of ids of ODUFunctions, where metadata contains firstDiscovered timestamp within the range '2025-01-06T12:34:56.789+05:30' and '2025-01-09T16:10:36.461565+05:30' |

Querying connected entities

The entityTypeName is used as the root of the queries.

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. | | To return the ids for all instances of an entityTypeName related by an association to another entity specified by its id. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element urn:3gpp:dn: ManagedElement=1. | -| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their id. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All EnodeBFunction entities with enbId as 1, managed by the Managed Element urn:3gpp:dn: ManagedElement=1 or urn:3gpp:dn: ManagedElement=2, and provides EuTranCell urn:3gpp:dn: ManagedElement=1, EUtranCell=2. | -| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given scopeFilter parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All EnodeBFunction entities that provide an EuTranCell whose tac equals 1 |

+| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their id. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All ENodeBFunction entities with enbId as 1, managed by the Managed Element urn:3gpp:dn: ManagedElement=1 or urn:3gpp:dn: ManagedElement=2, and provides EuTranCell urn:3gpp:dn: ManagedElement=1, EUtranCell=2. | +| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given scopeFilter parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All ENodeBFunction entities that provide an EUTranCell whose tac equals 1 |

Querying based on geographical location

The entityTypeName is used as the root of the queries. Use the "Well-known text" (WKT) representation of geometry to specify geometry objects.

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | @@ -1707,9 +1716,9 @@ retrieved and filtered using the /attributes.

The entityTypeName is used as the root of the queries.

| Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| To return the relationships for a given entity specified by its id. | RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | | All relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1. | -| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | /MANAGEDELEMENT _MANAGES _GNBDUFUNCTION | | All MANAGEDELEMENT _MANAGES _GNBDUFUNCTION relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1. | -| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT _MANAGES _GNBDUFUNCTION relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 where the managed element is urn:3gpp:dn: ManagedElement=1. |

+| To return the relationships for a given entity specified by its id. | RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | | All relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1. | +| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | /MANAGEDELEMENT _MANAGES _ODUFUNCTION | | All MANAGEDELEMENT _MANAGES _ODUFUNCTION relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1. | +| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT _MANAGES _ODUFUNCTION relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1 where the managed element is urn:3gpp:dn: ManagedElement=1. |

Querying on relationships

Here, the relationshipTypeName is used as the root of the queries.

| Use case | domainName | relationshipTypeName | targetFilter | scopeFilter | Query result | @@ -1720,28 +1729,28 @@ retrieved and filtered using the /attributes.

The domainName is used as the root of the queries.

| Use case | domainName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------| -| Return all related entity IDs that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'gnbdu-function-model:Indoor'] | All the entity IDs that are classified with "gnbdu-function-model:Indoor" in RAN domain. | -| Return all related entity IDs that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity IDs that are partially matched with "Ind" in RAN domain. | -| Return all related entity IDs that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@gnbdu-function-model:textdata = 'Stockholm'] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata = 'Stockholm'" in RAN domain. | -| Return all related entity IDs that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@gnbdu-function-model:textdata, '')] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata as key of the decorator in RAN domain. |

+| Return all related entity ids that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'odu-function-model:Indoor'] | All the entity ids that are classified with "odu-function-model:Indoor" in RAN domain. | +| Return all related entity ids that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity ids that are partially matched with "Ind" in RAN domain. | +| Return all related entity ids that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@odu-function-model:textdata = 'Stockholm'] | All the entity ids that are exactly matched with "odu-function-model:textdata = 'Stockholm'" in RAN domain. | +| Return all related entity ids that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@odu-function-model:textdata, '')] | All the entity ids that are exactly matched with "odu-function-model:textdata as key of the decorator in RAN domain. |

The entityName is used as the root of the queries.

| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Return all related entity IDs and classifiers. | NRCellDU | | /classifiers | | All NRCellDU IDs and classifiers. | -| Return all related entity IDs and decorators. | NRCellDU | | /decorators | | All NRCellDU IDs and decorators. | -| Return all related entity IDs that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All NRCellDU IDs where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "gnbdu-function-model:Indoor". | -| Return all related entity IDs and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU IDs and classifiers partially contains the text "Ind". | -| Return all related entity IDs and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | -| Return all related entity IDs, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". |

+| Return all related entity ids and classifiers. | NRCellDU | | /classifiers | | All NRCellDU ids and classifiers. | +| Return all related entity ids and decorators. | NRCellDU | | /decorators | | All NRCellDU ids and decorators. | +| Return all related entity ids that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All NRCellDU ids where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "odu-function-model:Indoor". | +| Return all related entity ids and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU ids and classifiers partially contains the text "Ind". | +| Return all related entity ids and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | +| Return all related entity ids, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". |

The relationshipTypeName is used as the root of the queries.

| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Return all related relationships IDs and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and classifiers. | -| Return all related relationships IDs and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators. | -| Return all related relationship IDs that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "gnbdu-function-model:Indoor". | -| Return all related relationships IDs and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | -| Return all related relationships IDs and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | -| Return all related relationships IDs,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". |

+| Return all related relationship ids and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and classifiers. | +| Return all related relationship ids and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators. | +| Return all related relationship ids that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "odu-function-model:Indoor". | +| Return all related relationship ids and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | +| Return all related relationship ids and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | +| Return all related relationship ids,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". |

diff --git a/docs/offeredapis/index.html b/docs/offeredapis/index.html index 87b55a7..6d2ee50 100644 --- a/docs/offeredapis/index.html +++ b/docs/offeredapis/index.html @@ -198,6 +198,14 @@ defines the relationship itself which must be unique.

well defined user specified string with an entity or relationship.

Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships.

+

Metadata provides additional information about entities and relationships within the database. +The reliabilityIndicator is used to indicate the reliability status of the topology data within the network. +The firstDiscovered timestamp is set for an entity and relationship instance when the instances are created for +the first time in Topology & Inventory. +The lastModified timestamp is set for updates to entities or relationships in Topology & Inventory, +excluding updates to classifiers or decorators. +reliabilityIndicator, firstDiscovered, and lastModified are implemented as name-value pairs within the metadata. +They apply to every entity and relationship.

Topology groups provide the capability to create user-defined collections of topology entities and/or relationships of any type. Groups can be either static or dynamic based on how they are created.

@@ -212,23 +220,24 @@ constructed starting from the RootObject and all other objects are joined to it. If there is no connection between the RootObject and the other object(s), the query is not constructed. The RootObject still can be retrieved and filtered using the /attributes.

-

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | -|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------| -| To return the ids for all instances of the entityTypeName used in the query. | RAN | GNBDUFunction | | | All ids of every GNBDUFunction | -| To return all attributes of every instance of the entityTypeName used in the query. | RAN | GNBDUFunction | /attributes | | All GNBDUFunctions with every attribute | -| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the targetFilter parameter.
Note: The attribute must be a valid field of the object. | RAN | GNBDUFunction | /attributes(gNBId) | | All gNBIds of every GNBDUFunction | -| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the targetFilter parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | GNBDUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every GNBDUFunction | -| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the scopeFilter parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where sourceIds contains SubNetwork=Ireland | -| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the scopeFilter parameter.
Note: The attributes must be separated by a AND or OR". | RAN | GNBDUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | -| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the scopeFilter parameter. A condition is a complete unit of scopeFilter parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | GNBDUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" |

+

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | +|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| To return the ids for all instances of the entityTypeName used in the query. | RAN | ODUFunction | | | All ids of every ODUFunction | +| To return all attributes of every instance of the entityTypeName used in the query. | RAN | ODUFunction | /attributes | | All ODUFunctions with every attribute | +| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the targetFilter parameter.
Note: The attribute must be a valid field of the object. | RAN | ODUFunction | /attributes(gNBId) | | All gNBIds of every ODUFunction | +| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the targetFilter parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | ODUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every ODUFunction | +| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the scopeFilter parameter. | RAN | ODUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where sourceIds contains SubNetwork=Ireland | +| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the scopeFilter parameter.
Note: The attributes must be separated by a AND or OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | +| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the scopeFilter parameter. A condition is a complete unit of scopeFilter parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | +| To return the metadata for all instances of the entityTypeName used in the query, that is firstDiscovered within the given timeframe in the scopeFilter parameter.
Note: The timestamps can be queried in any timezone. | RAN | ODUFunction | | /metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30'] | Unique set of ids of ODUFunctions, where metadata contains firstDiscovered timestamp within the range '2025-01-06T12:34:56.789+05:30' and '2025-01-09T16:10:36.461565+05:30' |

Querying connected entities

The entityTypeName is used as the root of the queries.

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. | | To return the ids for all instances of an entityTypeName related by an association to another entity specified by its id. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element urn:3gpp:dn: ManagedElement=1. | -| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their id. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All EnodeBFunction entities with enbId as 1, managed by the Managed Element urn:3gpp:dn: ManagedElement=1 or urn:3gpp:dn: ManagedElement=2, and provides EuTranCell urn:3gpp:dn: ManagedElement=1, EUtranCell=2. | -| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given scopeFilter parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All EnodeBFunction entities that provide an EuTranCell whose tac equals 1 |

+| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their id. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All ENodeBFunction entities with enbId as 1, managed by the Managed Element urn:3gpp:dn: ManagedElement=1 or urn:3gpp:dn: ManagedElement=2, and provides EuTranCell urn:3gpp:dn: ManagedElement=1, EUtranCell=2. | +| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given scopeFilter parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All ENodeBFunction entities that provide an EUTranCell whose tac equals 1 |

Querying based on geographical location

The entityTypeName is used as the root of the queries. Use the "Well-known text" (WKT) representation of geometry to specify geometry objects.

| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | @@ -241,9 +250,9 @@ retrieved and filtered using the /attributes.

The entityTypeName is used as the root of the queries.

| Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| To return the relationships for a given entity specified by its id. | RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | | All relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1. | -| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | /MANAGEDELEMENT _MANAGES _GNBDUFUNCTION | | All MANAGEDELEMENT _MANAGES _GNBDUFUNCTION relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1. | -| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT _MANAGES _GNBDUFUNCTION relations for the GNBDUFunction with id urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 where the managed element is urn:3gpp:dn: ManagedElement=1. |

+| To return the relationships for a given entity specified by its id. | RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | | All relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1. | +| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | /MANAGEDELEMENT _MANAGES _ODUFUNCTION | | All MANAGEDELEMENT _MANAGES _ODUFUNCTION relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1. | +| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT _MANAGES _ODUFUNCTION relations for the ODUFunction with id urn:3gpp:dn: ManagedElement=1, ODUFunction=1 where the managed element is urn:3gpp:dn: ManagedElement=1. |

Querying on relationships

Here, the relationshipTypeName is used as the root of the queries.

| Use case | domainName | relationshipTypeName | targetFilter | scopeFilter | Query result | @@ -254,28 +263,28 @@ retrieved and filtered using the /attributes.

The domainName is used as the root of the queries.

| Use case | domainName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------| -| Return all related entity IDs that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'gnbdu-function-model:Indoor'] | All the entity IDs that are classified with "gnbdu-function-model:Indoor" in RAN domain. | -| Return all related entity IDs that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity IDs that are partially matched with "Ind" in RAN domain. | -| Return all related entity IDs that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@gnbdu-function-model:textdata = 'Stockholm'] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata = 'Stockholm'" in RAN domain. | -| Return all related entity IDs that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@gnbdu-function-model:textdata, '')] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata as key of the decorator in RAN domain. |

+| Return all related entity ids that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'odu-function-model:Indoor'] | All the entity ids that are classified with "odu-function-model:Indoor" in RAN domain. | +| Return all related entity ids that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity ids that are partially matched with "Ind" in RAN domain. | +| Return all related entity ids that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@odu-function-model:textdata = 'Stockholm'] | All the entity ids that are exactly matched with "odu-function-model:textdata = 'Stockholm'" in RAN domain. | +| Return all related entity ids that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@odu-function-model:textdata, '')] | All the entity ids that are exactly matched with "odu-function-model:textdata as key of the decorator in RAN domain. |

The entityName is used as the root of the queries.

| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Return all related entity IDs and classifiers. | NRCellDU | | /classifiers | | All NRCellDU IDs and classifiers. | -| Return all related entity IDs and decorators. | NRCellDU | | /decorators | | All NRCellDU IDs and decorators. | -| Return all related entity IDs that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All NRCellDU IDs where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "gnbdu-function-model:Indoor". | -| Return all related entity IDs and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU IDs and classifiers partially contains the text "Ind". | -| Return all related entity IDs and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | -| Return all related entity IDs, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". |

+| Return all related entity ids and classifiers. | NRCellDU | | /classifiers | | All NRCellDU ids and classifiers. | +| Return all related entity ids and decorators. | NRCellDU | | /decorators | | All NRCellDU ids and decorators. | +| Return all related entity ids that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All NRCellDU ids where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "odu-function-model:Indoor". | +| Return all related entity ids and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU ids and classifiers partially contains the text "Ind". | +| Return all related entity ids and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | +| Return all related entity ids, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". |

The relationshipTypeName is used as the root of the queries.

| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Return all related relationships IDs and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and classifiers. | -| Return all related relationships IDs and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators. | -| Return all related relationship IDs that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "gnbdu-function-model:Indoor". | -| Return all related relationships IDs and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | -| Return all related relationships IDs and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | -| Return all related relationships IDs,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". |

+| Return all related relationship ids and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and classifiers. | +| Return all related relationship ids and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators. | +| Return all related relationship ids that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "odu-function-model:Indoor". | +| Return all related relationship ids and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | +| Return all related relationship ids and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | +| Return all related relationship ids,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". |

Contact Info: team@openapitools.org
diff --git a/docs/offeredapis/topology-exposure-inventory-openapi.json b/docs/offeredapis/topology-exposure-inventory-openapi.json index 6815638..ca0c7bd 100644 --- a/docs/offeredapis/topology-exposure-inventory-openapi.json +++ b/docs/offeredapis/topology-exposure-inventory-openapi.json @@ -1,7 +1,7 @@ { "openapi" : "3.0.2", "info" : { - "description" : "Topology Exposure and Inventory data is the information that represents entities\nin a telecommunications network and the relationships between them that\nprovide insight into a particular aspect of the network of importance to\nspecific use cases. Topology and Inventory data can be derived from\ninventory, configuration, or other data.\n\nTopology Exposure and Inventory supports several topology domains. A domain is a\ngrouping of topology and inventory entities that handles topology and\ninventory data.\n\nEntities are enabling the modelling and storage of complex network\ninfrastructure and relationships.\n\nA relationship is a bi-directional connection between two entities, one\nof which is the originating side (A-side) and the other is the\nterminating side (B-side). The order of the sides matters since it\ndefines the relationship itself which must be unique.\n\nClassifier (also known as tag or label) permits the association of a \nwell defined user specified string with an entity or relationship.\n\nDecorators are user-defined attributes (key-value pairs) which can\nbe applied to topology entities and relationships.\n\nTopology groups provide the capability to create user-defined collections of\ntopology entities and/or relationships of any type. Groups can be either\nstatic or dynamic based on how they are created.\n\nTopology Exposure and Inventory API provides the capabilities to fetch topology\ndata. Using the filtering options, it is possible to define more specific\nquery requests.\n\n## Querying simple entities\nThe *entityTypeName* is used as the root of the queries (from here\nreferred to as RootObject). Every other object, either in *targetFilter* or\n*scopeFilter*, has to relate to the RootObject. The queries are\nconstructed starting from the RootObject and all other objects are joined\nto it. If there is no connection between the RootObject and the other\nobject(s), the query is not constructed. The RootObject still can be\nretrieved and filtered using the */attributes*.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of the entityTypeName used in the query. | RAN | GNBDUFunction | | | All ids of every GNBDUFunction |\n| To return all attributes of every instance of the entityTypeName used in the query. | RAN | GNBDUFunction | /attributes | | All GNBDUFunctions with every attribute |\n| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | GNBDUFunction | /attributes(gNBId) | | All gNBIds of every GNBDUFunction |\n| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma \",\" when using parenthesis \"()\". | RAN | GNBDUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every GNBDUFunction |\n| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where sourceIds contains *SubNetwork=Ireland* |\n| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*\". | RAN | GNBDUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 |\n| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon \";\" to represent AND, or a pipe symbol \"|\" to represent OR. | RAN | GNBDUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with \"SubNetwork=Europe\" |\n\n## Querying connected entities\nThe *entityTypeName* is used as the root of the queries.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. |\n| To return the ids for all instances of an entityTypeName related by an association to another entity specified by its *id*. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element *urn:3gpp:dn: ManagedElement=1*. |\n| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All EnodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. |\n| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All EnodeBFunction entities that provide an EuTranCell whose tac equals 1 |\n\n## Querying based on geographical location\nThe *entityTypeName* is used as the root of the queries. Use the \"Well-known text\" (WKT) representation of geometry to specify geometry objects.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of an entityTypeName where the given attribute is covered by the given polygon. | EQUIPMENT | AntennaModule | | /attributes[coveredBy(@geo-location, 'POLYGON ((-73.958444 40.800533, -73.981962 40.768558, -73.973207 40.765048, -73.949861 40.797024, -73.958444 40.800533))')] | All AntennaModule entities covered by the given polygon. |\n| To return the attributes for all instances of an entityTypeName where the given attribute is covered by the given collection of polygons. | EQUIPMENT | AntennaModule | /attributes | /attributes[coveredBy(@geo-location, 'MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))')] | All AntennaModule entities covered by the given polygons. |\n| To return the ids for all instances of an entityTypeName within the given distance in meters from a given attribute. | EQUIPMENT | AntennaModule | | /attributes[withinMeters(@geo-location, 'POINT(-73.958444 40.800533)', 500.5)] | All AntennaModule entities within the given distance from the given point. |\n| To return the attributes for all instances of an entityTypeName which has a connected entity whose given attribute is within a polygon | RAN | NRCellDU | /attributes | /serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON ((-73.958444 40.800533, -73.981962 40.768558, -73.973207 40.765048, -73.949861 40.797024, -73.958444 40.800533))')] | All NRCellDU entities that have at least one connected AntennaModule with a geo-location attribute within the given polygon. |\n\n## Querying entities for relationships\nThe *entityTypeName* is used as the root of the queries.\n\n| Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the relationships for a given entity specified by its id. | RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | | All relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. |\n| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | /MANAGEDELEMENT _MANAGES _GNBDUFUNCTION | | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. |\n| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. |\n\n## Querying on relationships\nHere, the *relationshipTypeName* is used as the root of the queries.\n\n| Use case | domainName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:---------------------------------------------------------------------------------------------------------|-------------|:----------------------------------------|:-------------|:-----------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return all relationships for a specified relationship type. | REL_OAM_RAN | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | | All MANAGEDELEMENT_MANAGES_ENODEBFUNCTION relationships. |\n| To return all relationships for a specified relationship type with a specified association to an entity. | REL_OAM_RAN | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT_MANAGES_ENODEBFUNCTION relationships having an association *managed-by-managedElement* to ManagedElement *urn:3gpp:dn: ManagedElement=1*. |\n\n## Querying on classifiers and decorators\nThe *domainName* is used as the root of the queries.\n\n| Use case | domainName | targetFilter | scopeFilter | Query result |\n|:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|\n| Return all related entity IDs that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'gnbdu-function-model:Indoor'] | All the entity IDs that are classified with \"gnbdu-function-model:Indoor\" in RAN domain. |\n| Return all related entity IDs that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity IDs that are partially matched with \"Ind\" in RAN domain. |\n| Return all related entity IDs that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@gnbdu-function-model:textdata = 'Stockholm'] | All the entity IDs that are exactly matched with \"gnbdu-function-model:textdata = 'Stockholm'\" in RAN domain. |\n| Return all related entity IDs that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@gnbdu-function-model:textdata, '')] | All the entity IDs that are exactly matched with \"gnbdu-function-model:textdata as key of the decorator in RAN domain. |\n\nThe *entityName* is used as the root of the queries.\n\n| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Return all related entity IDs and classifiers. | NRCellDU | | /classifiers | | All NRCellDU IDs and classifiers. |\n| Return all related entity IDs and decorators. | NRCellDU | | /decorators | | All NRCellDU IDs and decorators. |\n| Return all related entity IDs that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All NRCellDU IDs where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator is 'Stockholm'\" and where classifier exactly contains \"gnbdu-function-model:Indoor\". |\n| Return all related entity IDs and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU IDs and classifiers partially contains the text \"Ind\". |\n| Return all related entity IDs and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator partially contains 'Stoc'. |\n| Return all related entity IDs, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and decorators where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text \"Ind\". |\n\n The *relationshipTypeName* is used as the root of the queries.\n\n| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Return all related relationships IDs and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and classifiers. |\n| Return all related relationships IDs and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators. |\n| Return all related relationship IDs that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator is 'Stockholm'\" and classifiers exactly contains \"gnbdu-function-model:Indoor\". |\n| Return all related relationships IDs and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text \"Ind\". |\n| Return all related relationships IDs and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator partially contains 'Stock'. |\n| Return all related relationships IDs,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is \"gnbdu-function-model:textdata\" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text \"Ind\". |\n", + "description" : "Topology Exposure and Inventory data is the information that represents entities\nin a telecommunications network and the relationships between them that\nprovide insight into a particular aspect of the network of importance to\nspecific use cases. Topology and Inventory data can be derived from\ninventory, configuration, or other data.\n\nTopology Exposure and Inventory supports several topology domains. A domain is a\ngrouping of topology and inventory entities that handles topology and\ninventory data.\n\nEntities are enabling the modelling and storage of complex network\ninfrastructure and relationships.\n\nA relationship is a bi-directional connection between two entities, one\nof which is the originating side (A-side) and the other is the\nterminating side (B-side). The order of the sides matters since it\ndefines the relationship itself which must be unique.\n\nClassifier (also known as tag or label) permits the association of a \nwell defined user specified string with an entity or relationship.\n\nDecorators are user-defined attributes (key-value pairs) which can\nbe applied to topology entities and relationships.\n\nMetadata provides additional information about entities and relationships within the database.\nThe reliabilityIndicator is used to indicate the reliability status of the topology data within the network.\nThe firstDiscovered timestamp is set for an entity and relationship instance when the instances are created for \nthe first time in Topology & Inventory. \nThe lastModified timestamp is set for updates to entities or relationships in Topology & Inventory, \nexcluding updates to classifiers or decorators.\nreliabilityIndicator, firstDiscovered, and lastModified are implemented as name-value pairs within the metadata.\nThey apply to every entity and relationship.\n\nTopology groups provide the capability to create user-defined collections of\ntopology entities and/or relationships of any type. Groups can be either\nstatic or dynamic based on how they are created.\n\nTopology Exposure and Inventory API provides the capabilities to fetch topology\ndata. Using the filtering options, it is possible to define more specific\nquery requests.\n\n## Querying simple entities\nThe *entityTypeName* is used as the root of the queries (from here\nreferred to as RootObject). Every other object, either in *targetFilter* or\n*scopeFilter*, has to relate to the RootObject. The queries are\nconstructed starting from the RootObject and all other objects are joined\nto it. If there is no connection between the RootObject and the other\nobject(s), the query is not constructed. The RootObject still can be\nretrieved and filtered using the */attributes*.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of the entityTypeName used in the query. | RAN | ODUFunction | | | All ids of every ODUFunction |\n| To return all attributes of every instance of the entityTypeName used in the query. | RAN | ODUFunction | /attributes | | All ODUFunctions with every attribute |\n| To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | ODUFunction | /attributes(gNBId) | | All gNBIds of every ODUFunction |\n| To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma \",\" when using parenthesis \"()\". | RAN | ODUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every ODUFunction |\n| To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | ODUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where sourceIds contains *SubNetwork=Ireland* |\n| To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*. | RAN | ODUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 |\n| To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon \";\" to represent AND, or a pipe symbol \"|\" to represent OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with \"SubNetwork=Europe\" |\n| To return the metadata for all instances of the entityTypeName used in the query, that is *firstDiscovered* within the given timeframe in the *scopeFilter* parameter.
Note: The timestamps can be queried in any timezone. | RAN | ODUFunction | | /metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30'] | Unique set of ids of ODUFunctions, where metadata contains *firstDiscovered* timestamp within the range '2025-01-06T12:34:56.789+05:30' and '2025-01-09T16:10:36.461565+05:30' |\n\n## Querying connected entities\nThe *entityTypeName* is used as the root of the queries.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. |\n| To return the ids for all instances of an entityTypeName related by an association to another entity specified by its *id*. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element *urn:3gpp:dn: ManagedElement=1*. |\n| To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All ENodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. |\n| To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All ENodeBFunction entities that provide an EUTranCell whose tac equals 1 |\n\n## Querying based on geographical location\nThe *entityTypeName* is used as the root of the queries. Use the \"Well-known text\" (WKT) representation of geometry to specify geometry objects.\n\n| Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result |\n|:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the ids for all instances of an entityTypeName where the given attribute is covered by the given polygon. | EQUIPMENT | AntennaModule | | /attributes[coveredBy(@geo-location, 'POLYGON ((-73.958444 40.800533, -73.981962 40.768558, -73.973207 40.765048, -73.949861 40.797024, -73.958444 40.800533))')] | All AntennaModule entities covered by the given polygon. |\n| To return the attributes for all instances of an entityTypeName where the given attribute is covered by the given collection of polygons. | EQUIPMENT | AntennaModule | /attributes | /attributes[coveredBy(@geo-location, 'MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))')] | All AntennaModule entities covered by the given polygons. |\n| To return the ids for all instances of an entityTypeName within the given distance in meters from a given attribute. | EQUIPMENT | AntennaModule | | /attributes[withinMeters(@geo-location, 'POINT(-73.958444 40.800533)', 500.5)] | All AntennaModule entities within the given distance from the given point. |\n| To return the attributes for all instances of an entityTypeName which has a connected entity whose given attribute is within a polygon | RAN | NRCellDU | /attributes | /serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON ((-73.958444 40.800533, -73.981962 40.768558, -73.973207 40.765048, -73.949861 40.797024, -73.958444 40.800533))')] | All NRCellDU entities that have at least one connected AntennaModule with a geo-location attribute within the given polygon. |\n\n## Querying entities for relationships\nThe *entityTypeName* is used as the root of the queries.\n\n| Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return the relationships for a given entity specified by its id. | RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | | All relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. |\n| To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | /MANAGEDELEMENT _MANAGES _ODUFUNCTION | | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. |\n| To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. |\n\n## Querying on relationships\nHere, the *relationshipTypeName* is used as the root of the queries.\n\n| Use case | domainName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:---------------------------------------------------------------------------------------------------------|-------------|:----------------------------------------|:-------------|:-----------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| To return all relationships for a specified relationship type. | REL_OAM_RAN | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | | All MANAGEDELEMENT_MANAGES_ENODEBFUNCTION relationships. |\n| To return all relationships for a specified relationship type with a specified association to an entity. | REL_OAM_RAN | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | All MANAGEDELEMENT_MANAGES_ENODEBFUNCTION relationships having an association *managed-by-managedElement* to ManagedElement *urn:3gpp:dn: ManagedElement=1*. |\n\n## Querying on classifiers and decorators\nThe *domainName* is used as the root of the queries.\n\n| Use case | domainName | targetFilter | scopeFilter | Query result |\n|:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|\n| Return all related entity ids that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'odu-function-model:Indoor'] | All the entity ids that are classified with \"odu-function-model:Indoor\" in RAN domain. |\n| Return all related entity ids that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity ids that are partially matched with \"Ind\" in RAN domain. |\n| Return all related entity ids that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@odu-function-model:textdata = 'Stockholm'] | All the entity ids that are exactly matched with \"odu-function-model:textdata = 'Stockholm'\" in RAN domain. |\n| Return all related entity ids that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@odu-function-model:textdata, '')] | All the entity ids that are exactly matched with \"odu-function-model:textdata as key of the decorator in RAN domain. |\n\nThe *entityName* is used as the root of the queries.\n\n| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Return all related entity ids and classifiers. | NRCellDU | | /classifiers | | All NRCellDU ids and classifiers. |\n| Return all related entity ids and decorators. | NRCellDU | | /decorators | | All NRCellDU ids and decorators. |\n| Return all related entity ids that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All NRCellDU ids where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator is 'Stockholm'\" and where classifier exactly contains \"odu-function-model:Indoor\". |\n| Return all related entity ids and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU ids and classifiers partially contains the text \"Ind\". |\n| Return all related entity ids and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator partially contains 'Stoc'. |\n| Return all related entity ids, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and decorators where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text \"Ind\". |\n\n The *relationshipTypeName* is used as the root of the queries.\n\n| Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result |\n|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Return all related relationship ids and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and classifiers. |\n| Return all related relationship ids and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators. |\n| Return all related relationship ids that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator is 'Stockholm'\" and classifiers exactly contains \"odu-function-model:Indoor\". |\n| Return all related relationship ids and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text \"Ind\". |\n| Return all related relationship ids and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator partially contains 'Stock'. |\n| Return all related relationship ids,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is \"odu-function-model:textdata\" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text \"Ind\". |\n", "license" : { "name" : "Copyright (C) 2024 Ericsson, Modifications Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved.", "url" : "http://www.apache.org/licenses/LICENSE-2.0" @@ -2947,7 +2947,7 @@ "value" : { "operation" : "merge", "classifiers" : [ "module-x:Outdoor", "module-y:Rural", "module-z:Weekend" ], - "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" ], + "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" ], "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] } }, @@ -2955,7 +2955,7 @@ "value" : { "operation" : "delete", "classifiers" : [ "module-x:Outdoor", "module-z:Weekend" ], - "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" ], + "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" ], "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] } }, @@ -2966,7 +2966,7 @@ "module-x:location" : "Stockholm", "module-y:vendor" : "Ericsson" }, - "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" ], + "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" ], "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] } }, @@ -2976,14 +2976,14 @@ "decorators" : { "module-x:location" : "Stockholm" }, - "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" ], + "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" ], "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] } }, "EntityResponseExample" : { "value" : { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "attributes" : { "cellLocalId" : 91, "nCI" : 91, @@ -2994,7 +2994,12 @@ "location" : "Stockholm" }, "classifiers" : [ "Rural" ], - "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ] + "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] } }, @@ -3007,7 +3012,12 @@ "gNBId" : 10, "gNBIdLength" : 2 }, - "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" ] + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] }, { "o-ran-smo-teiv-ran:GNBCUUPFunction" : [ { @@ -3016,7 +3026,12 @@ "gNBId" : 13, "gNBIdLength" : 2 }, - "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" ] + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] }, { "o-ran-smo-teiv-ran:GNBCUUPFunction" : [ { @@ -3025,7 +3040,12 @@ "gNBId" : 14, "gNBIdLength" : 2 }, - "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" ] + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] } ], "self" : { @@ -3050,9 +3070,14 @@ "value" : { "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER" : [ { "id" : "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B", - "aSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", - "bSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1", - "sourceIds" : [ ] + "aSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "bSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1", + "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] } }, @@ -3061,16 +3086,26 @@ "items" : [ { "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER" : [ { "id" : "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B", - "aSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", - "bSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1", - "sourceIds" : [ ] + "aSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "bSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1", + "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] }, { "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER" : [ { "id" : "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78", - "aSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", - "bSide" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2", - "sourceIds" : [ ] + "aSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2", + "bSide" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2", + "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" ], + "metadata" : { + "reliabilityIndicator" : "OK", + "firstDiscovered" : "2025-01-07T12:20:12.24523200Z", + "lastModified" : "2025-01-08T10:40:36.46156500Z" + } } ] } ], "self" : { @@ -3130,14 +3165,14 @@ "RelationshipTypesResponseExample" : { "value" : { "items" : [ { - "name" : "MANAGEDELEMENT_MANAGES_GNBDUFUNCTION", + "name" : "MANAGEDELEMENT_MANAGES_ODUFUNCTION", "relationships" : { - "href" : "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_GNBDUFUNCTION/relationships" + "href" : "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" } }, { - "name" : "GNBDUFUNCTION_PROVIDES_NRCELLDU", + "name" : "ODUFUNCTION_PROVIDES_NRCELLDU", "relationships" : { - "href" : "/domains/RAN/relationship-types/GNBDUFUNCTION_PROVIDES_NRCELLDU/relationships" + "href" : "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" } }, { "name" : "NRCELLDU_USES_NRSECTORCARRIER", @@ -3338,7 +3373,7 @@ } }, "SchemaResponseExample" : { - "value" : "module o-ran-smo-teiv-ran {\nyang-version 1.1;\nnamespace \"urn:o-ran:smo-teiv-ran\";\nprefix or-teiv-ran;\nimport o-ran-smo-teiv-common-yang-types {prefix or-teiv-types; }\nimport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\nimport _3gpp-common-yang-types { prefix types3gpp; }\norganization \"ORAN\";\ndescription\n\"Sample Model.\";\nrevision \"2024-05-24\" {\n description \"Initial revision.\"\n or-teiv-yext:label 0.1.0;\n}\nor-teiv-yext:domain RAN;\nlist GNBDUFunction {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n container dUpLMNId {\n uses types3gpp:PLMNId;\n }\n leaf gNBDUId {\n type uint32;\n }\n leaf gNBId {\n type uint32;\n }\n leaf gNBIdLength {\n type uint32;\n }\n }\n}\nlist NRCellDU {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n leaf cellLocalId {\n type uint32;\n }\n leaf nCI {\n type uint32;\n }\n leaf nRPCI {\n type uint32;\n }\n leaf nRTAC {\n type uint32;\n }\n }\n}\nlist NRSectorCarrier {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n leaf arfcnDL {\n type uint32;\n }\n leaf arfcnUL {\n type uint32;\n }\n leaf frequencyDL {\n type uint32;\n }\n leaf frequencyUL {\n type uint32;\n }\n leaf bSChannelBwDL {\n type uint32;\n }\n }\n }\n}\n" + "value" : "module o-ran-smo-teiv-ran {\nyang-version 1.1;\nnamespace \"urn:o-ran:smo-teiv-ran\";\nprefix or-teiv-ran;\nimport o-ran-smo-teiv-common-yang-types {prefix or-teiv-types; }\nimport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\nimport _3gpp-common-yang-types { prefix types3gpp; }\norganization \"ORAN\";\ndescription\n\"Sample Model.\";\nrevision \"2024-05-24\" {\n description \"Initial revision.\"\n or-teiv-yext:label 0.1.0;\n}\nor-teiv-yext:domain RAN;\nlist ODUFunction {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n container dUpLMNId {\n uses types3gpp:PLMNId;\n }\n leaf gNBDUId {\n type uint32;\n }\n leaf gNBId {\n type uint32;\n }\n leaf gNBIdLength {\n type uint32;\n }\n }\n}\nlist NRCellDU {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n leaf cellLocalId {\n type uint32;\n }\n leaf nCI {\n type uint32;\n }\n leaf nRPCI {\n type uint32;\n }\n leaf nRTAC {\n type uint32;\n }\n }\n}\nlist NRSectorCarrier {\n uses or-teiv-types:Top_Grp_Type;\n key id;\n container attributes {\n leaf arfcnDL {\n type uint32;\n }\n leaf arfcnUL {\n type uint32;\n }\n leaf frequencyDL {\n type uint32;\n }\n leaf frequencyUL {\n type uint32;\n }\n leaf bSChannelBwDL {\n type uint32;\n }\n }\n }\n}\n" }, "CreateStaticGroupPayloadExample" : { "value" : { @@ -3346,23 +3381,23 @@ "type" : "static", "providedMembers" : [ { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFunction" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + "o-ran-smo-teiv-ran:ODUFunction" : [ { + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" } ] }, { "o-ran-smo-teiv-oam:ManagedElement" : [ { "id" : "urn:3gpp:dn:ManagedElement=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418" + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624" } ] }, { - "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56" + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8" } ] } ] } @@ -3421,23 +3456,23 @@ "value" : { "items" : [ { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFunction" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + "o-ran-smo-teiv-ran:ODUFunction" : [ { + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" } ] }, { "o-ran-smo-teiv-oam:ManagedElement" : [ { "id" : "urn:3gpp:dn:ManagedElement=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418" + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624" } ] }, { - "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56" + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8" } ] } ], "self" : { @@ -3462,23 +3497,23 @@ "value" : { "items" : [ { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFunction" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + "o-ran-smo-teiv-ran:ODUFunction" : [ { + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" } ] }, { "o-ran-smo-teiv-oam:ManagedElement" : [ { "id" : "urn:3gpp:dn:ManagedElement=1" } ] }, { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418" + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624" } ] }, { - "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" : [ { - "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56" + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION" : [ { + "id" : "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8" } ] } ], "self" : { @@ -3504,7 +3539,7 @@ "operation" : "merge", "providedMembers" : [ { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" } ] } ] } @@ -3514,7 +3549,7 @@ "operation" : "remove", "providedMembers" : [ { "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + "id" : "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" } ] } ] } diff --git a/docs/offeredapis/topology-exposure-inventory-openapi.yaml b/docs/offeredapis/topology-exposure-inventory-openapi.yaml index 7a85343..edbec7c 100644 --- a/docs/offeredapis/topology-exposure-inventory-openapi.yaml +++ b/docs/offeredapis/topology-exposure-inventory-openapi.yaml @@ -48,6 +48,15 @@ info: Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships. + Metadata provides additional information about entities and relationships within the database. + The reliabilityIndicator is used to indicate the reliability status of the topology data within the network. + The firstDiscovered timestamp is set for an entity and relationship instance when the instances are created for + the first time in Topology & Inventory. + The lastModified timestamp is set for updates to entities or relationships in Topology & Inventory, + excluding updates to classifiers or decorators. + reliabilityIndicator, firstDiscovered, and lastModified are implemented as name-value pairs within the metadata. + They apply to every entity and relationship. + Topology groups provide the capability to create user-defined collections of topology entities and/or relationships of any type. Groups can be either static or dynamic based on how they are created. @@ -65,15 +74,16 @@ info: object(s), the query is not constructed. The RootObject still can be retrieved and filtered using the */attributes*. - | Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | - |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------| - | To return the ids for all instances of the entityTypeName used in the query. | RAN | GNBDUFunction | | | All ids of every GNBDUFunction | - | To return all attributes of every instance of the entityTypeName used in the query. | RAN | GNBDUFunction | /attributes | | All GNBDUFunctions with every attribute | - | To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | GNBDUFunction | /attributes(gNBId) | | All gNBIds of every GNBDUFunction | - | To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | GNBDUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every GNBDUFunction | - | To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where sourceIds contains *SubNetwork=Ireland* | - | To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*". | RAN | GNBDUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | - | To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | GNBDUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | + | Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | + |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + | To return the ids for all instances of the entityTypeName used in the query. | RAN | ODUFunction | | | All ids of every ODUFunction | + | To return all attributes of every instance of the entityTypeName used in the query. | RAN | ODUFunction | /attributes | | All ODUFunctions with every attribute | + | To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | ODUFunction | /attributes(gNBId) | | All gNBIds of every ODUFunction | + | To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | ODUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every ODUFunction | + | To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | ODUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where sourceIds contains *SubNetwork=Ireland* | + | To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*. | RAN | ODUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | + | To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | + | To return the metadata for all instances of the entityTypeName used in the query, that is *firstDiscovered* within the given timeframe in the *scopeFilter* parameter.
Note: The timestamps can be queried in any timezone. | RAN | ODUFunction | | /metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30'] | Unique set of ids of ODUFunctions, where metadata contains *firstDiscovered* timestamp within the range '2025-01-06T12:34:56.789+05:30' and '2025-01-09T16:10:36.461565+05:30' | ## Querying connected entities The *entityTypeName* is used as the root of the queries. @@ -82,8 +92,8 @@ info: |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. | | To return the ids for all instances of an entityTypeName related by an association to another entity specified by its *id*. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element *urn:3gpp:dn: ManagedElement=1*. | - | To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All EnodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. | - | To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All EnodeBFunction entities that provide an EuTranCell whose tac equals 1 | + | To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All ENodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. | + | To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All ENodeBFunction entities that provide an EUTranCell whose tac equals 1 | ## Querying based on geographical location The *entityTypeName* is used as the root of the queries. Use the "Well-known text" (WKT) representation of geometry to specify geometry objects. @@ -100,9 +110,9 @@ info: | Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | To return the relationships for a given entity specified by its id. | RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | | All relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. | - | To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | /MANAGEDELEMENT _MANAGES _GNBDUFUNCTION | | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. | - | To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. | + | To return the relationships for a given entity specified by its id. | RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | | All relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. | + | To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | /MANAGEDELEMENT _MANAGES _ODUFUNCTION | | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. | + | To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. | ## Querying on relationships Here, the *relationshipTypeName* is used as the root of the queries. @@ -117,32 +127,32 @@ info: | Use case | domainName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------| - | Return all related entity IDs that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'gnbdu-function-model:Indoor'] | All the entity IDs that are classified with "gnbdu-function-model:Indoor" in RAN domain. | - | Return all related entity IDs that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity IDs that are partially matched with "Ind" in RAN domain. | - | Return all related entity IDs that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@gnbdu-function-model:textdata = 'Stockholm'] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata = 'Stockholm'" in RAN domain. | - | Return all related entity IDs that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@gnbdu-function-model:textdata, '')] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata as key of the decorator in RAN domain. | + | Return all related entity ids that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'odu-function-model:Indoor'] | All the entity ids that are classified with "odu-function-model:Indoor" in RAN domain. | + | Return all related entity ids that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity ids that are partially matched with "Ind" in RAN domain. | + | Return all related entity ids that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@odu-function-model:textdata = 'Stockholm'] | All the entity ids that are exactly matched with "odu-function-model:textdata = 'Stockholm'" in RAN domain. | + | Return all related entity ids that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@odu-function-model:textdata, '')] | All the entity ids that are exactly matched with "odu-function-model:textdata as key of the decorator in RAN domain. | The *entityName* is used as the root of the queries. | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | Return all related entity IDs and classifiers. | NRCellDU | | /classifiers | | All NRCellDU IDs and classifiers. | - | Return all related entity IDs and decorators. | NRCellDU | | /decorators | | All NRCellDU IDs and decorators. | - | Return all related entity IDs that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All NRCellDU IDs where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "gnbdu-function-model:Indoor". | - | Return all related entity IDs and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU IDs and classifiers partially contains the text "Ind". | - | Return all related entity IDs and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | - | Return all related entity IDs, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". | - + | Return all related entity ids and classifiers. | NRCellDU | | /classifiers | | All NRCellDU ids and classifiers. | + | Return all related entity ids and decorators. | NRCellDU | | /decorators | | All NRCellDU ids and decorators. | + | Return all related entity ids that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All NRCellDU ids where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "odu-function-model:Indoor". | + | Return all related entity ids and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU ids and classifiers partially contains the text "Ind". | + | Return all related entity ids and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | + | Return all related entity ids, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". | + The *relationshipTypeName* is used as the root of the queries. - + | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | Return all related relationships IDs and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and classifiers. | - | Return all related relationships IDs and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators. | - | Return all related relationship IDs that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "gnbdu-function-model:Indoor". | - | Return all related relationships IDs and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | - | Return all related relationships IDs and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | - | Return all related relationships IDs,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". | + | Return all related relationship ids and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and classifiers. | + | Return all related relationship ids and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators. | + | Return all related relationship ids that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "odu-function-model:Indoor". | + | Return all related relationship ids and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | + | Return all related relationship ids and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | + | Return all related relationship ids,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". | version: 0.11.0 title: Topology Exposure and Inventory API @@ -1635,8 +1645,8 @@ components: - module-y:Rural - module-z:Weekend entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ClassifierDeleteExample: @@ -1646,8 +1656,8 @@ components: - module-x:Outdoor - module-z:Weekend entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" @@ -1658,8 +1668,8 @@ components: module-x:location: Stockholm module-y:vendor: Ericsson entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" DecoratorDeleteExample: @@ -1668,15 +1678,15 @@ components: decorators: module-x:location: Stockholm entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" EntityResponseExample: value: o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" attributes: cellLocalId: 91 nCI: 91 @@ -1687,8 +1697,12 @@ components: classifiers: - Rural sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" EntitiesResponseExample: value: @@ -1701,6 +1715,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" - "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:GNBCUUPFunction: - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" attributes: @@ -1709,6 +1727,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" - "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:GNBCUUPFunction: - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" attributes: @@ -1717,6 +1739,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" - "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" self: href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" first: @@ -1733,23 +1759,41 @@ components: value: o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" RelationshipsResponseExample: value: items: - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" self: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" first: @@ -1789,12 +1833,12 @@ components: RelationshipTypesResponseExample: value: items: - - name: "MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" + - name: "MANAGEDELEMENT_MANAGES_ODUFUNCTION" relationships: - href: "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_GNBDUFUNCTION/relationships" - - name: "GNBDUFUNCTION_PROVIDES_NRCELLDU" + href: "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" + - name: "ODUFUNCTION_PROVIDES_NRCELLDU" relationships: - href: "/domains/RAN/relationship-types/GNBDUFUNCTION_PROVIDES_NRCELLDU/relationships" + href: "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" - name: "NRCELLDU_USES_NRSECTORCARRIER" relationships: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" @@ -1947,7 +1991,7 @@ components: or-teiv-yext:label 0.1.0; } or-teiv-yext:domain RAN; - list GNBDUFunction { + list ODUFunction { uses or-teiv-types:Top_Grp_Type; key id; container attributes { @@ -2012,15 +2056,15 @@ components: type: static providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 CreateDynamicGroupGetEntitiesByDomainPayloadExample: value: @@ -2064,15 +2108,15 @@ components: value: items: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 self: href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" first: @@ -2089,15 +2133,15 @@ components: value: items: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 self: href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" first: @@ -2115,14 +2159,14 @@ components: operation: "merge" providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 RemoveProvidedMembersPayloadExample: value: operation: "remove" providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 StaticGroupResponseExample: value: diff --git a/docs/pgsql-schema-generator-guide.rst b/docs/pgsql-schema-generator-guide.rst index dd461de..3a7a6a4 100644 --- a/docs/pgsql-schema-generator-guide.rst +++ b/docs/pgsql-schema-generator-guide.rst @@ -322,7 +322,7 @@ Sample entries: | moduleReferenceName | TEXT NOT NULL | A reference to an associated module | +------------------------------------------+------------------+-----------------------------------------+ | | FOREIGN KEY ("moduleReferenceName") | FOREIGN KEY | Foreign key constraint | -| | REFERENCES ties_model.module_reference | | | +| | REFERENCES teiv_model.module_reference | | | | | ("name") ON DELETE CASCADE | | | +------------------------------------------+------------------+-----------------------------------------+ @@ -362,16 +362,16 @@ Sample entries: | moduleReferenceName | TEXT PRIMARY KEY | The name of the module reference associated with the relationship | +------------------------------------------+------------------+-------------------------------------------------------------------+ | | FOREIGN KEY ("aSideModule") REFERENCES | FOREIGN KEY | Foreign key constraint | -| | ties_model.module_reference ("name") | | | +| | teiv_model.module_reference ("name") | | | | | ON DELETE CASCADE | | | +------------------------------------------+------------------+-------------------------------------------------------------------+ | | FOREIGN KEY ("bSideModule") REFERENCES | FOREIGN KEY | Foreign key constraint | -| | ties_model.module_reference ("name") | | | +| | teiv_model.module_reference ("name") | | | | | ON DELETE CASCADE | | | | +------------------------------------------+------------------+-------------------------------------------------------------------+ | | FOREIGN KEY ("moduleReferenceName") |FOREIGN KEY | Foreign key constraint | | | REFERENCES | | | -| | ties_model.module_reference ("name") | | | +| | teiv_model.module_reference ("name") | | | | | ON DELETE CASCADE | | | +------------------------------------------+------------------+-------------------------------------------------------------------+ @@ -434,7 +434,7 @@ The SQL entries for consumer data include | | | | belongs to. | +--------------------------------------------------+------------------+-----------------------------------+ | | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint | -| | ties_consumer_data.module_reference ("name") | | | +| | teiv_consumer_data.module_reference ("name") | | | | | ON DELETE CASCADE | | | +--------------------------------------------------+------------------+-----------------------------------+ @@ -450,7 +450,7 @@ The SQL entries for consumer data include | | | | belongs to. | +--------------------------------------------------+------------------+-----------------------------------+ | | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint | -| | ties_consumer_data.module_reference ("name") | | | +| | teiv_consumer_data.module_reference ("name") | | | | | ON DELETE CASCADE | | | +--------------------------------------------------+------------------+-----------------------------------+ @@ -470,7 +470,7 @@ Skeleton Data and Model SQL Files .. code-block:: sql - CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( + CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS @@ -485,10 +485,10 @@ Skeleton Data and Model SQL Files .. code-block:: sql - SELECT ties_data.create_constraint_if_not_exists( + SELECT teiv_data.create_constraint_if_not_exists( 'CloudNativeApplication', 'PK_CloudNativeApplication_id', - 'ALTER TABLE ties_data."CloudNativeApplication" ADD CONSTRAINT "PK_CloudNativeApplication_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CloudNativeApplication" ADD CONSTRAINT "PK_CloudNativeApplication_id" PRIMARY KEY ("id");' ); - "01_init-oran-smo-teiv-model.sql "src/main/resources/scripts/01_init-oran-smo-teiv-model.sql" diff --git a/license/copyright-2024.txt b/license/copyright-2024.txt deleted file mode 100644 index ff5fad2..0000000 --- a/license/copyright-2024.txt +++ /dev/null @@ -1,18 +0,0 @@ -============LICENSE_START======================================================= -Copyright (C) 2024 Ericsson -Modifications Copyright (C) 2024 OpenInfra Foundation Europe -================================================================================ -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. - -SPDX-License-Identifier: Apache-2.0 -============LICENSE_END========================================================= diff --git a/license/javaHeaderDefinition.xml b/license/javaHeaderDefinition.xml deleted file mode 100644 index 318f822..0000000 --- a/license/javaHeaderDefinition.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - /* - * - */ - - (\s|\t)*/\*.*$ - .*\*/(\s|\t)*$ - false - true - false - - diff --git a/license/xmlHeaderDefinition.xml b/license/xmlHeaderDefinition.xml deleted file mode 100644 index f7331cb..0000000 --- a/license/xmlHeaderDefinition.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - ]]> - $]]> - - (\s|\t)*$]]> - false - true - false - - diff --git a/pgsql-schema-generator/README.md b/pgsql-schema-generator/README.md index f898035..7ebc7a4 100644 --- a/pgsql-schema-generator/README.md +++ b/pgsql-schema-generator/README.md @@ -1,3 +1,25 @@ + + + # PG SQL Schema Generator *PG SQL Schema Generator* provides the capability of generating a PostgresSQL schema from the YANG models. This schema @@ -277,7 +299,7 @@ populate entity_info table. | storedAt | TEXT PRIMARY KEY | Un-hashed table name where entity type instances are stored | | name | TEXT NOT NULL | The entity type name | | moduleReferenceName | TEXT NOT NULL | A reference to an associated module | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | **relationship_info:** When it comes to relationship info generation module reference names are assigned to relationships. For each relationship the max cardinality is taken and then @@ -301,9 +323,9 @@ populate entity_info table. | storedAt | TEXT NOT NULL | The un-hashed table name where relation instance information is stored | | connectSameEntity | BOOLEAN NOT NULL | Indicates whether the relationship connects the same entity | | moduleReferenceName | TEXT PRIMARY KEY | The name of the module reference associated with the relationship | - | FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | - | FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | Along with this it ensures that the structure for the model schema SQL file starts with the correct structure by importing the baseline schema information. @@ -383,7 +405,7 @@ The SQL entries for consumer data include | name | TEXT PRIMARY KEY | The key of the decorator. | | dataType | VARCHAR(511) | The data type of the decorator, needed for parsing. | | moduleReferenceName | TEXT | References the corresponding consumer module reference the decorator belongs to. | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | - **classifiers:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to topology entities and relationships. @@ -393,7 +415,7 @@ The SQL entries for consumer data include |---------------------------------------------------------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------| | name | TEXT PRIMARY KEY | The actual classifier. | | moduleReferenceName | TEXT | References the corresponding consumer module reference the classifier belongs to. | - | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | + | FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint | ##### How to use classifiers and decorators 1. Create a schema with the /schemas endpoint using Yang Module. After a successful schema creation, the topology objects are ready to be classified. @@ -410,7 +432,7 @@ The SQL entries for consumer data include - Create constant if it doesn't exist ```text - CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( + CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS @@ -425,10 +447,10 @@ The SQL entries for consumer data include Example: ```text - SELECT ties_data.create_constraint_if_not_exists( + SELECT teiv_data.create_constraint_if_not_exists( 'CloudNativeApplication', 'PK_CloudNativeApplication_id', - 'ALTER TABLE ties_data."CloudNativeApplication" ADD CONSTRAINT "PK_CloudNativeApplication_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CloudNativeApplication" ADD CONSTRAINT "PK_CloudNativeApplication_id" PRIMARY KEY ("id");' ); ``` - [01_init-oran-smo-teiv-model.sql](src/main/resources/scripts/01_init-oran-smo-teiv-model.sql) diff --git a/pgsql-schema-generator/pom.xml b/pgsql-schema-generator/pom.xml index 4bae92c..eaa2b32 100644 --- a/pgsql-schema-generator/pom.xml +++ b/pgsql-schema-generator/pom.xml @@ -136,6 +136,18 @@ + + org.apache.rat + apache-rat-plugin + 0.15 + + + + check + + + + com.diffplug.spotless spotless-maven-plugin diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java index 884c372..42089a1 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,23 +49,18 @@ public class Constants { public static final String ALTER = "ALTER"; public static final String DEFAULT = "DEFAULT"; public static final String INDEX = "INDEX"; - public static final String ALTER_TABLE_TIES_DATA_S = "ALTER TABLE ties_data.\"%s\" "; - public static final String ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S = ALTER_TABLE_TIES_DATA_S + "ADD CONSTRAINT \"%s\" "; + public static final String ALTER_TABLE_TEIV_DATA_S = "ALTER TABLE teiv_data.\"%s\" "; + public static final String ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S = ALTER_TABLE_TEIV_DATA_S + "ADD CONSTRAINT \"%s\" "; public static final String CLASSIFIERS = "classifiers"; public static final String DECORATORS = "decorators"; public static final String A_SIDE = "A_SIDE"; public static final String B_SIDE = "B_SIDE"; public static final String RELATION = "RELATION"; - public static final String GEO_LOCATION = "geo-location"; + public static final String GEO_LOCATION = "__geo-location"; public static final String GEOGRAPHY = "geography"; public static final String METADATA = "metadata"; - public static final String UPDATED_TIME = "updated_time"; - public static final String TIMESTAMPTZ = "TIMESTAMPTZ"; public static final String REL_PREFIX = "REL_"; - public static final String RESP_PREFIX = "RESP_"; public static final String BYTEA = "BYTEA"; public static final String REL_METADATA_PREFIX = "REL_" + METADATA + "_"; public static final String HASHED_ID = "hashed_id"; - public static final String REL_UPDATETIME_PREFIX = "REL_" + UPDATED_TIME + "_"; - public static final String REL_RESP_PREFIX = REL_PREFIX + RESP_PREFIX + ID + "_"; } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java index 434d7cb..799d859 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,9 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum IndexType { - GIN("CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN (\"%s\");"), + GIN("CREATE INDEX IF NOT EXISTS \"%s\" ON teiv_data.\"%s\" USING GIN (\"%s\");"), GIN_TRGM_OPS_ON_LIST_AS_JSONB( - "CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN ((\"%s\"::TEXT) gin_trgm_ops);"); + "CREATE INDEX IF NOT EXISTS \"%s\" ON teiv_data.\"%s\" USING GIN ((\"%s\"::TEXT) gin_trgm_ops);"); private final String createIndexStmt; } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PgSchemaGeneratorException.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PgSchemaGeneratorException.java index b06111a..b429ee1 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PgSchemaGeneratorException.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PgSchemaGeneratorException.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ public class PgSchemaGeneratorException extends RuntimeException { } public static PgSchemaGeneratorException assignModuleRefException(final String relationshipName, Exception ex) { - return new PgSchemaGeneratorException(String.format("ties.model : Unable to assign module reference to - %s", + return new PgSchemaGeneratorException(String.format("teiv.model : Unable to assign module reference to - %s", relationshipName), ex); } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaGenerator.java index 7487d2c..56aa742 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaGenerator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,9 +62,9 @@ public abstract class SchemaGenerator { outputStream.write(strToBytes); } catch (IOException exception) { if (schema.getName().endsWith("data.sql")) { - throw PgSchemaGeneratorException.writeGeneratedSchemaException("ties.data", exception); + throw PgSchemaGeneratorException.writeGeneratedSchemaException("teiv.data", exception); } else { - throw PgSchemaGeneratorException.writeGeneratedSchemaException("ties.model", exception); + throw PgSchemaGeneratorException.writeGeneratedSchemaException("teiv.model", exception); } } } else { diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java index 14cf896..02b6ae2 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ public class SchemaParser { String line; while ((line = br.readLine()) != null) { line = line.trim(); - if (line.startsWith("COPY ties_model.relationship_info") && !line.startsWith("\\.")) { + if (line.startsWith("COPY teiv_model.relationship_info") && !line.startsWith("\\.")) { line = br.readLine(); List relData = Arrays.asList(line.replace("\"", "").split("\\s+")); identifiedRelationships.add(Relationship.builder().name(relData.get(0)).aSideAssociationName(relData @@ -85,7 +85,7 @@ public class SchemaParser { } } } catch (IOException exception) { - throw PgSchemaGeneratorException.readBaselineException("ties.data", exception); + throw PgSchemaGeneratorException.readBaselineException("teiv.data", exception); } } return identifiedRelationships; @@ -109,14 +109,14 @@ public class SchemaParser { extractDefaultValueFromBaseline(line, identifiedTables); } else if ((line.contains("CREATE TABLE") || line.contains("ALTER TABLE")) && !line.startsWith("'")) { extractTableColumns(line, identifiedTables, br); - } else if (line.contains("SELECT") && line.contains("ties_data.create_constraint_if_not_exists")) { + } else if (line.contains("SELECT") && line.contains("teiv_data.create_constraint_if_not_exists")) { extractConstraints(identifiedTables, br); } else if (line.startsWith("CREATE INDEX IF NOT EXISTS")) { extractIndex(line, identifiedTables); } } } catch (IOException exception) { - throw PgSchemaGeneratorException.readBaselineException("ties.data", exception); + throw PgSchemaGeneratorException.readBaselineException("teiv.data", exception); } } return identifiedTables; @@ -151,9 +151,9 @@ public class SchemaParser { .tableName(tableToAddConstraintTo).columnToAddConstraintTo(columnToAddForeignKeyTo) .build()); } else if (alterStatement.contains("FOREIGN KEY")) { - String substringFromLastTiesData = alterStatement.substring(StringUtils.lastIndexOf( - alterStatement, "ties_data.\"")); - String referenceTable = StringUtils.substringBetween(substringFromLastTiesData, "\"", "\""); + String substringFromLastTeivData = alterStatement.substring(StringUtils.lastIndexOf( + alterStatement, "teiv_data.\"")); + String referenceTable = StringUtils.substringBetween(substringFromLastTeivData, "\"", "\""); String referenceTableColumn = alterStatement.substring(StringUtils.lastIndexOf( alterStatement, "(") + 1, StringUtils.lastIndexOf(alterStatement, ")")).replace( "\"", "").trim(); diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java index 8295233..4338a5c 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ public class ConsumerDataSchemaGenerator extends SchemaGenerator { FileHelper.copyResourceToFile(skeletonResource, destinationPath.toFile()); this.schema = destinationPath.toFile(); } catch (IOException exception) { - throw PgSchemaGeneratorException.prepareBaselineException("ties.consumer-data", exception); + throw PgSchemaGeneratorException.prepareBaselineException("teiv.consumer-data", exception); } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java index 4efd28b..c6274c2 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -96,7 +96,7 @@ public class DataSchemaGenerator extends SchemaGenerator { } this.schema = newDataSchema; } catch (IOException exception) { - throw PgSchemaGeneratorException.prepareBaselineException("ties.data", exception); + throw PgSchemaGeneratorException.prepareBaselineException("teiv.data", exception); } } @@ -112,7 +112,7 @@ public class DataSchemaGenerator extends SchemaGenerator { List tablesFromSkeleton = SchemaParser.extractDataFromBaseline(tmpSkeletonFile.getAbsolutePath()); tablesForNbcCheck.addAll(tablesFromSkeleton); } catch (IOException exception) { - throw PgSchemaGeneratorException.prepareBaselineException("ties.data", exception); + throw PgSchemaGeneratorException.prepareBaselineException("teiv.data", exception); } // Get tables from baseline sql List
tablesFromBaselineSql = isGreenFieldInstallation ? @@ -147,14 +147,14 @@ public class DataSchemaGenerator extends SchemaGenerator { }); } } catch (IOException exception) { - throw PgSchemaGeneratorException.readCustomSqlFileException("ties.data", exception); + throw PgSchemaGeneratorException.readCustomSqlFileException("teiv.data", exception); } return customSqlQueries; } private StringBuilder generateAnalyzeTableStatement(List
tablesFromModelSvc) { StringBuilder analyzeTableStmt = new StringBuilder(); - tablesFromModelSvc.forEach(table -> analyzeTableStmt.append(String.format("ANALYZE ties_data.\"%s\";%n%n", table + tablesFromModelSvc.forEach(table -> analyzeTableStmt.append(String.format("ANALYZE teiv_data.\"%s\";%n%n", table .getName()))); return analyzeTableStmt; } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java index 04835b8..5b4f7d7 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,12 +38,12 @@ import org.oran.smo.teiv.pgsqlgenerator.UniqueConstraint; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CREATE; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT; import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEOGRAPHY; import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEO_LOCATION; import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID; -import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TEIV_DATA_S; import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX; @Slf4j @@ -100,7 +100,7 @@ public class DataSchemaHelper { */ private StringBuilder generateCreateTableStatements(List newColumns, String tableName) { - StringBuilder storeTableSchema = new StringBuilder(String.format("CREATE TABLE IF NOT EXISTS ties_data.\"%s\" (%n", + StringBuilder storeTableSchema = new StringBuilder(String.format("CREATE TABLE IF NOT EXISTS teiv_data.\"%s\" (%n", tableName)); StringBuilder storeColumns = new StringBuilder(); StringBuilder storeDefaultValues = new StringBuilder(); @@ -133,7 +133,7 @@ public class DataSchemaHelper { */ private StringBuilder generateDefaultValueStatements(Column newColumn, String tableName) { return new StringBuilder(String.format( - "ALTER TABLE ONLY ties_data.\"%s\" ALTER COLUMN \"%s\" SET DEFAULT '%s';%n%n", tableName, newColumn + "ALTER TABLE ONLY teiv_data.\"%s\" ALTER COLUMN \"%s\" SET DEFAULT '%s';%n%n", tableName, newColumn .getName(), newColumn.getDefaultValue())); } @@ -162,7 +162,7 @@ public class DataSchemaHelper { private String generateConstraintStatement(PostgresConstraint postgresConstraint) { String constraintSql = generateConstraintSql(postgresConstraint); - return String.format("SELECT ties_data.create_constraint_if_not_exists(%n\t'%s',%n '%s',%n '%s;'%n);%n%n", + return String.format("SELECT teiv_data.create_constraint_if_not_exists(%n\t'%s',%n '%s',%n '%s;'%n);%n%n", postgresConstraint.getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), constraintSql); } @@ -175,21 +175,21 @@ public class DataSchemaHelper { private String generateConstraintSql(PostgresConstraint postgresConstraint) { if (postgresConstraint instanceof PrimaryKeyConstraint) { - return String.format(ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "PRIMARY KEY (\"%s\")", postgresConstraint + return String.format(ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S + "PRIMARY KEY (\"%s\")", postgresConstraint .getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), postgresConstraint .getColumnToAddConstraintTo()); } else if (postgresConstraint instanceof ForeignKeyConstraint fkConstraint) { return String.format( - ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "FOREIGN KEY (\"%s\") REFERENCES ties_data.\"%s\" (\"%s\")", + ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S + "FOREIGN KEY (\"%s\") REFERENCES teiv_data.\"%s\" (\"%s\")", fkConstraint.getTableToAddConstraintTo(), fkConstraint.getConstraintName(), fkConstraint .getColumnToAddConstraintTo(), fkConstraint.getReferencedTable(), fkConstraint .getReferencedColumn()); } else if (postgresConstraint instanceof UniqueConstraint) { - return String.format(ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "UNIQUE (\"%s\")", postgresConstraint + return String.format(ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S + "UNIQUE (\"%s\")", postgresConstraint .getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), postgresConstraint .getColumnToAddConstraintTo()); } else if (postgresConstraint instanceof NotNullConstraint) { - return String.format(ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "NOT NULL (\"%s\")", postgresConstraint + return String.format(ALTER_TABLE_TEIV_DATA_S_ADD_CONSTRAINT_S + "NOT NULL (\"%s\")", postgresConstraint .getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), postgresConstraint .getColumnToAddConstraintTo()); } else { @@ -255,7 +255,7 @@ public class DataSchemaHelper { * Generate ALTER sql statements for attributes who have no constraints, default value or enums defined. */ private StringBuilder generateAlterTableStatements(Column newColumn, String tableName) { - return new StringBuilder(String.format(ALTER_TABLE_TIES_DATA_S + "ADD COLUMN IF NOT EXISTS \"%s\" %s;%n%n", + return new StringBuilder(String.format(ALTER_TABLE_TEIV_DATA_S + "ADD COLUMN IF NOT EXISTS \"%s\" %s;%n%n", tableName, newColumn.getName(), newColumn.getDataType())); } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java index d1ddac2..bbb1307 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ public class GroupsSchemaGenerator extends SchemaGenerator { FileHelper.copyResourceToFile(skeletonResource, destinationPath.toFile()); this.schema = destinationPath.toFile(); } catch (IOException exception) { - throw PgSchemaGeneratorException.prepareBaselineException("ties.group", exception); + throw PgSchemaGeneratorException.prepareBaselineException("teiv.group", exception); } } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java index b7f0e78..3d82019 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,7 +75,7 @@ public class ModelSchemaGenerator extends SchemaGenerator { } this.schema = newGeneratedModelFile; } catch (IOException exception) { - throw PgSchemaGeneratorException.prepareBaselineException("ties.model", exception); + throw PgSchemaGeneratorException.prepareBaselineException("teiv.model", exception); } } @@ -88,23 +88,23 @@ public class ModelSchemaGenerator extends SchemaGenerator { // Check for NBCs backwardCompatibilityChecker.checkForNBCChangesInModel(relFromBaselineSql, relationships); } - StringBuilder tiesModelSql = new StringBuilder(); + StringBuilder teivModelSql = new StringBuilder(); List hashInfoList = new ArrayList<>(hashInfoDataGenerator.getHashInfoRowsList().stream().toList()); hashInfoList.sort(Comparator.comparing(HashInfoEntity::getName)); - tiesModelSql.append(prepareCopyStatement(hashInfoList)); - tiesModelSql.append(prepareCopyStatement(modules)); - tiesModelSql.append(prepareCopyStatement(entities)); - tiesModelSql.append(prepareCopyStatement(relationships)); - tiesModelSql.append(";\n").append("\nCOMMIT;"); - this.sqlStatements = tiesModelSql.toString(); + teivModelSql.append(prepareCopyStatement(hashInfoList)); + teivModelSql.append(prepareCopyStatement(modules)); + teivModelSql.append(prepareCopyStatement(entities)); + teivModelSql.append(prepareCopyStatement(relationships)); + teivModelSql.append(";\n").append("\nCOMMIT;"); + this.sqlStatements = teivModelSql.toString(); } private StringBuilder prepareCopyStatement(List table) { StringBuilder copyStatement = new StringBuilder(); if (!table.isEmpty()) { - copyStatement.append("COPY ties_model.").append(table.get(0).getTableName()).append(table.get(0) + copyStatement.append("COPY teiv_model.").append(table.get(0).getTableName()).append(table.get(0) .getColumnsForCopyStatement()).append(" FROM stdin;\n"); table.forEach(table1 -> copyStatement.append(table1.getRecordForCopyStatement())); copyStatement.append("\\.\n\n"); diff --git a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql index 398a6e4..d018a66 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql @@ -29,27 +29,27 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -59,21 +59,21 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' ); \ No newline at end of file diff --git a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql index 82f5bc0..ddc29ae 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO :pguser; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "domain" TEXT, @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" TEXT PRIMARY KEY, "name" TEXT NOT NULL, "moduleReferenceName" TEXT NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,8 +70,8 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); diff --git a/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql index dca3ded..13e7705 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql b/pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql index 739a717..41a41af 100644 --- a/pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql +++ b/pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java index 659e25a..f780529 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,7 +107,7 @@ public class TestHelper { } } } catch (IOException exception) { - throw PgSchemaGeneratorException.readBaselineException("ties.data", exception); + throw PgSchemaGeneratorException.readBaselineException("teiv.data", exception); } return lines; } diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java index 5404182..ffbfce1 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -174,7 +174,7 @@ class SchemaParserTest { Files.copy(mockSqlFile.toPath(), testSqlFile.toPath(), StandardCopyOption.REPLACE_EXISTING); // Add to copy - String sampleLine = "ALTER TABLE ONLY ties_data.\"Namespace\" ALTER COLUMN \"name\" SET DEFAULT 'hello-to-the-world';\n\n"; + String sampleLine = "ALTER TABLE ONLY teiv_data.\"Namespace\" ALTER COLUMN \"name\" SET DEFAULT 'hello-to-the-world';\n\n"; // When TestHelper.appendToFile(testSqlFileForProcessorTest, sampleLine); @@ -222,7 +222,7 @@ class SchemaParserTest { Files.copy(mockSqlFile.toPath(), testSqlFile.toPath(), StandardCopyOption.REPLACE_EXISTING); // Add to copy - String sampleLine = "ALTER TABLE ties_data.\"Namespace\" ADD COLUMN IF NOT EXISTS \"namespaceId\" DECIMAL;"; + String sampleLine = "ALTER TABLE teiv_data.\"Namespace\" ADD COLUMN IF NOT EXISTS \"namespaceId\" DECIMAL;"; // When TestHelper.appendToFile(testSqlFileForProcessorTest, sampleLine); diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql index de012f8..6f6febc 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql @@ -29,51 +29,51 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); -CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."Namespace" ( "id" TEXT, "name" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'PK_Namespace_id', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql index ea84368..7771e4f 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql @@ -29,73 +29,73 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); -CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."Namespace" ( "id" TEXT, "name" TEXT ); -CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."REL_serviced-sector_serving-namespace" ( "id" TEXT, "aSide_Sector" TEXT, "bSide_Namespace" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'PK_Namespace_id', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-namespace', 'PK_REL_serviced-sector_serving-namespace_id', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT "PK_REL_serviced-sector_serving-namespace_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT "PK_REL_serviced-sector_serving-namespace_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-namespace', 'FK_REL_serviced-sector_serving-namespace_aSide_Sector', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT FK_REL_serviced-sector_serving-namespace_aSide_Sector FOREIGN KEY ("aSide_Sector") REFERENCES ties_data."Sector" (id) ON DELETE CASCADE;') + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT FK_REL_serviced-sector_serving-namespace_aSide_Sector FOREIGN KEY ("aSide_Sector") REFERENCES teiv_data."Sector" (id) ON DELETE CASCADE;') -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-namespace', 'FK_REL_serviced-sector_serving-namespace_bSide_Namespace', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT FK_REL_serviced-sector_serving-namespace_bSide_Namespace FOREIGN KEY ("bSide_Namespace") REFERENCES ties_data."Namespace" (id) ON DELETE CASCADE;') + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-namespace" ADD CONSTRAINT FK_REL_serviced-sector_serving-namespace_bSide_Namespace FOREIGN KEY ("bSide_Namespace") REFERENCES teiv_data."Namespace" (id) ON DELETE CASCADE;') COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql index 245f160..c69bdea 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql @@ -29,30 +29,30 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, @@ -61,33 +61,33 @@ CREATE TABLE IF NOT EXISTS ties_data."Sector" ( "REL_ID_serviced-sector_serving-namespace" TEXT ); -CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."Namespace" ( "id" TEXT, "name" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'PK_Namespace_id', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'FK_Sector_REL_FK_serviced-sector', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "FK_Sector_REL_FK_serviced-sector" FOREIGN KEY ("REL_FK_serviced-sector") REFERENCES ties_data."Namespace" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "FK_Sector_REL_FK_serviced-sector" FOREIGN KEY ("REL_FK_serviced-sector") REFERENCES teiv_data."Namespace" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql index e46c7d3..95f8397 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql @@ -29,65 +29,65 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); -CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."Namespace" ( "id" TEXT, "name" TEXT, "REL_FK_serving-namespace" TEXT, "REL_ID_serviced-sector_serving-namespace" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'PK_Namespace_id', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'FK_Namespace_REL_FK_serving-namespace', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "FK_Namespace_REL_FK_serving-namespace" FOREIGN KEY ("REL_FK_serving-namespace") REFERENCES ties_data."Sector" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "FK_Namespace_REL_FK_serving-namespace" FOREIGN KEY ("REL_FK_serving-namespace") REFERENCES teiv_data."Sector" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'UNIQUE_Namespace_REL_ID_serviced-sector_serving-namespace', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "UNIQUE_Namespace_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "UNIQUE_Namespace_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql index ce6ffd3..db8e03f 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql @@ -29,30 +29,30 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, @@ -61,40 +61,40 @@ CREATE TABLE IF NOT EXISTS ties_data."Sector" ( "REL_ID_serviced-sector_serving-namespace" TEXT ); -CREATE TABLE IF NOT EXISTS ties_data."Namespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."Namespace" ( "id" TEXT, "name" TEXT, "REL_FK_serving-namespace" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'PK_Namespace_id', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'FK_Sector_REL_FK_serviced-sector', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "FK_Sector_REL_FK_serviced-sector" FOREIGN KEY ("REL_FK_serviced-sector") REFERENCES ties_data."Namespace" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "FK_Sector_REL_FK_serviced-sector" FOREIGN KEY ("REL_FK_serviced-sector") REFERENCES teiv_data."Namespace" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Namespace', 'FK_Namespace_REL_FK_serving-namespace', - 'ALTER TABLE ties_data."Namespace" ADD CONSTRAINT "FK_Namespace_REL_FK_serving-namespace" FOREIGN KEY ("REL_FK_serving-namespace") REFERENCES ties_data."Sector" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."Namespace" ADD CONSTRAINT "FK_Namespace_REL_FK_serving-namespace" FOREIGN KEY ("REL_FK_serving-namespace") REFERENCES teiv_data."Sector" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace" UNIQUE ("REL_ID_serviced-sector_serving-namespace");' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql index b6baa4a..ff12947 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql @@ -29,62 +29,62 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -- Update data schema exec status -INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success'); +INSERT INTO teiv_model.entity_info("schema", "status") VALUES ('teiv_data', 'success'); -CREATE TABLE IF NOT EXISTS ties_data."Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."Sector" ( "id" TEXT, "azimuth" DECIMAL, "sectorId" jsonb, "geo-location" "geography" ); -CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."REL_serviced-sector_serving-sector" ( "id" TEXT, "aSide_Sector" TEXT, "bSide_Sector" TEXT ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'Sector', 'PK_Sector_id', - 'ALTER TABLE ties_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."Sector" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-sector', 'PK_REL_serviced-sector_serving-sector_id', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "PK_REL_serviced-sector_serving-sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "PK_REL_serviced-sector_serving-sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-sector', 'FK_REL_serviced-sector_serving-sector_aSide_Sector', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "FK_REL_serviced-sector_serving-sector_aSide_Sector" FOREIGN KEY ("aSide_Sector") REFERENCES ties_data."Sector" (id) ON DELETE CASCADE;') + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "FK_REL_serviced-sector_serving-sector_aSide_Sector" FOREIGN KEY ("aSide_Sector") REFERENCES teiv_data."Sector" (id) ON DELETE CASCADE;') -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'REL_serviced-sector_serving-sector', 'FK_REL_serviced-sector_serving-sector_bSide_Sector', - 'ALTER TABLE ties_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "FK_REL_serviced-sector_serving-sector_bSide_Sector FOREIGN KEY" ("bSide_Sector") REFERENCES ties_data."Sector" (id) ON DELETE CASCADE;') + 'ALTER TABLE teiv_data."REL_serviced-sector_serving-sector" ADD CONSTRAINT "FK_REL_serviced-sector_serving-sector_bSide_Sector FOREIGN KEY" ("bSide_Sector") REFERENCES teiv_data."Sector" (id) ON DELETE CASCADE;') COMMIT; \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql index c4b89a9..e2a97a0 100644 --- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql @@ -21,26 +21,26 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO :pguser; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( +CREATE TABLE IF NOT EXISTS teiv_model.execution_status ( "schema" VARCHAR(127) PRIMARY KEY, "status" VARCHAR(127) ); -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" VARCHAR(511) PRIMARY KEY, "hashedValue" VARCHAR(511), "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" VARCHAR(511) PRIMARY KEY, "namespace" VARCHAR(511), "domain" VARCHAR(511), @@ -49,15 +49,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" VARCHAR(511) PRIMARY KEY, "name" VARCHAR(511) NOT NULL, "moduleReferenceName" VARCHAR(511) NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" VARCHAR(511) NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -75,22 +75,22 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "storedAt" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); +INSERT INTO teiv_model.execution_status("schema", "status") VALUES ('teiv_model', 'success'); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 100 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran \. diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql index 0def1e6..cdf345f 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql @@ -29,21 +29,21 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; @@ -51,7 +51,7 @@ $$ language 'plpgsql'; --missing consumer data columns, their default values and index --missing index for antennaBeamWidth -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "positionWithinSector" TEXT, "electricalAntennaTilt" INTEGER, @@ -63,32 +63,32 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "geo-location" geography ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); --missing eNodeBPlmnId, classifiers and decorator columns --missing default value for sourceIds column -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ( "id" TEXT, "eNBId" INTEGER, "CD_sourceIds" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ENodeBFunction', 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' ); -CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); --missing index on JSONB columns -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ( "id" TEXT, "geranFqBands" jsonb, "nRFqBands" jsonb, @@ -98,20 +98,20 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "CD_classifiers" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_AntennaCapability', 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', - 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); --missing "ANTENNACAPABILITY_USED_BY_LTESECTORCARRIER" relationship -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( "id" TEXT, "sectorCarrierType" TEXT, "CD_sourceIds" jsonb, @@ -124,46 +124,46 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' ); -CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql index 4559b22..93dddcb 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO :pguser; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "domain" TEXT, @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" TEXT PRIMARY KEY, "name" TEXT NOT NULL, "moduleReferenceName" TEXT NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,12 +70,12 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD CONSTRAINT IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_sourceIds IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX @@ -114,7 +114,7 @@ sectorCarrierType sectorCarrierType COLUMN totalTilt totalTilt COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CgogIGltcG9ydCBpZXRmLWluZXQtdHlwZXMgeyBwcmVmaXggaW5ldDsgfQogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgeyBwcmVmaXggeWFuZzsgfQogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IHlleHQzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZAogICAgbmV0d29yayBzbGljaW5nLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLAogICAgVFRBLCBUVEMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI7CiAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyMyI7CgogIHJldmlzaW9uIDIwMjMtMTEtMDYgeyByZWZlcmVuY2UgQ1ItMDMwNTsgfQogIHJldmlzaW9uIDIwMjMtMDktMTggeyByZWZlcmVuY2UgQ1ItMDI3MSA7IH0KICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CgogIHJldmlzaW9uIDIwMjEtMDktMzAgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIExvbmdpdHVkZSwgTGF0aXR1ZGUsIFRlbnRoT2ZEZWdyZWVzLCBPbk9mZi4iOwogICAgcmVmZXJlbmNlICJDUi0wMTM4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMTEtMDYgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgaW5jb3JyZWN0IFMtTlNTQUkgZGVmaW5pdGlvbnMuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDExOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTAzLTEwIHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGZhdWx0eSB3aGVuIHN0YXRlbWVudHMuIjsKICAgIHJlZmVyZW5jZSAiU1AtMjAwMjI5IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CgogIGdyb3VwaW5nIG5hbWVWYWx1ZVBhaXIgewogICAgbGVhZiBuYW1lIHsgdHlwZSBzdHJpbmc7IH0KICAgIGxlYWYgdmFsdWUgeyB0eXBlIHN0cmluZzsgfQogIH0KCiAgZ3JvdXBpbmcgUHJvY2Vzc01vbml0b3JHcnAgewogICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGF0dHJpYnV0ZXMgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgcHJvY2Vzc2VzCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcwogICAgICB3aGVuIHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgcHJvY2Vzc2VzLgogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LgogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEKICAgICAgY29uY3JldGUgcHJvY2VzcyByZXByZXNlbnRhdGlvbi4KCiAgICAgIElmIGEgbWFuYWdlbWVudCBvcGVyYXRpb24gb24gc29tZSBJT0NzIHRyaWdnZXJzIGFuIGFzc29jaWF0ZWQKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlCiAgICAgICdQcm9jZXNzTW9uaXRvcicpIGluIHRoZXNlIElPQyhzKS4gVGhlIHByb2Nlc3NNb25pdG9yIGF0dHJpYnV0ZSBtYXkgYmUKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IKICAgICAgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBtYXkgYmUgcHJvdmlkZWQgYnkgdGhlICdwcm9ncmVzc1N0YXRlSW5mbycgYW5kCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0bwogICAgICBzdGFydCBleGVjdXRpbmcgdGhlIHByb2Nlc3MgYW5kIHRvIHRyYW5zaXRpb24gaW50byB0aGUgJ1JVTk5JTkcnIHN0YXRlLgogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lCiAgICAgIGFsdGVybmF0aXZlIG11c3QgYmUgc2VsZWN0ZWQgd2hlbiB1c2luZyB0aGlzIGRhdGEgdHlwZS4KCiAgICAgIER1cmluZyB0aGUgJ1JVTk5JTkcnIHN0YXRlIHRoZSAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGUgbWF5IGJlCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8KICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0bwogICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiB0aGUgJ05PVF9SVU5OSU5HJywgJ0NBTkNFTExJTkcnCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzCiAgICAgIHVzZWQuCgogICAgICBVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJvY2VzcywgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBzZXQKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkCiAgICAgIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkCiAgICAgIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIHVzZWQuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgdGhlICdzdGF0dXMnCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZgogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZQogICAgICAncmVzdWx0U3RhdGVJbmZvJyBzcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbgogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbiBhcyB3ZWxsLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBpcyBjYW5jZWxsZWQsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgZmlyc3Qgc2V0IHRvCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLgogICAgICBUaGUgdmFsdWUgb2YgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLiBBZGRpdGlvbmFsIHRleHR1YWwKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvcgogICAgICAnQ0FOQ0VMTEVEJy4gSXQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIG1ha2luZyB0aGUgb3V0Y29tZSwgdGhhdCB0aGUKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55CiAgICAgIG1vcmUgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUsIG9yIHRoZSBwcm9jZXNzIG91dGNvbWUgaXMgbmVlZGVkIHVudGlsIGEKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMKICAgICAgaW5kaWNhdGVkIGJ5IHRoZSAndGltZXInIGF0dHJpYnV0ZS4iOwoKICAgIGxlYWYgaWQgewogICAgICB0eXBlIHN0cmluZzsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJJZCBvZiB0aGUgcHJvY2Vzcy4gSXQgaXMgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZQogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KCiAgICBsZWFmIHN0YXR1cyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gTk9UX1NUQVJURUQgOwogICAgICAgIGVudW0gUlVOTklORyA7CiAgICAgICAgZW51bSBDQU5DRUxMSU5HIDsKICAgICAgICBlbnVtIEZJTklTSEVEIDsKICAgICAgICBlbnVtIEZBSUxFRCA7CiAgICAgICAgZW51bSBQQVJUSUFMTFlfRkFJTEVEIDsKICAgICAgICBlbnVtIENBTkNFTExFRCA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZWZhdWx0ICBSVU5OSU5HOwogICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLgogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkCiAgICAgICAgcHJvY2Vzcy4gIjsKICAgIH0KCiAgICBsZWFmIHByb2dyZXNzUGVyY2VudGFnZSB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlIDAuLjEwMDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJQcm9ncmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGFzIHBlcmNlbnRhZ2UiOwogICAgfQoKICAgIGxlYWYtbGlzdCBwcm9ncmVzc1N0YXRlSW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZwogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcwogICAgICAgICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCBhbmQgJ0NBTkNFTExFRCcuCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcwogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MKICAgICAgICBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgYW55LiBGb3IgdGhpcyBwdXJwb3NlLCBkZWRpY2F0ZWQKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgc3RhcnRUaW1lIHsKICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlN0YXJ0IHRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgaS5lLiB0aGUgdGltZSB3aGVuIHRoZQogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLgoKICAgICAgICBJZiB0aGUgdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBpdCBpcyB0aGUgZXN0aW1hdGVkIHRpbWUKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUKICAgICAgICBNblNfUHJvZHVjZXIuCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCgogICAgICAgIE9uY2UgdGhlIHRpbWVyIGlzIHNldCwgdGhlIGNvbnN1bWVyIGNhbiBub3QgY2hhbmdlIGl0IGFueW1vcmUuCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgICAgeWV4dDNncHA6bm90Tm90aWZ5YWJsZTsKICAgIH0KICB9CgogIHR5cGVkZWYgVGVudGhPZkRlZ3JlZXMgewogICAgdHlwZSB1aW50MTYgewogICAgICByYW5nZSAwLi4zNjAwOwogICAgfQogICAgdW5pdHMgIjAuMSBkZWdyZWVzIjsKICAgIGRlc2NyaXB0aW9uICJBIHNpbmdsZSBpbnRlZ3JhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIEFsdGl0dWRlICB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgfQogICAgdW5pdHMgIm1ldGVycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4iOwogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBMYXRpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBsb25naXR1ZGUgewogICAgICB0eXBlIExvbmdpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBhbHRpdHVkZSB7CiAgICAgIHR5cGUgQWx0aXR1ZGU7CiAgICB9CgogIH0KCiAgdHlwZWRlZiBPbk9mZiB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBPTjsKICAgICAgZW51bSBPRkY7CiAgICB9CiAgfQoKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcwogIC8vICBiZWluZyBtb3ZlZCB0byBfM2dwcC01Z2MtbnJtLW5mcHJvZmlsZQogIGdyb3VwaW5nIE1hbmFnZWRORlByb2ZpbGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORiI7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuNTAxIjsKCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQoKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLgogICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIE5GIEluc3RhbmNlIElEIHNoYWxsIGJlIGEKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgICB5ZXh0M2dwcDppblZhcmlhbnQ7CiAgICB9CgogICAgbGVhZi1saXN0IG5mVHlwZSB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIHR5cGUgTmZUeXBlOwogICAgICBkZXNjcmlwdGlvbiAiVHlwZSBvZiB0aGUgTmV0d29yayBGdW5jdGlvbiIgOwogICAgfQoKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQoKICAgIGxlYWYgYXV0aHpJbmZvIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBORiBTcGVjaWZpYyBTZXJ2aWNlIGF1dGhvcml6YXRpb24KICAgICAgICBpbmZvcm1hdGlvbi4gSXQgc2hhbGwgaW5jbHVkZSB0aGUgTkYgdHlwZSAocykgYW5kIE5GIHJlYWxtcy9vcmlnaW5zCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KCiAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBORiBpbnN0YW5jZQogICAgICAgIChlLmcuIGdlb2dyYXBoaWMgbG9jYXRpb24sIGRhdGEgY2VudGVyKSBkZWZpbmVkIGJ5IG9wZXJhdG9yIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uCiAgICAgICAgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIGV4cHJlc3NlZCBhcyBhIHdlaWdodCByZWxhdGl2ZSB0byBvdGhlcgogICAgICAgIE5GIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyBpZiBjYXBhY2l0eSBpcyBhbHNvIHByZXNlbnQgaW4gdGhlCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMKICAgICAgICBzZXJ2ZWQgYnkgdGhlIE5GIGluc3RhbmNlLgogICAgICAgIE1heSBiZSBjb25maWcgZmFsc2Ugb3IgdHJ1ZSBkZXBlbmRpbmcgb24gdGhlIE1hbmFnZWRGdW5jdGlvbi4KICAgICAgICBDb25maWc9dHJ1ZSBmb3IgVWRyaW5mby4gQ29uZmlnPWZhbHNlIGZvciBVZG1JbmZvIGFuZCBBdXNmSW5mby4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc3VwcG9ydGVkRGF0YVNldElkcyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU1VCU0NSSVBUSU9OOwogICAgICAgIGVudW0gUE9MSUNZOwogICAgICAgIGVudW0gRVhQT1NVUkU7CiAgICAgICAgZW51bSBBUFBMSUNBVElPTjsKICAgICAgfQogICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBzdXBwb3J0ZWQgZGF0YSBzZXRzIGluIHRoZSBVRFIgaW5zdGFuY2UuCiAgICAgICAgTWF5IGJlIHByZXNlbnQgaWYgLi4vbmZUeXBlID0gVURSIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVQRiI7CiAgICAgIHJlZmVyZW5jZSAiVFMgMjkuNTEwIiA7CiAgICB9CgogICAgbGVhZiBwcmlvcml0eSB7CiAgICAgIHR5cGUgdWludDE2OwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBQcmlvcml0eSAocmVsYXRpdmUgdG8gb3RoZXIgTkZzCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsKICAgICAgICBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBoaWdoZXIgcHJpb3JpdHkuIElmIHByaW9yaXR5IGlzIGFsc28gcHJlc2VudAogICAgICAgIGluIHRoZSBuZlNlcnZpY2VMaXN0IHBhcmFtZXRlcnMsIHRob3NlIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KCiAgdHlwZWRlZiB1c2FnZVN0YXRlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIElETEU7CiAgICAgIGVudW0gQUNUSVZFOwogICAgICBlbnVtIEJVU1k7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiSXQgZGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZXNvdXJjZSBpcyBhY3RpdmVseSBpbgogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZQogICAgICBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCB1c2VycyBhdCB0aGF0IGluc3RhbnQuIFRoZSB2YWx1ZSBpcyBSRUFELU9OTFkuIjsKICAgIHJlZmVyZW5jZSAiSVRVIFQgUmVjb21tZW5kYXRpb24gWC43MzEiOwogIH0KCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CgogIHR5cGVkZWYgTWNjIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIGNvdW50cnkgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBkZWNpbWFsIGRpZ2l0cywKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMKICAgICAgcmVnaW9uICh0aGUgZGlnaXRzIDEgYW5kIDggYXJlIG5vdCB1c2VkKToiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMDItNzldWzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgdHlwZWRlZiBNbmMgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgbmV0d29yayBjb2RlIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQogICAgICBkZWNpbWFsIGRpZ2l0cyAoZm9yIGV4YW1wbGU6IE1OQyBvZiAwMDEgaXMgbm90IHRoZSBzYW1lIGFzIE1OQyBvZiAwMSkiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05XVswLTldWzAtOV18WzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgZ3JvdXBpbmcgUExNTklkIHsKICAgIGxlYWYgbWNjIHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgTWNjOwogICAgfQogICAgbGVhZiBtbmMgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNbmM7CiAgICB9CiAgICByZWZlcmVuY2UgIlRTIDM4LjQxMyBjbGF1c2UgOS4zLjMuNSI7CiAgfQoKICB0eXBlZGVmIE5jaSB7CiAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4gVGhlIE5DSSBzaGFsbCBiZSBvZiBmaXhlZCBsZW5ndGggb2YgMzYgYml0cwogICAgICBhbmQgc2hhbGwgYmUgY29kZWQgdXNpbmcgZnVsbCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQoKICB0eXBlZGVmIE9wZXJhdGlvbmFsU3RhdGUgewogICAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyNSBhbmQgSVRVLVQgWC43MzEiOwogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyB0b3RhbGx5IGlub3BlcmFibGUuIjsKICAgICAgfQoKICAgICAgZW51bSBFTkFCTEVEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICB9CiAgfQoKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KCiAgICAgIGVudW0gU0hVVFRJTkdET1dOIHsKICAgICAgICB2YWx1ZSAyOwogICAgICAgIGRlc2NyaXB0aW9uICJVc2Ugb2YgdGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcGVybWl0dGVkIHRvCiAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZXMgb2YgdXNlIG9ubHkuIFdoaWxlIHRoZSBzeXN0ZW0gcmVtYWlucyBpbgogICAgICAgICAgdGhlIHNodXR0aW5nIGRvd24gc3RhdGUgdGhlIG1hbmFnZXIgb3IgdGhlIG1hbmFnZWQgZWxlbWVudAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZQogICAgICAgICAgbG9ja2VkIHN0YXRlLiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOwogICAgICAgICAgZW51bSBPRkZfTElORTsKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7CiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7CiAgICAgICAgICBlbnVtIERFR1JBREVEOwogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOwogICAgICAgICAgZW51bSBMT0dfRlVMTDsKICAgICAgIH0KICB9CgogIHR5cGVkZWYgQ2VsbFN0YXRlIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBJRExFOwogICAgICAgIGVudW0gSU5BQ1RJVkU7CiAgICAgICAgZW51bSBBQ1RJVkU7CiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKQogICAgICBhcyBzcGVjaWZpZWQgaW4gY2xhdXNlIDI4LjYgb2YgVFMgMjMuMDAzLCBjbGF1c2UgOC4yIG9mIFRTIDM4LjMwMAogICAgICBhbmQgY2xhdXNlIDkuMy4zLjExIG9mIFRTIDM4LjQxMy4gSXQgaXMgY29tcG9zZWQgb2YgdGhlIFBMTU4KICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQKICAgICAgdGhlIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4gIjsKICAgIGxpc3QgcGxtbklkIHsKICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSWRlbnRpdHkuIjsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIG1heC1lbGVtZW50cyAxOwogICAgICBrZXkgIm1jYyBtbmMiOwogICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICB9CgogICAgbGVhZiB0YWMgeyB0eXBlIFRhYzsgfQogIH0KCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsKICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgICAgcmFuZ2UgLTkwLi45MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMYXRpdHVkZSBiYXNlZCBvbiBXb3JsZCBHZW9kZXRpYyBTeXN0ZW0gKDE5ODQgdmVyc2lvbikKICAgICAgICBnbG9iYWwgcmVmZXJlbmNlIGZyYW1lIChXR1MgODQpLiBQb3NpdGl2ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgICByYW5nZSAtMTgwLi4xODAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIGJhc2VkIG9uIFdvcmxkIEdlb2RldGljIFN5c3RlbSAoMTk4NCB2ZXJzaW9uKQogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvCiAgICAgICAgZGVncmVlcyBlYXN0IG9mIDAgZGVncmVlcyBsb25naXR1ZGUuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIEdlb0FyZWFHcnAgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YSB0eXBlIGRlZmluZXMgYSBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgVGhlIGdlby1hcmVhIGlzIGRlZmluZWQgdXNpbmcgYSBjb252ZXggcG9seWdvbiBpbiB0aGUgYXR0cmlidXRlCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwoKICAgIGxpc3QgY29udmV4R2VvUG9seWdvbiB7CiAgICAgIGRlc2NyaXB0aW9uICJTcGVjaWZpZXMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHdpdGggYSBjb252ZXggcG9seWdvbi4KICAgICAgICBUaGUgY29udmV4IHBvbHlnb24gaXMgc3BlY2lmaWVkIGJ5IGl0cyBjb3JuZXJzLiI7CiAgICAgICAga2V5ICJsYXRpdHVkZSBsb25naXR1ZGUiOwogICAgICBtaW4tZWxlbWVudHMgMzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwoKICAgICAgdXNlcyBHZW9Db29yZGluYXRlR3JwOwogICAgfQogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSB1aW50OCA7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlNldElkIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgewogICAgbGVhZiBhbWZSZWdpb25JZCB7CiAgICAgIHR5cGUgQW1mUmVnaW9uSWQ7CiAgICB9CiAgICBsZWFmIGFtZlNldElkIHsKICAgICAgdHlwZSBBbWZTZXRJZDsKICAgIH0KICAgIGxlYWYgYW1mUG9pbnRlciB7CiAgICAgIHR5cGUgQW1mUG9pbnRlcjsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLgogICAgICBUaGUgQU1GIFJlZ2lvbiBJRCBpZGVudGlmaWVzIHRoZSByZWdpb24sCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7CiAgfQoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0KICB9CgogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICB0eXBlZGVmIExvYWQgewogICAgZGVzY3JpcHRpb24gIkxhdGVzdCBrbm93biBsb2FkIGluZm9ybWF0aW9uIG9mIHRoZSBORiwgcGVyY2VudGFnZSAiOwogICAgdHlwZSB1aW50OCB7CiAgICAgIHJhbmdlIDAuLjEwMDsKICAgIH0KICB9CgogIHR5cGVkZWYgTjFNZXNzYWdlQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gNUdNTTsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBMUFA7CiAgICAgIGVudW0gU01TOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMkluZm9ybWF0aW9uQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTlJQUEE7CiAgICAgIGVudW0gUFdTOwogICAgICBlbnVtIFBXU19CQ0FMOwogICAgICBlbnVtIFBXU19SRjsKICAgIH0KICB9CgogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewoKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KCiAgICBsZWFmIGNhbGxiYWNrVXJpIHsKICAgICAgdHlwZSBpbmV0OnVyaTsKICAgIH0KCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfQogIH0KCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgfQoKICBncm91cGluZyBJcHY2UHJlZml4UmFuZ2UgewogIGxlYWYgc3RhcnQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICB9CgogIHR5cGVkZWYgTnNpSWQgewogICAgdHlwZSBzdHJpbmc7CiAgfQoKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CgogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CgogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CgogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9CiAgfQoKICAvKiBEaXN0aW5ndWlzaGVkTmFtZSBwYXR0ZXJuIGlzIGJ1aWx0IHVwIGJhc2VkIG9uIHRoZQogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KCiAgICBsZWFmIEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vICBTYW1lIHBhdHRlcm4gYXMgTG9jYWxETgogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPygsW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQgICBNZS5teWtleT0xIGFsbG93ZWQKICAgICAgLy8gIChmdWxsTG9jYWxSRE4pKCwoZnVsbExvY2FsUkROKSkqCiAgICAgIHBhdHRlcm4gJygoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSgsKChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qfChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qXC5bYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qKSk9KChbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykpKSonOwogICAgfSB9CgogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0gfQoKICAgIGxlYWYgZnVsbExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgZnVsbExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICAvLyBwYXR0ZXJuIExvY2FsRE5BdHRyaWJ1dGVUeXBlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsKICAgIH0gfQoKICAgICAgLy8gbGltaXRhdGlvbjogTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlbm90IHN1cHBvcnRlZCBNZS5teWtleT0xCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUgeyB0eXBlIHN0cmluZyB7CiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOwogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWVzT2ZDbGFzc0FuZE5hbWluZ0F0dHJpYnV0ZSAgeyB0eXBlIHN0cmluZyB7ICAvLyBDbGFzc05hbWUgLCBDbGFzc05hbWluZ0F0dHJpYnV0ZVNlcGFyYXRvciAsIE5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgLy8gcGF0dGVybjogQ2xhc3NOYW1lXC5OYW1pbmdBdHRyaWJ1dGVOYW1lCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSonIDsKICAgIH0gfQoKICAgIGxlYWYgcmVzdHJpY3RpdmVDbGFzc05hbWUgeyB0eXBlIHN0cmluZyB7ICAgICAvLwogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7CiAgICB9IH0KCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwnCiAgICAgICsgJyhcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKicKICAgICAgKyAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JwogICAgICArICcoLFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKScKICAgICAgKyAnKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSAzR1BQIHN0YW5kYXJkIGZvciBEaXN0aW5ndWlzaGVkTmFtZS4KCiAgICAgIExpbWl0YXRpb25zOgogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZAogICAgICAgIChlZy4gTWFuYWdlZEVsZW1lbnQubXlrZXk9MzQ1NDM2KSI7CiAgICByZWZlcmVuY2UgICIzR1BQIFRTIDMyLjMwMCI7CiAgfQoKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsKICAgICAgcmFuZ2UgIi0yNCB8IC0yMiB8IC0yMCB8IC0xOCB8IC0xNiB8IC0xNCB8IC0xMiB8IC0xMCB8IC04IHwgLTYgfCAiICsKICAgICAgICAiIC01IHwgLTQgfCAtMyB8IC0yIHwgLTEgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgOCB8IDEwIHwgIiArCiAgICAgICAgIiAxMiB8IDE0IHwgMTYgfCAxOCB8IDIwIHwgMjIgfCAyNCI7CiAgICB9CiAgICB1bml0cyBkQjsKICB9CgogIGdyb3VwaW5nIFJlcG9ydGluZ0N0cmwgewogICAgY2hvaWNlIHJlcG9ydGluZ0N0cmwgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIgogICAgICAgIFRoaXMgY2hvaWNlIGRlZmluZXMgdGhlIG1ldGhvZCBmb3IgcmVwb3J0aW5nIGNvbGxlY3RlZCBwZXJmb3JtYW5jZQogICAgICAgIG1ldHJpY3MgdG8gTW5TIGNvbnN1bWVycyBhcyB3ZWxsIGFzIHRoZSBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmluZyB0aGUKICAgICAgICByZXBvcnRpbmcgZnVuY3Rpb24uIEl0IGlzIGEgY2hvaWNlIGJldHdlZW4gdGhlIGNvbnRyb2wgcGFyYW1ldGVyCiAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnRpbmcgbWV0aG9kcywgd2hvc2UgcHJlc2VuY2Ugc2VsZWN0cyB0aGUKICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGFzIGZvbGxvd3M6CgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TCiAgICAgICAgcHJvZHVjZXIgc2hhbGwgc3RvcmUgZmlsZXMgb24gdGhlIE1uUyBwcm9kdWNlciBhdCBhIGxvY2F0aW9uIHNlbGVjdGVkCiAgICAgICAgYnkgdGhlIE1uUyBwcm9kdWNlciBhbmQsIG9uIGNvbmRpdGlvbiB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YnNjcmlwdGlvbgogICAgICAgIGlzIGluIHBsYWNlLCBpbmZvcm0gdGhlIE1uUyBjb25zdW1lciBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIG5ldwogICAgICAgIGZpbGVzIGFuZCB0aGUgZmlsZSBsb2NhdGlvbiB1c2luZyB0aGUgbm90aWZ5RmlsZVJlYWR5IG5vdGlmaWNhdGlvbi4KICAgICAgICBJbiBjYXNlIHRoZSBwcmVwYXJhdGlvbiBvZiBhIGZpbGUgZmFpbHMsICdub3RpZnlGaWxlUHJlcGFyYXRpb25FcnJvcicKICAgICAgICBzaGFsbCBiZSBzZW50IGluc3RlYWQuCgogICAgICAgIC0gV2hlbiB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGFuZCAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycKICAgICAgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LCB0aGVuIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgYmVoYXZlIGxpa2UKICAgICAgICBkZXNjcmliZWQgZm9yIHRoZSBjYXNlIHRoYXQgb25seSB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGlzIHByZXNlbnQuCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgY3JlYXRlIG9uIGJlaGFsZiBvZiB0aGUgTW5TCiAgICAgICAgY29uc3VtZXIgYSBzdWJzY3JpcHRpb24sIHVzaW5nICdOdGZTdWJzY3JpcHRpb25Db250cm9sJywgZm9yIHRoZQogICAgICAgIG5vdGlmaWNhdGlvbiB0eXBlcyAnbm90aWZ5TU9JQ3JlYXRpb24nIGFuZCAnbm90aWZ5TU9JRGVsZXRpb24nIHJlbGF0ZWQKICAgICAgICB0byB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgbGF0ZXIuIEluIGNhc2UgYW4gZXhpc3RpbmcKICAgICAgICBzdWJzY3JpcHRpb24gZG9lcyBhbHJlYWR5IGluY2x1ZGUgdGhlICdGaWxlJyBpbnN0YW5jZXMgdG8gYmUgcHJvZHVjZWQsCiAgICAgICAgbm8gbmV3IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBjcmVhdGVkLiBUaGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgYXR0cmlidXRlIGluIHRoZSBjcmVhdGVkCiAgICAgICAgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIHNoYWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgJ25vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MnIGluIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJy4gVGhpcwogICAgICAgIGZlYXR1cmUgaXMgY2FsbGVkIGltcGxpY2l0IG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24sIGFzIG9wcG9zZWQgdG8gdGhlCiAgICAgICAgY2FzZSB3aGVyZSB0aGUgTW5TIGNvbnN1bWVyIGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiAoZXhwbGljaXQKICAgICAgICBub3RpZmljYXRpb24gc3Vic2NyaXB0aW9uKS4gV2hlbiB0aGUgcmVsYXRlZCAnUGVyZk1ldHJpY0pvYicgaXMKICAgICAgICBkZWxldGVkLCB0aGUgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIGNyZWF0ZWQgZHVlIHRvIHRoZQogICAgICAgIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBkZWxldGVkIGFzIHdlbGwuCgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGFuZCBmaWxlTG9jYXRpb24gYXR0cmlidXRlcyBhcmUKICAgICAgICBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyIHNoYWxsIHN0b3JlIHRoZSBmaWxlcyBvbiBhIE1uUyBjb25zdW1lciwgdGhhdAogICAgICAgIGNhbiBiZSBhbnkgZW50aXR5IHN1Y2ggYXMgYSBmaWxlIHNlcnZlciwgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQogICAgICAgIGZpbGVMb2NhdGlvbi4gTm8gbm90aWZpY2F0aW9uIGlzIGVtaXR0ZWQgYnkgdGhlIE1uUyBwcm9kdWNlci4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIHN0cmVhbVRhcmdldCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIE1uUyBwcm9kdWNlcgogICAgICAgIHNoYWxsIHN0cmVhbSB0aGUgZGF0YSB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHN0cmVhbVRhcmdldC4KCiAgICAgICAgRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2RzIHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZQogICAgICAgIHNwZWNpZmllcyB0aGUgdGltZSB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlCiAgICAgICAgc3RvcmVkIGludG8gdGhlIHNhbWUgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzCiAgICAgICAgb3BlbmVkLiI7CgogICAgICBjYXNlIGZpbGUtYmFzZWQtcmVwb3J0aW5nIHsKICAgICAgICBsZWFmIGZpbGVSZXBvcnRpbmdQZXJpb2QgewogICAgICAgICAgdHlwZSB1aW50MzIgewogICAgICAgICAgICByYW5nZSAxLi5tYXg7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyBtaW51dGVzOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgdGhpcyBpcyB0aGUgdGltZQogICAgICAgICAgICB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCBpbnRvIHRoZSBzYW1lCiAgICAgICAgICAgIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBvcGVuZWQuCiAgICAgICAgICAgIFRoZSB0aW1lLXBlcmlvZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGdyYW51bGFyaXR5UGVyaW9kLgoKICAgICAgICAgICAgQXBwbGljYWJsZSB3aGVuIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICAgIGNob2ljZSByZXBvcnRpbmctdGFyZ2V0IHsKICAgICAgICAgIGNhc2UgZmlsZS10YXJnZXQgewogICAgICAgICAgICBsZWFmIGZpbGVMb2NhdGlvbiB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFwcGxpY2FibGUgYW5kIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBmaWxlLWJhc2VkCiAgICAgICAgICAgICAgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZXMgYXJlIHN0b3JlZCBvbiB0aGUgTW5TCiAgICAgICAgICAgICAgY29uc3VtZXIuIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY2FzZSBub3RpZmljYXRpb24tdGFyZ2V0IHsKICAgICAgICAgICAgbGVhZiBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNdXN0IGJlIHByZXNlbnQgd2hlbiB0aGUgbm90aWZpY2F0aW9uLWJhc2VkIHJlcG9ydGluZwogICAgICAgICAgICAgIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgdGhlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMKICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgTW5TIGNvbnN1bWVyIHRvIHN1YnNjcmliZSB0by4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gIldoZW4gbmV0aWhlciBmaWxlTG9jYXRpb24gb3Igbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcwogICAgICAgICAgYXJlIHByZXNlbnQsIHRoZSBmaWxlcyBhcmUgc3RvcmVkIGFuZCBhdmFpbGFibGUgdG8gdGhlIE1uUyBjb25zdW1lcgogICAgICAgICAgaWYgdGhlIE1uUyBzdWJzY3JpYmVzIHRvIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLiI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXNlIHN0cmVhbS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgc3RyZWFtVGFyZ2V0IHsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSB3aGVuIHN0cmVhbS1iYXNlZCByZXBvcnRpbmcgbWV0aG9kIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo= ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjppZXRmOnBhcmFtczp4bWw6bnM6eWFuZzppZXRmLWdlby1sb2NhdGlvbiI7CiAgICBwcmVmaXggZ2VvOwogICAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7CiAgICBwcmVmaXggeWFuZzsKICAgIHJlZmVyZW5jZSAiUkZDIDY5OTE6IENvbW1vbiBZQU5HIERhdGEgVHlwZXMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogICAgY29udGFjdAogICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICAgIDxtYWlsdG86Y2hvcHBzQGNob3Bwcy5vcmc+IjsKCiAgICBkZXNjcmlwdGlvbgogICAgIlRoaXMgbW9kdWxlIGRlZmluZXMgYSBncm91cGluZyBvZiBhIGNvbnRhaW5lciBvYmplY3QgZm9yCiAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAnZWFydGgnKS4KCiAgICBUaGUga2V5IHdvcmRzICdNVVNUJywgJ01VU1QgTk9UJywgJ1JFUVVJUkVEJywgJ1NIQUxMJywgJ1NIQUxMCiAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICdNQVknLCBhbmQgJ09QVElPTkFMJyBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcwogICAgZGVzY3JpYmVkIGluIEJDUCAxNCAoUkZDIDIxMTkpIChSRkMgODE3NCkgd2hlbiwgYW5kIG9ubHkgd2hlbiwKICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjIgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywKICAgIGFuZCBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlCiAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgIElFVEYgVHJ1c3QncyBMZWdhbCBQcm92aXNpb25zIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cHM6Ly90cnVzdGVlLmlldGYub3JnL2xpY2Vuc2UtaW5mbykuCgogICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2luZm8vcmZjOTE3OSk7IHNlZSB0aGUgUkZDIGl0c2VsZgogICAgZm9yIGZ1bGwgbGVnYWwgbm90aWNlcy4iOwoKICAgIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiSW5pdGlhbCBSZXZpc2lvbiI7CiAgICByZWZlcmVuY2UKICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIGZlYXR1cmUgYWx0ZXJuYXRlLXN5c3RlbXMgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiVGhpcyBmZWF0dXJlIG1lYW5zIHRoZSBkZXZpY2Ugc3VwcG9ydHMgc3BlY2lmeWluZyBsb2NhdGlvbnMKICAgICAgICB1c2luZyBhbHRlcm5hdGUgc3lzdGVtcyBmb3IgcmVmZXJlbmNlIGZyYW1lcy4iOwogICAgfQoKICAgIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJHcm91cGluZyB0byBpZGVudGlmeSBhIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBvYmplY3QuIjsKCiAgICBjb250YWluZXIgZ2VvLWxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICJBIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBib2R5IChlLmcuLCAnZWFydGgnKQogICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICAgIGNvbnRhaW5lciByZWZlcmVuY2UtZnJhbWUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgRnJhbWUgb2YgUmVmZXJlbmNlIGZvciB0aGUgbG9jYXRpb24gdmFsdWVzLiI7CgogICAgICAgIGxlYWYgYWx0ZXJuYXRlLXN5c3RlbSB7CiAgICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgc3lzdGVtIGluIHdoaWNoIHRoZSBhc3Ryb25vbWljYWwgYm9keSBhbmQKICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICBwcmVzZW50IGFuZCB0aGUgc3lzdGVtIGlzIHRoZSBuYXR1cmFsIHVuaXZlcnNlOyBob3dldmVyLAogICAgICAgICAgICB3aGVuIHByZXNlbnQsIHRoaXMgdmFsdWUgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgIG1vZGlmaWVzIHRoZSBkZWZpbml0aW9uIChidXQgbm90IHRoZSB0eXBlKSBvZiB0aGUgb3RoZXIKICAgICAgICAgICAgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUuIjsKICAgICAgICB9CiAgICAgICAgbGVhZiBhc3Ryb25vbWljYWwtYm9keSB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQgImVhcnRoIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgIEFzdHJvbm9taWNhbCBVbmlvbiAoSUFVKSBvciBhY2NvcmRpbmcgdG8gdGhlIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW0gaWYgc3BlY2lmaWVkLiAgRXhhbXBsZXMgaW5jbHVkZSAnc3VuJyAob3VyIHN0YXIpLAogICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgIG1vb24gb2YgU2F0dXJuKSwgJ2NlcmVzJyAoYW4gYXN0ZXJvaWQpLCBhbmQKICAgICAgICAgICAgJzY3cC9jaHVyeXVtb3YtZ2VyYXNpbWVua28gKGEgY29tZXQpLiAgVGhlIEFTQ0lJIHZhbHVlCiAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgaW5jbHVkZSBjb250cm9sIGNoYXJhY3RlcnMgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZAogICAgICAgICAgICA5MS4uMTI2KS4gIEFueSBwcmVjZWRpbmcgJ3RoZScgaW4gdGhlIG5hbWUgU0hPVUxEIE5PVCBiZQogICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmlhdS5vcmcvIjsKICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIGdlb2RldGljLXN5c3RlbSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgZ2VvZGV0aWMgc3lzdGVtIG9mIHRoZSBsb2NhdGlvbiBkYXRhLiI7CiAgICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuICdbIC1AXFstXF5fLX5dKic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJBIGdlb2RldGljLWRhdHVtIGRlZmluaW5nIHRoZSBtZWFuaW5nIG9mIGxhdGl0dWRlLAogICAgICAgICAgICAgICAgbG9uZ2l0dWRlLCBhbmQgaGVpZ2h0LiAgVGhlIGRlZmF1bHQgd2hlbiB0aGUKICAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBHbG9iYWwgUG9zaXRpb25pbmcgU3lzdGVtIChHUFMpLiAgVGhlCiAgICAgICAgICAgICAgICBBU0NJSSB2YWx1ZSBTSE9VTEQgaGF2ZSB1cHBlcmNhc2UgY29udmVydGVkIHRvCiAgICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZCA5MS4uMTI2KS4gIFRoZSBJQU5BIHJlZ2lzdHJ5CiAgICAgICAgICAgICAgICBmdXJ0aGVyIHJlc3RyaWN0cyB0aGUgdmFsdWUgYnkgY29udmVydGluZyBhbGwgc3BhY2VzCiAgICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGdlb2RldGljLWRhdHVtIGluZGljYXRlcwogICAgICAgICAgICAgICAgaG93IGFjY3VyYXRlbHkgaXQgbW9kZWxzIHRoZSBhc3Ryb25vbWljYWwgYm9keSBpbgogICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgIGxhdGl0dWRlL2xvbmdpdHVkZSBjb29yZGluYXRlcyBhbmQgZm9yIGhlaWdodAogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuIjsKICAgICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMsCiAgICAgICAgICAgICAgICBTZWN0aW9uIDYuMSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgcGFpciBmb3IKICAgICAgICAgICAgICAgIGVsbGlwc29pZGFsIGNvb3JkaW5hdGVzLCBvciB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cwogICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgaXQgaW5kaWNhdGVzIGhvdyBwcmVjaXNlbHkgdGhlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICBpbiB0aGUgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4KICAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICAgZGVmaW5lZCBieSB0aGUgZ2VvZGV0aWMtZGF0dW0uICBGb3IgZXhhbXBsZSwgdGhlcmUKICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgICBsb2NhdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0LWFjY3VyYWN5IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgICBjb29yZGluYXRlczsgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCB3aXRoIENhcnRlc2lhbgogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuICBXaGVuIGhlaWdodC1hY2N1cmFjeSBpcyBzcGVjaWZpZWQsIGl0CiAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuIGRldGVybWluZWQKICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gZGVmaW5lZCBieSB0aGUKICAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgICB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBtZWFzdXJlbWVudCB3YXMgbWFkZSB0byBkZXRlcm1pbmUgZWFjaAogICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxvY2F0aW9uIGRhdGEgZWl0aGVyIGluIGxhdGl0dWRlL2xvbmdpdHVkZSBvcgogICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBhbmQgcHJlY2lzaW9uIG9mIHRoaXMgbWVhc3VyZW1lbnQgaXMKICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxvbmdpdHVkZSB2YWx1ZSBvbiB0aGUgYXN0cm9ub21pY2FsIGJvZHkuICBUaGUKICAgICAgICAgICAgICAgIGRlZmluaXRpb24gYW5kIHByZWNpc2lvbiBvZiB0aGlzIG1lYXN1cmVtZW50IGlzCiAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4gIFRoZSBwcmVjaXNpb24gYW5kCiAgICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FzZSBjYXJ0ZXNpYW4gewogICAgICAgICAgICBsZWFmIHggewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWCB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHogewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiSWYgdGhlIG9iamVjdCBpcyBpbiBtb3Rpb24sIHRoZSB2ZWxvY2l0eSB2ZWN0b3IgZGVzY3JpYmVzCiAgICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgICBmb3JtdWxhIHRvIGNvbnZlcnQgdGhlc2UgdmFsdWVzIHRvIHNwZWVkIGFuZCBoZWFkaW5nLCBzZWUKICAgICAgICAgICAgUkZDIDkxNzkuIjsKICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKCiAgICAgICAgbGVhZiB2LW5vcnRoIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICB0cnVlIG5vcnRoIGFzIGRlZmluZWQgYnkgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LWVhc3QgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi1lYXN0IGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIHBlcnBlbmRpY3VsYXIKICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgZ2VvZGV0aWMtc3lzdGVtLiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHYtdXAgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi11cCBpcyB0aGUgcmF0ZSBvZiBjaGFuZ2UgKGkuZS4sIHNwZWVkKSBhd2F5IGZyb20gdGhlCiAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZWFmIHRpbWVzdGFtcCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmFsaWQtdW50aWwgewogICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICAgSWYgdW5zcGVjaWZpZWQsIHRoZSBnZW8tbG9jYXRpb24gaGFzIG5vIHNwZWNpZmljCiAgICAgICAgICAgIGV4cGlyYXRpb24gdGltZS4iOwogICAgICAgIH0KICAgIH0KICAgIH0KfQo= o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsKICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyBleHRlbnNpb25zIHRvIHRoZSBZQU5HIGxhbmd1YWdlIHRoYXQgdG9wb2xvZ3kgYW5kCiAgICBpbnZlbnRvcnkgbW9kZWxzIHdpbGwgdXNlIHRvIGRlZmluZSBhbmQgYW5ub3RhdGUgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 @@ -124,7 +124,7 @@ o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNt o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPMENT_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IHJlbGF0aW9ucyBiZXR3ZWVuIEVxdWlwbWVudCBhbmQgUkFOLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9FUVVJUE1FTlRfUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgc2VydmljZWQgYnkgdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "electricalAntennaTilt", "geo-location", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt"] o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran ["eNBId", "eNodeBPlmnId"] @@ -132,7 +132,7 @@ o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBD o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran ["sectorCarrierType"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran \. diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql index e393eb0..2bf4748 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql index 01cc9b3..21f5812 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :'pguser'; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql index 1c84dba..63aa97f 100644 --- a/pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql @@ -19,7 +19,7 @@ -- ============LICENSE_END========================================================= -- -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -29,21 +29,21 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' ); diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql index 939bed1..63585ad 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql @@ -29,27 +29,27 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( +CREATE TABLE IF NOT EXISTS teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( "id" TEXT, "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT, "F03B534AFF0872651FED60C54AB56BEDADAB94B5" BIGINT, @@ -68,19 +68,19 @@ CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" jsonb ); -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( +CREATE TABLE IF NOT EXISTS teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( "id" TEXT, "aSide_EntityTypeA" TEXT, "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, @@ -89,13 +89,13 @@ CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( +CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_AntennaCapability" TEXT, @@ -104,13 +104,13 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ( +CREATE TABLE IF NOT EXISTS teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ( "id" TEXT, "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815" TEXT, "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, @@ -119,13 +119,13 @@ CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, @@ -140,13 +140,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ( "id" TEXT, "eUtranFqBands" jsonb, "geranFqBands" jsonb, @@ -156,13 +156,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ( "id" TEXT, "eNBId" INTEGER, "eNodeBPlmnId" jsonb, @@ -171,15 +171,15 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ( "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -190,13 +190,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( "id" TEXT, "sectorCarrierType" TEXT, "CD_sourceIds" jsonb, @@ -214,25 +214,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ( "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( +CREATE TABLE IF NOT EXISTS teiv_data."test-built-in-module_EntityTypeA" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -249,287 +249,287 @@ CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" jsonb ); -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_AntennaCapability', 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ENodeBFunction', 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'PK_o-ran-smo-teiv-ran_ODUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'PK_test-built-in-module_EntityTypeA_id', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES teiv_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES teiv_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'FK_33B5669A341584011D9A73FB491FF2242A158057', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_LTESectorCarrier', 'UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");' ); -CREATE INDEX IF NOT EXISTS "IDX_1B734406AE75EF103D3E0913637A741DB602A6E9" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("8252D18D44F633831557076D827993C45278024D"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1B734406AE75EF103D3E0913637A741DB602A6E9" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("8252D18D44F633831557076D827993C45278024D"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("68C48305AB6C3A30DD927F5D38562379374A4B31"); +CREATE INDEX IF NOT EXISTS "IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("68C48305AB6C3A30DD927F5D38562379374A4B31"); -CREATE INDEX IF NOT EXISTS "IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_371097F35C137586E6DD7526076CA322C72FAF79" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_371097F35C137586E6DD7526076CA322C72FAF79" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_06503CC4580E197BA869DF60207E5CC1778223F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_06503CC4580E197BA869DF60207E5CC1778223F0" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("REL_CD_92559ED73C761B860682582A040E745ECEC194D5"); +CREATE INDEX IF NOT EXISTS "IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6" ON teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("REL_CD_92559ED73C761B860682582A040E745ECEC194D5"); -CREATE INDEX IF NOT EXISTS "IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1" ON teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1" ON teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645" ON teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E" ON teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3" ON teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C212962DB49654BB1526341141D01AF2A3699B5D" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_C212962DB49654BB1526341141D01AF2A3699B5D" ON teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId"); -CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY"); +CREATE INDEX IF NOT EXISTS "IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY"); -CREATE INDEX IF NOT EXISTS "IDX_497353902DBA614467FFC457A40F39BF04CADC33" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_497353902DBA614467FFC457A40F39BF04CADC33" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E050A7DD176C8D18F3307D3851586C8124CA8268" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E050A7DD176C8D18F3307D3851586C8124CA8268" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54"); +CREATE INDEX IF NOT EXISTS "IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54"); -CREATE INDEX IF NOT EXISTS "IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA"); +CREATE INDEX IF NOT EXISTS "IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589" ON teiv_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA"); -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -539,73 +539,73 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' ); -ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "REL_metadata_C3C2193291E4C8D591E05390DFBCC3843B6B0DA2" jsonb; +ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "REL_metadata_C3C2193291E4C8D591E05390DFBCC3843B6B0DA2" jsonb; -ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_8D7D68E4BA4C9749577CF7F26DB5E9B22BCA796E" jsonb; +ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_8D7D68E4BA4C9749577CF7F26DB5E9B22BCA796E" jsonb; -ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_5A306C45543040943259237E7C3C9710139245CB" jsonb; +ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_5A306C45543040943259237E7C3C9710139245CB" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ANALYZE ties_data."o-ran-smo-teiv-ran_ODUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction"; -ANALYZE ties_data."FB1E124031A12CD85D3335194B39B193723A0490"; +ANALYZE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490"; -ANALYZE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D"; +ANALYZE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D"; -ANALYZE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier"; -ANALYZE ties_data."test-built-in-module_EntityTypeA"; +ANALYZE teiv_data."test-built-in-module_EntityTypeA"; -ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; +ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; -ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ENodeBFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction"; -ANALYZE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE"; +ANALYZE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE"; COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql index 2c99051..b61266f 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO :pguser; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" VARCHAR(511) PRIMARY KEY, "hashedValue" VARCHAR(511) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" VARCHAR(511) PRIMARY KEY, "namespace" VARCHAR(511), "domain" VARCHAR(511), @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" VARCHAR(511) PRIMARY KEY, "name" VARCHAR(511) NOT NULL, "moduleReferenceName" VARCHAR(511) NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" VARCHAR(511) NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,10 +70,10 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "storedAt" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN CD_sourceIds CD_sourceIds COLUMN @@ -230,7 +230,7 @@ REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_LTESECTORCARRI metadata metadata COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CiAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggeWV4dDNncHA7IH0KCiAgb3JnYW5pemF0aW9uICIzR1BQIFNBNSI7CiAgY29udGFjdCAiaHR0cHM6Ly93d3cuM2dwcC5vcmcvRHluYVJlcG9ydC9UU0ctV0ctLVM1LS1vZmZpY2lhbHMuaHRtP0l0ZW1pZD00NjQiOwogIGRlc2NyaXB0aW9uICJUaGUgbW9kZWwgZGVmaW5lcyBhIFlBTkcgbWFwcGluZyBvZiB0aGUgdG9wIGxldmVsIAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZCAKICAgIG5ldHdvcmsgc2xpY2luZy4KICAgIENvcHlyaWdodCAyMDIzLCAzR1BQIE9yZ2FuaXphdGlvbmFsIFBhcnRuZXJzIChBUklCLCBBVElTLCBDQ1NBLCBFVFNJLCBUU0RTSSwgCiAgICBUVEEsIFRUQykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMy0xMS0wNiB7IHJlZmVyZW5jZSBDUi0wMzA1OyB9CiAgcmV2aXNpb24gMjAyMy0wOS0xOCB7IHJlZmVyZW5jZSBDUi0wMjcxIDsgfSAKICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CiAgCiAgcmV2aXNpb24gMjAyMS0wOS0zMCB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTG9uZ2l0dWRlLCBMYXRpdHVkZSwgVGVudGhPZkRlZ3JlZXMsIE9uT2ZmLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMzgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0xMS0wNiB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBpbmNvcnJlY3QgUy1OU1NBSSBkZWZpbml0aW9ucy4iOwogICAgcmVmZXJlbmNlICJDUi0wMTE4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMDMtMTAgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgZmF1bHR5IHdoZW4gc3RhdGVtZW50cy4iOwogICAgcmVmZXJlbmNlICJTUC0yMDAyMjkiOwogIH0KIAogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CiAgCiAgZ3JvdXBpbmcgbmFtZVZhbHVlUGFpciB7CiAgICBsZWFmIG5hbWUgeyB0eXBlIHN0cmluZzsgfQogICAgbGVhZiB2YWx1ZSB7IHR5cGUgc3RyaW5nOyB9CiAgfQogIAogIGdyb3VwaW5nIFByb2Nlc3NNb25pdG9yR3JwIHsKICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBhdHRyaWJ1dGVzIHRvIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mIHByb2Nlc3NlcyAKICAgICAgd2l0aCBzcGVjaWZpYyBwdXJwb3NlIGFuZCBsaW1pdGVkIGxpZmV0aW1lIHJ1bm5pbmcgb24gTW5TIHByb2R1Y2Vycy4gCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcyAKICAgICAgd2hlbiBzcGVjaWZ5aW5nIHRoZSBtYW5hZ2VtZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHByb2Nlc3Nlcy4gCiAgICAgIFRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgY2xhdXNlIGFyZSBkZWZpbmVkIGluIGEgZ2VuZXJpYyB3YXkuIAogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEgCiAgICAgIGNvbmNyZXRlIHByb2Nlc3MgcmVwcmVzZW50YXRpb24uCgogICAgICBJZiBhIG1hbmFnZW1lbnQgb3BlcmF0aW9uIG9uIHNvbWUgSU9DcyB0cmlnZ2VycyBhbiBhc3NvY2lhdGVkIAogICAgICBhc3luY2hyb25vdXMgcHJvY2VzcyAod2hvc2UgcHJvZ3Jlc3Mgc2hhbGwgYmUgbW9uaXRvcmVkKSwgdGhpcyBzaG91bGQgCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlIAogICAgICAnUHJvY2Vzc01vbml0b3InKSBpbiB0aGVzZSBJT0MocykuIFRoZSBwcm9jZXNzTW9uaXRvciBhdHRyaWJ1dGUgbWF5IGJlIAogICAgICBhY2NvbXBhbmllZCBieSB1c2UtY2FzZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGRhdGEgaXRlbXMuCgogICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHByb2Nlc3MgaXMgZGVzY3JpYmVkIGJ5IHRoZSAnc3RhdHVzJyBhbmQgCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IgCiAgICAgIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgbWF5IGJlIHByb3ZpZGVkIGJ5IHRoZSAncHJvZ3Jlc3NTdGF0ZUluZm8nIGFuZCAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlcy4KCiAgICAgIFdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLCB0aGUgJ3N0YXR1cycgaXMgc2V0IHRvICdOT1RfUlVOTklORycgCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0byAKICAgICAgc3RhcnQgZXhlY3V0aW5nIHRoZSBwcm9jZXNzIGFuZCB0byB0cmFuc2l0aW9uIGludG8gdGhlICdSVU5OSU5HJyBzdGF0ZS4gCiAgICAgIFRoaXMgdGltZSBpcyBjYXB0dXJlZCBpbiB0aGUgJ3N0YXJ0VGltZScgYXR0cmlidXRlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lIAogICAgICBhbHRlcm5hdGl2ZSBtdXN0IGJlIHNlbGVjdGVkIHdoZW4gdXNpbmcgdGhpcyBkYXRhIHR5cGUuCgogICAgICBEdXJpbmcgdGhlICdSVU5OSU5HJyBzdGF0ZSB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgYXR0cmlidXRlIG1heSBiZSAKICAgICAgcmVwZWF0ZWRseSB1cGRhdGVkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgc3ViamVjdCB0byAKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byAKICAgICAgcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gaW4gdGhlICdOT1RfUlVOTklORycsICdDQU5DRUxMSU5HJyAKICAgICAgYW5kICdSVU5OSU5HJyBzdGF0ZXMuIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIAogICAgICB1c2VkLgoKICAgICAgVXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHByb2Nlc3MsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgc2V0IAogICAgICB0byAnRklOSVNIRUQnLCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gMTAwJS4gVGhlIHRpbWUgaXMgY2FwdHVyZWQgaW4gCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIAogICAgICBpbiB0aGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlLiBUaGUgdHlwZSBvZiAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgaW4gdGhpcyBkYXRhIHR5cGUgZGVmaW5pdGlvbiBpcyAnU3RyaW5nJy4gCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIAogICAgICB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyB1c2VkLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBmYWlscyB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIHRoZSAnc3RhdHVzJyAKICAgICAgYXR0cmlidXRlIGlzIHNldCB0byAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcsIHRoZSBjdXJyZW50IHZhbHVlIG9mIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZSAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgc3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLiAKICAgICAgU3BlY2lmaWMgZmFpbHVyZSByZWFzb25zIG1heSBiZSBzcGVjaWZpZWQgd2hlcmUgdGhlIGRhdGEgdHlwZSBkZWZpbmVkIGluIAogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IgCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gYXMgd2VsbC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgaXMgY2FuY2VsbGVkLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIGZpcnN0IHNldCB0byAKICAgICAgJ0NBTkNFTExJTkcnIGFuZCB3aGVuIHRoZSBwcm9jZXNzIGlzIHJlYWxseSBjYW5jZWxsZWQgdGhlbiB0byAnQ0FOQ0VMTEVEJy4gCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiAKICAgICAgVGhlIHZhbHVlIG9mICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGlzIGZyb3plbi4gQWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBpbmZvcm1hdGlvbiBtYXkgYmUgcHJvdmlkZWQgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4KCiAgICAgIFRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgb25seSBmb3IgYWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvciAKICAgICAgJ0NBTkNFTExFRCcuIEl0IHNoYWxsIG5vdCBiZSB1c2VkIGZvciBtYWtpbmcgdGhlIG91dGNvbWUsIHRoYXQgdGhlIAogICAgICBwcm9jZXNzIG1heSBwcm9kdWNlIGluIGNhc2Ugb2Ygc3VjY2VzcywgYXZhaWxhYmxlLgoKICAgICAgVGhlIHByb2Nlc3MgbWF5IGhhdmUgdG8gYmUgY29tcGxldGVkIHdpdGhpbiBhIGNlcnRhaW4gdGltZSBhZnRlciBpdHMgCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55IAogICAgICBtb3JlIGFmdGVyIGEgY2VydGFpbiB0aW1lLCBvciB0aGUgcHJvY2VzcyBvdXRjb21lIGlzIG5lZWRlZCB1bnRpbCBhIAogICAgICBjZXJ0YWluIHRpbWUgYW5kIHdoZW4gbm90IHByb3ZpZGVkIGJ5IHRoaXMgdGltZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLiAKICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMgCiAgICAgIGluZGljYXRlZCBieSB0aGUgJ3RpbWVyJyBhdHRyaWJ1dGUuIjsKICAgICAgCiAgICBsZWFmIGlkIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiSWQgb2YgdGhlIHByb2Nlc3MuIEl0IGlzIHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgCiAgICAgICAgbXVsdGl2YWx1ZSBhdHRyaWJ1dGUgb2YgdHlwZSBQcm9jZXNzTW9uaXRvci4iOwogICAgfQogICAgCiAgICBsZWFmIHN0YXR1cyB7IAogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIE5PVF9TVEFSVEVEIDsKICAgICAgICBlbnVtIFJVTk5JTkcgOwogICAgICAgIGVudW0gQ0FOQ0VMTElORyA7CiAgICAgICAgZW51bSBGSU5JU0hFRCA7CiAgICAgICAgZW51bSBGQUlMRUQgOwogICAgICAgIGVudW0gUEFSVElBTExZX0ZBSUxFRCA7CiAgICAgICAgZW51bSBDQU5DRUxMRUQgOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVmYXVsdCAgUlVOTklORzsKICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCAKICAgICAgICB3aGV0aGVyIGl0IGZhaWxzLCBzdWNjZWVkcyBldGMuIAogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIAogICAgICAgIHByb2Nlc3MuICI7CiAgICB9CgogICAgbGVhZiBwcm9ncmVzc1BlcmNlbnRhZ2UgewogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAwLi4xMDA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiUHJvZ3Jlc3Mgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBhcyBwZXJjZW50YWdlIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgcHJvZ3Jlc3NTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnTk9UX1NUQVJURUQnLCAnQ0FOQ0VMTElORycgYW5kICdSVU5OSU5HJy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnRklOSVNIRUQnLCAnRkFJTEVEJywgJ1BBUlRJQUxMWV9GQUlMRUQgYW5kICdDQU5DRUxMRUQnLiAKICAgICAgICBGb3IgZXhhbXBsZSwgaW4gdGhlICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJyBzdGF0ZSB0aGlzIAogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MgCiAgICAgICAgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwsIGlmIGFueS4gRm9yIHRoaXMgcHVycG9zZSwgZGVkaWNhdGVkIAogICAgICAgIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3BlY2lmaWVkIHdoZW4gc3BlY2lmeWluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcgCiAgICAgICAgcGF0dGVybnMgb3IgZW51bXMpIG1heSBiZSBkZWZpbmVkIGFzIGEgc3BlY2lhbGlzYXRpb24uIjsKICAgIH0KCiAgICBsZWFmIHN0YXJ0VGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJTdGFydCB0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsIGkuZS4gdGhlIHRpbWUgd2hlbiB0aGUgCiAgICAgICAgc3RhdHVzIGNoYW5nZWQgZnJvbSAnTk9UX1NUQVJURUQnIHRvICdSVU5OSU5HJy4iOwogICAgfQoKICAgIGxlYWYgZW5kVGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJEYXRlIGFuZCB0aW1lIHdoZW4gc3RhdHVzIGNoYW5nZWQgdG8gJ1NVQ0NFU1MnLCAnQ0FOQ0VMTEVEJywgCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLiAKCiAgICAgICAgSWYgdGhlIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZSwgaXQgaXMgdGhlIGVzdGltYXRlZCB0aW1lIAogICAgICAgIHRoZSBwcm9jZXNzIHdpbGwgZW5kLiI7CiAgICB9CgogICAgbGVhZiB0aW1lciB7CiAgICAgIHR5cGUgdWludDMyOwogICAgICB1bml0cyBtaW51dGVzOwogICAgICBkZXNjcmlwdGlvbiAiVGltZSB1bnRpbCB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsbGVkLgogICAgICAgIElmIHNldCwgdGhlIHN5c3RlbSBkZWNyZWFzZXMgdGhlIHRpbWVyIHdpdGggdGltZS4gV2hlbiBpdCByZWFjaGVzIHplcm8gCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUgCiAgICAgICAgTW5TX1Byb2R1Y2VyLiAKICAgICAgICBJZiBub3Qgc2V0LCB0aGVyZSBpcyBubyB0aW1lIGxpbWl0IGZvciB0aGUgcHJvY2Vzcy4KICAgICAgICAKICAgICAgICBPbmNlIHRoZSB0aW1lciBpcyBzZXQsIHRoZSBjb25zdW1lciBjYW4gbm90IGNoYW5nZSBpdCBhbnltb3JlLiAKICAgICAgICBJZiB0aGUgY29uc3VtZXIgaGFzIG5vdCBzZXQgdGhlIHRpbWVyIHRoZSBNblMgUHJvZHVjZXIgbWF5IHNldCBpdC4iOwogICAgICB5ZXh0M2dwcDpub3ROb3RpZnlhYmxlOwogICAgfQogIH0KICAKICB0eXBlZGVmIFRlbnRoT2ZEZWdyZWVzIHsgCiAgICB0eXBlIHVpbnQxNiB7IAogICAgICByYW5nZSAwLi4zNjAwOyAKICAgIH0KICAgIHVuaXRzICIwLjEgZGVncmVlcyI7CiAgICBkZXNjcmlwdGlvbiAiQSBzaW5nbGUgaW50ZWdyYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBhbmdsZSBpbiBkZWdyZWVzIAogICAgICBiZXR3ZWVuIDAgYW5kIDM2MCB3aXRoIGEgcmVzb2x1dGlvbiBvZiAwLjEgZGVncmVlcy4iOwogIH0KCiAgdHlwZWRlZiBMYXRpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTkwLjAwMDAuLis5MC4wMDAwIjsgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxvbmdpdHVkZSB2YWx1ZXMiOwogIH0KCiAgdHlwZWRlZiBBbHRpdHVkZSAgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgIH0KICAgIHVuaXRzICJtZXRlcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuIjsgIAogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKICAgIAogICAgbGVhZiBsYXRpdHVkZSB7CiAgICAgIHR5cGUgTGF0aXR1ZGU7CiAgICAgIG1hbmRhdG9yeSB0cnVlOyAKICAgIH0KICAgICAgCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgTG9uZ2l0dWRlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsgCiAgICB9CiAgICAKICAgIGxlYWYgYWx0aXR1ZGUgewogICAgICB0eXBlIEFsdGl0dWRlOwogICAgfQogICAgCiAgfQoKICB0eXBlZGVmIE9uT2ZmIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE9OOwogICAgICBlbnVtIE9GRjsKICAgIH0KICB9CiAgCiAgLy8gZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXMgaXQgaXMgCiAgLy8gIGJlaW5nIG1vdmVkIHRvIF8zZ3BwLTVnYy1ucm0tbmZwcm9maWxlCiAgZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB7CiAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GIjsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy41MDEiOwogICAgCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQogICAgCiAgICBsZWFmIG5mSW5zdGFuY2VJRCB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgeWFuZzp1dWlkIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORi4gCiAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgTkYgSW5zdGFuY2UgSUQgc2hhbGwgYmUgYSAKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LCAKICAgICAgICBhcyBkZXNjcmliZWQgaW4gSUVURiBSRkMgNDEyMiAiIDsKICAgICAgeWV4dDNncHA6aW5WYXJpYW50OwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMzguNDEzIGNsYXVzZSA5LjMuMy41IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKSAKICAgICAgYXMgc3BlY2lmaWVkIGluIGNsYXVzZSAyOC42IG9mIFRTIDIzLjAwMywgY2xhdXNlIDguMiBvZiBUUyAzOC4zMDAgCiAgICAgIGFuZCBjbGF1c2UgOS4zLjMuMTEgb2YgVFMgMzguNDEzLiBJdCBpcyBjb21wb3NlZCBvZiB0aGUgUExNTiAKICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQgCiAgICAgIHRoZSBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuICI7CiAgICBsaXN0IHBsbW5JZCB7CiAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElkZW50aXR5LiI7CiAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICBtYXgtZWxlbWVudHMgMTsKICAgICAga2V5ICJtY2MgbW5jIjsKICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgfQogICAgCiAgICBsZWFmIHRhYyB7IHR5cGUgVGFjOyB9CiAgfQogICAgICAgCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsgCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC05MC4uOTAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSAKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KICAgICAgICAKICAgIGxlYWYgbG9uZ2l0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC0xODAuLjE4MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIAogICAgICAgIGRlZ3JlZXMgZWFzdCBvZiAwIGRlZ3JlZXMgbG9uZ2l0dWRlLiI7CiAgICB9CiAgfQogICAKICBncm91cGluZyBHZW9BcmVhR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIGRhdGEgdHlwZSBkZWZpbmVzIGEgZ2VvZ3JhcGhpY2FsIGFyZWEuIAogICAgICBUaGUgZ2VvLWFyZWEgaXMgZGVmaW5lZCB1c2luZyBhIGNvbnZleCBwb2x5Z29uIGluIHRoZSBhdHRyaWJ1dGUgCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwogICAgCiAgICBsaXN0IGNvbnZleEdlb1BvbHlnb24gewogICAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIHRoZSBnZW9ncmFwaGljYWwgYXJlYSB3aXRoIGEgY29udmV4IHBvbHlnb24uIAogICAgICAgIFRoZSBjb252ZXggcG9seWdvbiBpcyBzcGVjaWZpZWQgYnkgaXRzIGNvcm5lcnMuIjsKICAgICAgICBrZXkgImxhdGl0dWRlIGxvbmdpdHVkZSI7CiAgICAgIG1pbi1lbGVtZW50cyAzOwogICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgIAogICAgICB1c2VzIEdlb0Nvb3JkaW5hdGVHcnA7CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQW1mUmVnaW9uSWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IDsKICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mU2V0SWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAnMC4uNjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggNjsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQogICAgICAgIAogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgeyAgICAgICAgCiAgICBsZWFmIGFtZlJlZ2lvbklkIHsKICAgICAgdHlwZSBBbWZSZWdpb25JZDsKICAgIH0KICAgIGxlYWYgYW1mU2V0SWQgewogICAgICB0eXBlIEFtZlNldElkOwogICAgfQogICAgbGVhZiBhbWZQb2ludGVyIHsKICAgICAgdHlwZSBBbWZQb2ludGVyOwogICAgfSAKICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsIAogICAgICBhbiBBTUYgU2V0IElEIGFuZCBhbiBBTUYgUG9pbnRlci4gCiAgICAgIFRoZSBBTUYgUmVnaW9uIElEIGlkZW50aWZpZXMgdGhlIHJlZ2lvbiwgCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQgCiAgICAgIHRoZSBBTUYgUG9pbnRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBBTUYgd2l0aGluIHRoZSBBTUYgU2V0LiAiOyAKICB9ICAgIAoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0gICAgICAgICAgCiAgfQogIAogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTG9hZCB7CiAgICBkZXNjcmlwdGlvbiAiTGF0ZXN0IGtub3duIGxvYWQgaW5mb3JtYXRpb24gb2YgdGhlIE5GLCBwZXJjZW50YWdlICI7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgMC4uMTAwOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMU1lc3NhZ2VDbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSA1R01NOwogICAgICBlbnVtIFNNOwogICAgICBlbnVtIExQUDsKICAgICAgZW51bSBTTVM7IAogICAgfSAgICAgIAogIH0KICAKICB0eXBlZGVmIE4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBOUlBQQTsKICAgICAgZW51bSBQV1M7CiAgICAgIGVudW0gUFdTX0JDQUw7CiAgICAgIGVudW0gUFdTX1JGOwogICAgfSAgICAgICAgICAgICAgCiAgfQogIAogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewogICAgCiAgICBsZWFmIG5vdGlmaWNhdGlvblR5cGUgewogICAgICB0eXBlIE5vdGlmaWNhdGlvblR5cGU7CiAgICB9CiAgICAKICAgIGxlYWYgY2FsbGJhY2tVcmkgewogICAgICB0eXBlIGluZXQ6dXJpOwogICAgfQogICAgCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KICAgIAogICAgbGVhZiBuMkluZm9ybWF0aW9uQ2xhc3MgewogICAgICB0eXBlIE4ySW5mb3JtYXRpb25DbGFzczsKICAgIH0gICAgCiAgfSAgCiAgICAgICAgCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9ICAgIAogIH0KICAgIAogIGdyb3VwaW5nIElwdjZQcmVmaXhSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfSAgICAKICB9CiAgICAgCiAgdHlwZWRlZiBOc2lJZCB7CiAgICB0eXBlIHN0cmluZzsKICB9CiAgICAKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CiAgICAgIAogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOyAgIAogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9ICAKICB9CgogIC8qIERpc3Rpbmd1aXNoZWROYW1lIHBhdHRlcm4gaXMgYnVpbHQgdXAgYmFzZWQgb24gdGhlIAogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KICAKICAgIGxlYWYgRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gIFNhbWUgcGF0dGVybiBhcyBMb2NhbEROCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBMb2NhbFJETiAsIHsgUkROU2VwYXJhdG9yICwgTG9jYWxSRE4gfSAgICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkICAgTWUubXlrZXk9MSBhbGxvd2VkCiAgICAgIC8vICAoZnVsbExvY2FsUkROKSgsKGZ1bGxMb2NhbFJETikpKgogICAgICBwYXR0ZXJuICcoKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSkoLCgoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSkqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxSRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gc2FtZSBhcyBmdWxsTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbFJETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBzYW1lIGFzIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8nOyAgICAgIAogICAgfSB9CiAgCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZSAKICAgICAgLy8gcGF0dGVybiBMb2NhbEROQXR0cmlidXRlVHlwZT1SZWd1bGFyQXR0cmlidXRlVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7ICAgICAgCiAgICB9IH0KICAgIAogICAgICAvLyBsaW1pdGF0aW9uOiBOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGVub3Qgc3VwcG9ydGVkIE1lLm15a2V5PTEKICAgIGxlYWYgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSB7IHR5cGUgc3RyaW5nIHsgCiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7ICAgICAgCiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOyAgICAgIAogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7IAogICAgfSB9CiAgICAKICAgIGxlYWYgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICB7IHR5cGUgc3RyaW5nIHsgIC8vIENsYXNzTmFtZSAsIENsYXNzTmFtaW5nQXR0cmlidXRlU2VwYXJhdG9yICwgTmFtaW5nQXR0cmlidXRlTmFtZQogICAgICAvLyBwYXR0ZXJuOiBDbGFzc05hbWVcLk5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKicgOyAKICAgIH0gfQogIAogICAgbGVhZiByZXN0cmljdGl2ZUNsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIAogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9ICAgIAogICAgCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgCiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18JwogICAgICArICcoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPycKICAgICAgKyAnKCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSknCiAgICAgICsgJygoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqJwogICAgICArICcoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7ICAgICAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgM0dQUCBzdGFuZGFyZCBmb3IgRGlzdGluZ3Vpc2hlZE5hbWUuIAogICAgICAKICAgICAgTGltaXRhdGlvbnM6IAogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZCAKICAgICAgICAoZWcuIE1hbmFnZWRFbGVtZW50Lm15a2V5PTM0NTQzNikiOwogICAgcmVmZXJlbmNlICAiM0dQUCBUUyAzMi4zMDAiOwogIH0gCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KCiAgZ3JvdXBpbmcgUmVwb3J0aW5nQ3RybCB7CiAgICBjaG9pY2UgcmVwb3J0aW5nQ3RybCB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiCiAgICAgICAgVGhpcyBjaG9pY2UgZGVmaW5lcyB0aGUgbWV0aG9kIGZvciByZXBvcnRpbmcgY29sbGVjdGVkIHBlcmZvcm1hbmNlCiAgICAgICAgbWV0cmljcyB0byBNblMgY29uc3VtZXJzIGFzIHdlbGwgYXMgdGhlIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyaW5nIHRoZQogICAgICAgIHJlcG9ydGluZyBmdW5jdGlvbi4gSXQgaXMgYSBjaG9pY2UgYmV0d2VlbiB0aGUgY29udHJvbCBwYXJhbWV0ZXIKICAgICAgICByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydGluZyBtZXRob2RzLCB3aG9zZSBwcmVzZW5jZSBzZWxlY3RzIHRoZQogICAgICAgIHJlcG9ydGluZyBtZXRob2QgYXMgZm9sbG93czoKCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZSBNblMKICAgICAgICBwcm9kdWNlciBzaGFsbCBzdG9yZSBmaWxlcyBvbiB0aGUgTW5TIHByb2R1Y2VyIGF0IGEgbG9jYXRpb24gc2VsZWN0ZWQKICAgICAgICBieSB0aGUgTW5TIHByb2R1Y2VyIGFuZCwgb24gY29uZGl0aW9uIHRoYXQgYW4gYXBwcm9wcmlhdGUgc3Vic2NyaXB0aW9uCiAgICAgICAgaXMgaW4gcGxhY2UsIGluZm9ybSB0aGUgTW5TIGNvbnN1bWVyIGFib3V0IHRoZSBhdmFpbGFiaWxpdHkgb2YgbmV3CiAgICAgICAgZmlsZXMgYW5kIHRoZSBmaWxlIGxvY2F0aW9uIHVzaW5nIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLgogICAgICAgIEluIGNhc2UgdGhlIHByZXBhcmF0aW9uIG9mIGEgZmlsZSBmYWlscywgJ25vdGlmeUZpbGVQcmVwYXJhdGlvbkVycm9yJwogICAgICAgIHNoYWxsIGJlIHNlbnQgaW5zdGVhZC4KCiAgICAgICAgLSBXaGVuIHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgYW5kICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJwogICAgICAgIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQsIHRoZW4gdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBiZWhhdmUgbGlrZQogICAgICAgIGRlc2NyaWJlZCBmb3IgdGhlIGNhc2UgdGhhdCBvbmx5IHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgaXMgcHJlc2VudC4KICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBjcmVhdGUgb24gYmVoYWxmIG9mIHRoZSBNblMKICAgICAgICBjb25zdW1lciBhIHN1YnNjcmlwdGlvbiwgdXNpbmcgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnLCBmb3IgdGhlCiAgICAgICAgbm90aWZpY2F0aW9uIHR5cGVzICdub3RpZnlNT0lDcmVhdGlvbicgYW5kICdub3RpZnlNT0lEZWxldGlvbicgcmVsYXRlZAogICAgICAgIHRvIHRoZSAnRmlsZScgaW5zdGFuY2VzIHRoYXQgd2lsbCBiZSBwcm9kdWNlZCBsYXRlci4gSW4gY2FzZSBhbiBleGlzdGluZwogICAgICAgIHN1YnNjcmlwdGlvbiBkb2VzIGFscmVhZHkgaW5jbHVkZSB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0byBiZSBwcm9kdWNlZCwKICAgICAgICBubyBuZXcgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGNyZWF0ZWQuIFRoZQogICAgICAgICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJyBhdHRyaWJ1dGUgaW4gdGhlIGNyZWF0ZWQKICAgICAgICAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2Ugc2hhbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgaW4gdGhlIHJlbGF0ZWQgJ1BlcmZNZXRyaWNKb2InLiBUaGlzCiAgICAgICAgZmVhdHVyZSBpcyBjYWxsZWQgaW1wbGljaXQgbm90aWZpY2F0aW9uIHN1YnNjcmlwdGlvbiwgYXMgb3Bwb3NlZCB0byB0aGUKICAgICAgICBjYXNlIHdoZXJlIHRoZSBNblMgY29uc3VtZXIgY3JlYXRlcyB0aGUgc3Vic2NyaXB0aW9uIChleHBsaWNpdAogICAgICAgIG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24pLiBXaGVuIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJyBpcwogICAgICAgIGRlbGV0ZWQsIHRoZSAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2UgY3JlYXRlZCBkdWUgdG8gdGhlCiAgICAgICAgcmVxdWVzdCBmb3IgaW1wbGljaXQgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGRlbGV0ZWQgYXMgd2VsbC4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYW5kIGZpbGVMb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgIHByZXNlbnQsIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgc3RvcmUgdGhlIGZpbGVzIG9uIGEgTW5TIGNvbnN1bWVyLCB0aGF0CiAgICAgICAgY2FuIGJlIGFueSBlbnRpdHkgc3VjaCBhcyBhIGZpbGUgc2VydmVyLCBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5CiAgICAgICAgZmlsZUxvY2F0aW9uLiBObyBub3RpZmljYXRpb24gaXMgZW1pdHRlZCBieSB0aGUgTW5TIHByb2R1Y2VyLgoKICAgICAgICAtIFdoZW4gb25seSB0aGUgc3RyZWFtVGFyZ2V0IGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyCiAgICAgICAgc2hhbGwgc3RyZWFtIHRoZSBkYXRhIHRvIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgc3RyZWFtVGFyZ2V0LgoKICAgICAgICBGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZHMgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlCiAgICAgICAgc3BlY2lmaWVzIHRoZSB0aW1lIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUKICAgICAgICBzdG9yZWQgaW50byB0aGUgc2FtZSBmaWxlIGJlZm9yZSB0aGUgZmlsZSBpcyBjbG9zZWQgYW5kIGEgbmV3IGZpbGUgaXMKICAgICAgICBvcGVuZWQuIjsKCiAgICAgIGNhc2UgZmlsZS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgZmlsZVJlcG9ydGluZ1BlcmlvZCB7CiAgICAgICAgICB0eXBlIHVpbnQzMiB7CiAgICAgICAgICAgIHJhbmdlIDEuLm1heDsKICAgICAgICAgIH0KICAgICAgICAgIHVuaXRzIG1pbnV0ZXM7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCB0aGlzIGlzIHRoZSB0aW1lCiAgICAgICAgICAgIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkIGludG8gdGhlIHNhbWUKICAgICAgICAgICAgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzIG9wZW5lZC4KICAgICAgICAgICAgVGhlIHRpbWUtcGVyaW9kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZ3JhbnVsYXJpdHlQZXJpb2QuCgogICAgICAgICAgICBBcHBsaWNhYmxlIHdoZW4gdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQuIjsKICAgICAgICB9CiAgICAgICAgY2hvaWNlIHJlcG9ydGluZy10YXJnZXQgewogICAgICAgICAgY2FzZSBmaWxlLXRhcmdldCB7CiAgICAgICAgICAgIGxlYWYgZmlsZUxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmcgOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSBhbmQgbXVzdCBiZSBwcmVzZW50IHdoZW4gdGhlIGZpbGUtYmFzZWQKICAgICAgICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSBmaWxlcyBhcmUgc3RvcmVkIG9uIHRoZSBNblMKICAgICAgICAgICAgICBjb25zdW1lci4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIG5vdGlmaWNhdGlvbi10YXJnZXQgewogICAgICAgICAgICBsZWFmIG5vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBub3RpZmljYXRpb24tYmFzZWQgcmVwb3J0aW5nCiAgICAgICAgICAgICAgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSB0aGUgZmlsZXMgYXJlIGF2YWlsYWJsZSBhcwogICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBNblMgY29uc3VtZXIgdG8gc3Vic2NyaWJlIHRvLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBkZXNjcmlwdGlvbiAiV2hlbiBuZXRpaGVyIGZpbGVMb2NhdGlvbiBvciBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzCiAgICAgICAgICBhcmUgcHJlc2VudCwgdGhlIGZpbGVzIGFyZSBzdG9yZWQgYW5kIGF2YWlsYWJsZSB0byB0aGUgTW5TIGNvbnN1bWVyCiAgICAgICAgICBpZiB0aGUgTW5TIHN1YnNjcmliZXMgdG8gdGhlIG5vdGlmeUZpbGVSZWFkeSBub3RpZmljYXRpb24uIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNhc2Ugc3RyZWFtLWJhc2VkLXJlcG9ydGluZyB7CiAgICAgICAgbGVhZiBzdHJlYW1UYXJnZXQgewogICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJBcHBsaWNhYmxlIHdoZW4gc3RyZWFtLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMKICAgICAgICAgICAgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9 ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogICAgaW52ZW50b3J5IG1vZGVscyB3aWxsIHVzZSB0byBkZWZpbmUgYW5kIGFubm90YXRlIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyBhIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wb2xvZ3kuCgogICAgICAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YKICAgICAgICAgICAgYW4gQS1zaWRlIGFuZCBhIEItc2lkZS4gVGhlIEEtc2lkZSBpcyBjb25zaWRlcmVkIHRoZSBvcmlnaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXA7IHRoZSBCLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YKICAgICAgICAgICAgaW1wb3J0YW5jZSBhbmQgTVVTVCBOT1QgYmUgY2hhbmdlZCBvbmNlIGRlZmluZWQuCgogICAgICAgICAgICBCb3RoIEEtc2lkZSBhbmQgQi1zaWRlIGFyZSBkZWZpbmVkIG9uIGEgdHlwZSwgYW5kIGFyZSBnaXZlbiBhIHJvbGUuCiAgICAgICAgICAgIEEgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgICAgICByZWxhdGlvbnNoaXAsIGFsbCBkaXN0aW5ndWlzaGVkIGJ5IHJvbGUgbmFtZS4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSAnbW9kdWxlJyBzdGF0ZW1lbnQuCiAgICAgICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlCiAgICAgICAgICAgIGFsbG93ZWQgcGVyIHBhcmVudCBzdGF0ZW1lbnQuCgogICAgICAgICAgICBTdWJzdGF0ZW1lbnRzIHRvIHRoZSAnYmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBkZWZpbmUKICAgICAgICAgICAgdGhlIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzCiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUKICAgICAgICAgICAgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aAogICAgICAgICAgICB0aGUgJ2Etc2lkZScgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZQogICAgICAgICAgICAnYi1zaWRlJyBleHRlbnNpb24uIE90aGVyIGRhdGEgbm9kZXMgZGVmaW5lIHByb3BlcnRpZXMgb2YgdGhlCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgcmVsYXRpb25zaGlwIG5hbWUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuIjsKCiAgICAgICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICAgIH0KCiAgICBleHRlbnNpb24gYVNpZGUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIHRoZSBBLXNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAndW5pLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lCiAgICAgICAgICAgIG9mIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5CiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlCiAgICAgICAgICAgIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSByZXNpZGVzLgogICAgICAgICAgICBJZiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZQogICAgICAgICAgICBwcmVmaXhlZCwgYW5kIGEgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlCiAgICAgICAgICAgIHRoZSBwcmVmaXguIjsKCiAgICAgICAgYXJndW1lbnQgYVNpZGVUeXBlOwogICAgfQoKICAgIGV4dGVuc2lvbiBiU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEItc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBiU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgICAgICBhcmd1bWVudCBkb21haW5OYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBsYWJlbCB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYwogICAgICAgICAgICB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzIOKAmHgueS564oCZIOKAkyBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMKICAgICAgICAgICAgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUgcmV2aXNpb24gc3RhdGVtZW50LgogICAgICAgICAgICBaZXJvIG9yIG9uZSByZXZpc2lvbiBsYWJlbCBzdGF0ZW1lbnRzIHBlciBwYXJlbnQgc3RhdGVtZW50IGFyZQogICAgICAgICAgICBhbGxvd2VkLgoKICAgICAgICAgICAgUmV2aXNpb24gbGFiZWxzIE1VU1QgYmUgdW5pcXVlIGFtb25nc3QgYWxsIHJldmlzaW9ucyBvZiBhIG1vZHVsZSBvcgogICAgICAgICAgICBzdWJtb2R1bGUuIjsKCiAgICAgICAgYXJndW1lbnQgc2VtdmVyc2lvbjsKICAgIH0KfQ== @@ -241,7 +241,7 @@ o-ran-smo-teiv-rel-equipment-ran urn:o-ran:smo-teiv-rel-equipment-ran REL_EQUIPM test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "electricalAntennaTilt", "geo-location", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt"] o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran ["eNBId", "eNodeBPlmnId"] @@ -251,7 +251,7 @@ test-built-in-module_EntityTypeA EntityTypeA test-built-in-module [] test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module ["attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL true RELATION test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql index dca3ded..13e7705 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql index 739a717..41a41af 100644 --- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/pom.xml b/pom.xml index 42c3988..ff59ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 0.8 + 2.3 - com.mycila - license-maven-plugin - ${version.license-maven-plugin} + org.apache.rat + apache-rat-plugin + 0.15 + + + + check + + + - - -
${maven.multiModuleProjectDirectory}/license/copyright-2024.txt
- - ${maven.multiModuleProjectDirectory}/license/copyright-2024.txt - - - **/*.html - **/*.tpl - **/*.tgz - **/VERSION* - license/copyright* - **/*.txt - **/*.config - **/*.yang - settings.xml - **/*.openapi-generator-ignore - **/src/main/resources/v1/.openapi-generator/* - generated/* - generated*/ - dependencies/* - dependencies*/ - teiv/src/main/resources/v1/**/*.html - teiv/src/main/resources/v1/topology-exposure-inventory-openapi.json - pgsql-schema-generator/src/main/resources/scripts/custom-sql-script.sql - pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql - -
-
- - ${maven.multiModuleProjectDirectory}/license/javaHeaderDefinition.xml - ${maven.multiModuleProjectDirectory}/license/xmlHeaderDefinition.xml - - - JAVADOC_STYLE - JAVADOC_STYLE - JAVADOC_STYLE - XML_STYLE - + + **/*.html + **/*.tpl + **/*.tgz + **/VERSION* + license/copyright* + **/*.txt + **/*.config + **/*.yang + settings.xml + **/*.openapi-generator-ignore + **/src/main/resources/v1/.openapi-generator/* + generated/* + generated*/ + dependencies/* + dependencies*/ + src/main/resources/v1/html/**/* + src/main/resources/v1/README.md + src/main/resources/v1/topology-exposure-inventory-openapi.json + src/test/resources/basics/file-based-resolver-test/folder2/file5 + src/test/resources/META-INF/MANIFEST.MF + pgsql-schema-generator/src/main/resources/scripts/custom-sql-script.sql + pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql + .tox/** + docs/_build/** + **/*.helmignore +
@@ -213,20 +209,17 @@ - - ${maven.multiModuleProjectDirectory}/CopyrightSample.txt - **/*.groovy + + target/**/*.groovy + ${maven.multiModuleProjectDirectory}/code_conventions.xml - - ${maven.multiModuleProjectDirectory}/CopyrightSample.txt - diff --git a/teiv/pom.xml b/teiv/pom.xml index 7969e86..68f069d 100644 --- a/teiv/pom.xml +++ b/teiv/pom.xml @@ -72,6 +72,7 @@ org.yaml snakeyaml + ${version.snakeyaml} io.micrometer @@ -157,6 +158,11 @@ antlr4-runtime ${version.antlr} + + org.apache.httpcomponents.client5 + httpclient5 + 5.4.1 + org.oran.smo.yangtools.parser yang-parser-jar @@ -238,7 +244,7 @@ ${version.asciidoctor-maven-plugin} ${project.basedir}/target/generated-contract-docs - ${project.basedir}/doc/contracts-ties + ${project.basedir}/doc/contracts-teiv @@ -581,6 +587,18 @@ + + org.apache.rat + apache-rat-plugin + 0.15 + + + + check + + + + com.diffplug.spotless spotless-maven-plugin diff --git a/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 b/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/teivPath.g4 similarity index 95% rename from teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 rename to teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/teivPath.g4 index 83bb4de..a2e746a 100644 --- a/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 +++ b/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/teivPath.g4 @@ -47,9 +47,9 @@ * https://github.com/antlr/grammars-v4/blob/master/xpath/xpath31/XPath31Parser.g4 */ -grammar tiesPath ; +grammar teivPath ; -tiesPath : ( prefix | incorrectPrefix ) multipleLeafConditions? containsTextFunctionCondition? textFunctionCondition? containsFunctionCondition? withinMetersFunctionCondition? coveredByFunctionCondition? ancestorAxis? invalidPostFix? containerName? fieldLeaf?; +teivPath : ( prefix | incorrectPrefix ) multipleLeafConditions? containsTextFunctionCondition? textFunctionCondition? containsFunctionCondition? withinMetersFunctionCondition? coveredByFunctionCondition? ancestorAxis? invalidPostFix? containerName? fieldLeaf?; ancestorAxis : SLASH KW_ANCESTOR COLONCOLON ancestorPath ; @@ -85,8 +85,8 @@ withinMetersFunctionCondition : OB KW_WITHIN_METERS OP AT leafName COMMA StringL coveredByFunctionCondition : OB KW_COVERED_BY OP AT leafName COMMA StringLiteral CP CB ; -// Onnly EQ supported for now -comparativeOperators : ( EQ /*| GT | LT | GE | LE */ ) ; +// GT,LT,GE and LE only supported for lastModified and firstDiscovered in metadata - if used for other attributes this filter will be ignored +comparativeOperators : ( EQ | GT | LT | GE | LE ) ; invalidPostFix : (AT | CB | COLONCOLON | comparativeOperators ).+ ; diff --git a/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java b/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java index 12b64b9..0411fef 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java +++ b/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,12 +26,13 @@ import io.micrometer.core.instrument.MeterRegistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; +import org.springframework.boot.http.client.HttpComponentsClientHttpRequestFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.oran.smo.teiv.service.JSONBSerializer; @@ -60,17 +61,17 @@ public class CoreApplication { } /** - * Making a RestTemplate, using the RestTemplateBuilder, to use for consumption of RESTful + * Making a RestClient, using RestClient.Builder, to use for consumption of RESTful * interfaces. * - * @param restTemplateBuilder - * RestTemplateBuilder instance + * @param restClientBuilder + * WebClient.Builder instance * - * @return RestTemplate + * @return RestClient */ @Bean - public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) { - return restTemplateBuilder.build(); + public RestClient restClient(final RestClient.Builder restClientBuilder) { + return restClientBuilder.build(); } /** @@ -102,4 +103,16 @@ public class CoreApplication { new JSONBSerializer()); } + /* + * Apache HTTP Components have changed defaults in the HttpClient + * relating to HTTP/1.1 TLS upgrades. This bean restores previous + * behavior, fixing issues with Istio. + * https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes + */ + @Bean + public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() { + return ClientHttpRequestFactoryBuilder.httpComponents().withDefaultRequestConfigCustomizer(builder -> builder + .setProtocolUpgradeEnabled(false)); + } + } diff --git a/teiv/src/main/java/org/oran/smo/teiv/CustomMetrics.java b/teiv/src/main/java/org/oran/smo/teiv/CustomMetrics.java index 315247c..8191319 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/CustomMetrics.java +++ b/teiv/src/main/java/org/oran/smo/teiv/CustomMetrics.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -119,124 +119,124 @@ public class CustomMetrics { this.meterRegistry = meterRegistry; - numReceivedCloudEventCreate = Counter.builder("ties_ingestion_event_topology_create_total").register(meterRegistry); + numReceivedCloudEventCreate = Counter.builder("teiv_ingestion_event_topology_create_total").register(meterRegistry); - numReceivedCloudEventMerge = Counter.builder("ties_ingestion_event_topology_merge_total").register(meterRegistry); + numReceivedCloudEventMerge = Counter.builder("teiv_ingestion_event_topology_merge_total").register(meterRegistry); - numReceivedCloudEventDelete = Counter.builder("ties_ingestion_event_topology_delete_total").register(meterRegistry); + numReceivedCloudEventDelete = Counter.builder("teiv_ingestion_event_topology_delete_total").register(meterRegistry); numReceivedCloudEventSourceEntityDelete = Counter.builder( - "ties_ingestion_event_topology_source_entity_delete_total").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_total").register(meterRegistry); - numReceivedCloudEventNotSupported = Counter.builder("ties_ingestion_event_topology_not_supported_total").register( + numReceivedCloudEventNotSupported = Counter.builder("teiv_ingestion_event_topology_not_supported_total").register( meterRegistry); - numSuccessfullyParsedMergeCloudEvents = Counter.builder("ties_ingestion_event_topology_merge_parse_success_total") + numSuccessfullyParsedMergeCloudEvents = Counter.builder("teiv_ingestion_event_topology_merge_parse_success_total") .register(meterRegistry); - numSuccessfullyParsedCreateCloudEvents = Counter.builder("ties_ingestion_event_topology_create_parse_success_total") + numSuccessfullyParsedCreateCloudEvents = Counter.builder("teiv_ingestion_event_topology_create_parse_success_total") .register(meterRegistry); - numSuccessfullyParsedDeleteCloudEvents = Counter.builder("ties_ingestion_event_topology_delete_parse_success_total") + numSuccessfullyParsedDeleteCloudEvents = Counter.builder("teiv_ingestion_event_topology_delete_parse_success_total") .register(meterRegistry); numSuccessfullyParsedSourceEntityDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_source_entity_delete_parse_success_total").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_parse_success_total").register(meterRegistry); - numUnsuccessfullyParsedMergeCloudEvents = Counter.builder("ties_ingestion_event_topology_merge_parse_fail_total") + numUnsuccessfullyParsedMergeCloudEvents = Counter.builder("teiv_ingestion_event_topology_merge_parse_fail_total") .register(meterRegistry); - numUnsuccessfullyParsedCreateCloudEvents = Counter.builder("ties_ingestion_event_topology_create_parse_fail_total") + numUnsuccessfullyParsedCreateCloudEvents = Counter.builder("teiv_ingestion_event_topology_create_parse_fail_total") .register(meterRegistry); - numUnsuccessfullyParsedDeleteCloudEvents = Counter.builder("ties_ingestion_event_topology_delete_parse_fail_total") + numUnsuccessfullyParsedDeleteCloudEvents = Counter.builder("teiv_ingestion_event_topology_delete_parse_fail_total") .register(meterRegistry); numUnsuccessfullyParsedSourceEntityDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_source_entity_delete_parse_fail_total").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_parse_fail_total").register(meterRegistry); numSuccessfullyPersistedMergeCloudEvents = Counter.builder( - "ties_ingestion_event_topology_merge_persist_success_total").register(meterRegistry); + "teiv_ingestion_event_topology_merge_persist_success_total").register(meterRegistry); numSuccessfullyPersistedCreateCloudEvents = Counter.builder( - "ties_ingestion_event_topology_create_persist_success_total").register(meterRegistry); + "teiv_ingestion_event_topology_create_persist_success_total").register(meterRegistry); numSuccessfullyPersistedDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_delete_persist_success_total").register(meterRegistry); + "teiv_ingestion_event_topology_delete_persist_success_total").register(meterRegistry); numSuccessfullyPersistedSourceEntityDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_source_entity_delete_persist_success_total").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_persist_success_total").register(meterRegistry); numUnsuccessfullyPersistedMergeCloudEvents = Counter.builder( - "ties_ingestion_event_topology_merge_persist_fail_total").register(meterRegistry); + "teiv_ingestion_event_topology_merge_persist_fail_total").register(meterRegistry); numUnsuccessfullyPersistedCreateCloudEvents = Counter.builder( - "ties_ingestion_event_topology_create_persist_fail_total").register(meterRegistry); + "teiv_ingestion_event_topology_create_persist_fail_total").register(meterRegistry); numUnsuccessfullyPersistedDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_delete_persist_fail_total").register(meterRegistry); + "teiv_ingestion_event_topology_delete_persist_fail_total").register(meterRegistry); numUnsuccessfullyPersistedSourceEntityDeleteCloudEvents = Counter.builder( - "ties_ingestion_event_topology_source_entity_delete_persist_fail_total").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_persist_fail_total").register(meterRegistry); numUnsuccessfullyExposedRelationshipsByEntityId = Counter.builder( - "ties_exposure_http_get_relationships_by_entity_id_fail_total").register(meterRegistry); + "teiv_exposure_http_get_relationships_by_entity_id_fail_total").register(meterRegistry); - numUnsuccessfullyExposedEntityById = Counter.builder("ties_exposure_http_get_entity_by_id_fail_total").register( + numUnsuccessfullyExposedEntityById = Counter.builder("teiv_exposure_http_get_entity_by_id_fail_total").register( meterRegistry); - numUnsuccessfullyExposedEntitiesByType = Counter.builder("ties_exposure_http_get_entities_by_type_fail_total") + numUnsuccessfullyExposedEntitiesByType = Counter.builder("teiv_exposure_http_get_entities_by_type_fail_total") .register(meterRegistry); - numUnsuccessfullyExposedEntitiesByDomain = Counter.builder("ties_exposure_http_get_entities_by_domain_fail_total") + numUnsuccessfullyExposedEntitiesByDomain = Counter.builder("teiv_exposure_http_get_entities_by_domain_fail_total") .register(meterRegistry); - numUnsuccessfullyExposedRelationshipById = Counter.builder("ties_exposure_http_get_relationship_by_id_fail_total") + numUnsuccessfullyExposedRelationshipById = Counter.builder("teiv_exposure_http_get_relationship_by_id_fail_total") .register(meterRegistry); numUnsuccessfullyExposedRelationshipsByType = Counter.builder( - "ties_exposure_http_get_relationships_by_type_fail_total").register(meterRegistry); + "teiv_exposure_http_get_relationships_by_type_fail_total").register(meterRegistry); - numUnsuccessfullyExposedRelationshipTypes = Counter.builder("ties_exposure_http_get_relationship_types_fail_total") + numUnsuccessfullyExposedRelationshipTypes = Counter.builder("teiv_exposure_http_get_relationship_types_fail_total") .register(meterRegistry); - numUnsuccessfullyExposedEntityTypes = Counter.builder("ties_exposure_http_get_entity_types_fail_total").register( + numUnsuccessfullyExposedEntityTypes = Counter.builder("teiv_exposure_http_get_entity_types_fail_total").register( meterRegistry); - numUnsuccessfullyExposedDomainTypes = Counter.builder("ties_exposure_http_get_domain_types_fail_total").register( + numUnsuccessfullyExposedDomainTypes = Counter.builder("teiv_exposure_http_get_domain_types_fail_total").register( meterRegistry); - numUnsuccessfullyUpdatedClassifiers = Counter.builder("ties_exposure_http_update_classifiers_fail_total").register( + numUnsuccessfullyUpdatedClassifiers = Counter.builder("teiv_exposure_http_update_classifiers_fail_total").register( meterRegistry); - numUnsuccessfullyUpdatedDecorators = Counter.builder("ties_exposure_http_update_decorators_fail_total").register( + numUnsuccessfullyUpdatedDecorators = Counter.builder("teiv_exposure_http_update_decorators_fail_total").register( meterRegistry); - cloudEventMergePersistTime = Timer.builder("ties_ingestion_event_topology_merge_persist_seconds").register( + cloudEventMergePersistTime = Timer.builder("teiv_ingestion_event_topology_merge_persist_seconds").register( meterRegistry); - cloudEventCreatePersistTime = Timer.builder("ties_ingestion_event_topology_create_persist_seconds").register( + cloudEventCreatePersistTime = Timer.builder("teiv_ingestion_event_topology_create_persist_seconds").register( meterRegistry); - cloudEventDeletePersistTime = Timer.builder("ties_ingestion_event_topology_delete_persist_seconds").register( + cloudEventDeletePersistTime = Timer.builder("teiv_ingestion_event_topology_delete_persist_seconds").register( meterRegistry); cloudEventSourceEntityDeletePersistTime = Timer.builder( - "ties_ingestion_event_topology_source_entity_delete_persist_seconds").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_persist_seconds").register(meterRegistry); - cloudEventMergeParseTime = Timer.builder("ties_ingestion_event_topology_merge_parse_seconds").register( + cloudEventMergeParseTime = Timer.builder("teiv_ingestion_event_topology_merge_parse_seconds").register( meterRegistry); - cloudEventCreateParseTime = Timer.builder("ties_ingestion_event_topology_create_parse_seconds").register( + cloudEventCreateParseTime = Timer.builder("teiv_ingestion_event_topology_create_parse_seconds").register( meterRegistry); - cloudEventDeleteParseTime = Timer.builder("ties_ingestion_event_topology_delete_parse_seconds").register( + cloudEventDeleteParseTime = Timer.builder("teiv_ingestion_event_topology_delete_parse_seconds").register( meterRegistry); cloudEventSourceEntityDeleteParseTime = Timer.builder( - "ties_ingestion_event_topology_source_entity_delete_parse_seconds").register(meterRegistry); + "teiv_ingestion_event_topology_source_entity_delete_parse_seconds").register(meterRegistry); - numIgnoredAttributes = Counter.builder("ties_ingestion_event_ignored_attributes_total").register(meterRegistry); + numIgnoredAttributes = Counter.builder("teiv_ingestion_event_ignored_attributes_total").register(meterRegistry); } /** diff --git a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicator.java b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicator.java similarity index 87% rename from teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicator.java rename to teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicator.java index 70e6c4b..0a1766a 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,14 +26,14 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; /** - * Health Check component for TIES exposure. + * Health Check component for TEIV exposure. */ @Component @Profile("exposure") -public class TiesExposureHealthIndicator extends TiesKafkaHealthIndicator { +public class TeivExposureHealthIndicator extends TeivKafkaHealthIndicator { - public TiesExposureHealthIndicator(HealthStatus healthStatus, + public TeivExposureHealthIndicator(HealthStatus healthStatus, DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka) { super(healthStatus, dependentServiceAvailabilityKafka); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicator.java b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicator.java similarity index 86% rename from teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicator.java rename to teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicator.java index 6091f5b..1b21665 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,14 +25,14 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; /** - * Health Check component for TIES exposure. + * Health Check component for TEIV exposure. */ @Component @Profile("groups") -public class TiesGroupsHealthIndicator extends TiesHealthIndicator { +public class TeivGroupsHealthIndicator extends TeivHealthIndicator { - public TiesGroupsHealthIndicator(HealthStatus healthStatus) { + public TeivGroupsHealthIndicator(HealthStatus healthStatus) { super(healthStatus); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesHealthIndicator.java b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivHealthIndicator.java similarity index 89% rename from teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesHealthIndicator.java rename to teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivHealthIndicator.java index 8c86879..4e41cd0 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesHealthIndicator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivHealthIndicator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,13 +26,13 @@ import org.springframework.boot.actuate.health.HealthIndicator; import lombok.extern.slf4j.Slf4j; @Slf4j -public abstract class TiesHealthIndicator implements HealthIndicator { +public abstract class TeivHealthIndicator implements HealthIndicator { protected final HealthStatus healthStatus; protected abstract String getServiceName(); - protected TiesHealthIndicator(HealthStatus healthStatus) { + protected TeivHealthIndicator(HealthStatus healthStatus) { this.healthStatus = healthStatus; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicator.java b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicator.java similarity index 88% rename from teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicator.java rename to teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicator.java index 054a74b..dbab861 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,19 +27,19 @@ import org.springframework.stereotype.Component; import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; /** - * Health Check component for TIES ingestion. + * Health Check component for TEIV ingestion. */ @Component @Profile("ingestion") -public class TiesIngestionHealthIndicator extends TiesKafkaHealthIndicator { +public class TeivIngestionHealthIndicator extends TeivKafkaHealthIndicator { @Override protected String getServiceName() { return "top-exp-inv-ingestion"; } - public TiesIngestionHealthIndicator(HealthStatus healthStatus, + public TeivIngestionHealthIndicator(HealthStatus healthStatus, DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka) { super(healthStatus, dependentServiceAvailabilityKafka); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesKafkaHealthIndicator.java b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivKafkaHealthIndicator.java similarity index 88% rename from teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesKafkaHealthIndicator.java rename to teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivKafkaHealthIndicator.java index 27ef1b5..90266a2 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesKafkaHealthIndicator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TeivKafkaHealthIndicator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,13 +25,13 @@ import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; @Slf4j -public abstract class TiesKafkaHealthIndicator extends TiesHealthIndicator { +public abstract class TeivKafkaHealthIndicator extends TeivHealthIndicator { protected final DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka; protected abstract String getServiceName(); - protected TiesKafkaHealthIndicator(HealthStatus healthStatus, + protected TeivKafkaHealthIndicator(HealthStatus healthStatus, DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka) { super(healthStatus); this.dependentServiceAvailabilityKafka = dependentServiceAvailabilityKafka; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/TeivException.java similarity index 69% rename from teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java rename to teiv/src/main/java/org/oran/smo/teiv/exception/TeivException.java index acf8097..34a2a92 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/TeivException.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,48 +29,55 @@ import org.springframework.http.HttpStatus; import lombok.Getter; +import static org.oran.smo.teiv.utils.TeivConstants.URN_PREFIX; + @Getter -public class TiesException extends RuntimeException { +public class TeivException extends RuntimeException { private final HttpStatus status; private final String message; private final String details; private final Exception exception; - public static TiesException unknownModule(final String module) { + public static TeivException unknownModule(final String module) { return clientException("Unknown module", String.format("Unknown module: %s", module)); } - public static TiesException unknownTopologyObjectType(final String topologyObject) { + public static TeivException unknownTopologyObjectType(final String topologyObject) { return serverException("Unknown topology object type", String.format("Unknown topology object type: %s", topologyObject), null); } // Request validation - public static TiesException unknownDomain(final String domain, final Collection domains) { + public static TeivException unknownDomain(final String domain, final Collection domains) { return clientException("Unknown domain", String.format("Unknown domain: %s, known domains: %s", domain, domains)); } - public static TiesException unknownEntityType(final String entityType, final Collection entityTypes) { + public static TeivException invalidTopologyID(String id) { + return clientException("Topology ID format not supported", String.format( + "Topology ID : %s is not in supported format. Topology ID should start with %s", id, URN_PREFIX)); + } + + public static TeivException unknownEntityType(final String entityType, final Collection entityTypes) { return clientException("Unknown entity type", String.format( "Entity type %s is not part of the model, known entity types: %s", entityType, entityTypes)); } - public static TiesException unknownEntityTypeInDomain(final String entityType, final String domain, + public static TeivException unknownEntityTypeInDomain(final String entityType, final String domain, final Collection entityTypesInDomain) { return clientException("Unknown entity type", String.format( "Entity type %s is not part of the domain %s, known entity types: %s", entityType, domain, entityTypesInDomain)); } - public static TiesException unknownRelationshipType(final String relationshipType, + public static TeivException unknownRelationshipType(final String relationshipType, final Collection relationshipTypes) { return clientException("Unknown relationship type", String.format( "Relationship type %s is not part of the model, known relationship types: %s", relationshipType, relationshipTypes)); } - public static TiesException unknownRelationshipTypeInDomain(final String relationshipType, final String domain, + public static TeivException unknownRelationshipTypeInDomain(final String relationshipType, final String domain, final Collection relationshipTypesInDomain) { return clientException("Unknown relationship type", String.format( "Relationship type %s is not part of the domain %s, known relationship types: %s", relationshipType, domain, @@ -78,94 +85,94 @@ public class TiesException extends RuntimeException { } // Schema validation - public static TiesException invalidSchema(final String name) { + public static TeivException invalidSchema(final String name) { return clientException("Invalid schema name", String.format("Invalid schema name: %s", name)); } - public static TiesException invalidFileInput(final String error) { + public static TeivException invalidFileInput(final String error) { return clientException("Invalid file input", String.format("Invalid file input: %s", error)); } - public static TiesException duplicateEntryForClassifiers(final String name) { + public static TeivException duplicateEntryForClassifiers(final String name) { return clientException("Duplicate entry in schema", String.format("Duplicate classifier present in schema: %s", name)); } - public static TiesException duplicateEntryForDecorators(final String name) { + public static TeivException duplicateEntryForDecorators(final String name) { return clientException("Duplicate entry in schema", String.format("Duplicate decorator present in schema: %s", name)); } - public static TiesException schemaNotOwned(final String name) { - return new TiesException("Forbidden", String.format("Schema %s is not owned by user", name), HttpStatus.FORBIDDEN, + public static TeivException schemaNotOwned(final String name) { + return new TeivException("Forbidden", String.format("Schema %s is not owned by user", name), HttpStatus.FORBIDDEN, null); } - public static TiesException serverSQLException() { + public static TeivException serverSQLException() { return serverException("Sql exception during query execution", "Please check the logs for more details", null); } - public static TiesException unParsedTopologyObjectType(String topologyObjectName) { + public static TeivException unParsedTopologyObjectType(String topologyObjectName) { return serverException(String.format("Un parsed topology object type: %s", topologyObjectName), "Please check the logs for more details", null); } - public static TiesException invalidContainerType(String containerType) { + public static TeivException invalidContainerType(String containerType) { return serverException(String.format("Invalid container type: %s", containerType), "Please check the logs for more details", null); } - public static TiesException invalidAssociationType(final String association) { + public static TeivException invalidAssociationType(final String association) { return serverException(String.format("Invalid association type: %s", association), "Please check the logs for more details", null); } - public static TiesException resourceNotFoundException(final String id) { - return new TiesException("Resource Not Found", String.format("The requested resource is not found. ID: %s", id), + public static TeivException resourceNotFoundException(final String id) { + return new TeivException("Resource Not Found", String.format("The requested resource is not found. ID: %s", id), HttpStatus.NOT_FOUND, null); } - public static TiesException resourceNotFoundException(Set entityIds, Set relationshipIds) { - return new TiesException("Resource Not Found", String.format( + public static TeivException resourceNotFoundException(Set entityIds, Set relationshipIds) { + return new TeivException("Resource Not Found", String.format( "The requested resource with the following ids cannot be found. Entities: %s Relationships: %s", entityIds, relationshipIds), HttpStatus.NOT_FOUND, null); } - public static TiesException invalidClassifiersException(List classifiers) { - return new TiesException("Invalid classifiers", String.format("The provided classifiers are invalid %s", + public static TeivException invalidClassifiersException(List classifiers) { + return new TeivException("Invalid classifiers", String.format("The provided classifiers are invalid %s", classifiers), HttpStatus.NOT_FOUND, null); } - public static TiesException invalidDecoratorsException(Map problems) { - return new TiesException("Invalid decorators", String.format("The provided decorators are invalid %s", problems), + public static TeivException invalidDecoratorsException(Map problems) { + return new TeivException("Invalid decorators", String.format("The provided decorators are invalid %s", problems), HttpStatus.NOT_FOUND, null); } - public static TiesException invalidValueException(String valueName, Integer valueLimit, Boolean isLowerLimit) { + public static TeivException invalidValueException(String valueName, Integer valueLimit, Boolean isLowerLimit) { return clientException("Invalid Value", String.format("%s cannot be %s than %d", valueName, isLowerLimit ? "larger" : "lower", valueLimit)); } - public static TiesException invalidJsonFormat(Exception exception) { + public static TeivException invalidJsonFormat(Exception exception) { return serverException("Invalid json format", "Please check the logs for more details", exception); } - public static TiesException serverException(String message, String details, Exception exception) { - return new TiesException(message, details, HttpStatus.INTERNAL_SERVER_ERROR, exception); + public static TeivException serverException(String message, String details, Exception exception) { + return new TeivException(message, details, HttpStatus.INTERNAL_SERVER_ERROR, exception); } - public static TiesException clientException(String message, String details) { - return new TiesException(message, details, HttpStatus.BAD_REQUEST, null); + public static TeivException clientException(String message, String details) { + return new TeivException(message, details, HttpStatus.BAD_REQUEST, null); } - public static TiesException schemaInDeletingState(String moduleName) { - return new TiesException("Schema in deleting state", String.format( + public static TeivException schemaInDeletingState(String moduleName) { + return new TeivException("Schema in deleting state", String.format( "Schema %s already exists and is in the process of being deleted. This may take some time, please try again later.", moduleName), HttpStatus.CONFLICT, null); } - private TiesException(String message, String details, HttpStatus status, Exception exception) { + private TeivException(String message, String details, HttpStatus status, Exception exception) { this.status = status; this.message = message; this.details = details; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/api/impl/ClassifiersServiceImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/api/impl/ClassifiersServiceImpl.java index 40ee832..ec3a04e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/api/impl/ClassifiersServiceImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/api/impl/ClassifiersServiceImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,13 @@ package org.oran.smo.teiv.exposure.classifiers.api.impl; import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.api.model.OranTeivClassifier; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.classifiers.api.ClassifiersService; import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataOperationRegistry; import org.oran.smo.teiv.exposure.consumerdata.model.Classifiers; import org.oran.smo.teiv.exposure.consumerdata.operation.ClassifiersOperation; import org.oran.smo.teiv.exposure.spi.ModelRepository; +import org.oran.smo.teiv.exposure.utils.RequestValidator; import org.oran.smo.teiv.schema.ConsumerDataCache; import org.oran.smo.teiv.service.models.OperationResult; import org.springframework.context.annotation.Profile; @@ -41,7 +42,7 @@ import java.util.List; import java.util.function.Consumer; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; @Slf4j @Service @@ -53,6 +54,8 @@ public class ClassifiersServiceImpl implements ClassifiersService { private final ConsumerDataCache consumerDataCache; private final ConsumerDataOperationRegistry consumerDataOperationRegistry; + private final RequestValidator requestValidator; + @Override public void update(final OranTeivClassifier oranTeivClassifier) { @@ -87,11 +90,12 @@ public class ClassifiersServiceImpl implements ClassifiersService { private void validateMerge(final Classifiers classifiers) { log.debug(String.format("Validating merging %s", classifiers)); - + classifiers.entityIds().forEach(requestValidator::validateTopologyID); + classifiers.relationshipIds().forEach(requestValidator::validateTopologyID); final List problems = checkAvailability(classifiers); if (!problems.isEmpty()) { - throw TiesException.invalidClassifiersException(problems); + throw TeivException.invalidClassifiersException(problems); } } @@ -100,8 +104,8 @@ public class ClassifiersServiceImpl implements ClassifiersService { for (String classifier : classifiers.data()) { final String schemaName = classifier.split(":")[0]; - if (!modelRepository.doesModuleExists(TIES_CONSUMER_DATA, schemaName)) { - throw TiesException.invalidSchema(schemaName); + if (!modelRepository.doesModuleExists(TEIV_CONSUMER_DATA, schemaName)) { + throw TeivException.invalidSchema(schemaName); } } } @@ -118,7 +122,7 @@ public class ClassifiersServiceImpl implements ClassifiersService { private void runMethodSafe(Consumer consumer, Classifiers classifiers) { try { consumer.accept(classifiers); - } catch (TiesException ex) { + } catch (TeivException ex) { log.error("Exception during validation", ex); throw ex; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java index 01c2108..edc7484 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ import jakarta.servlet.http.HttpServletRequest; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.api.ClassifiersApi; import org.oran.smo.teiv.api.model.OranTeivClassifier; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.audit.AuditMapper; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.classifiers.api.ClassifiersService; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; @@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController -@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequestMapping(TeivConstants.REQUEST_MAPPING) @RequiredArgsConstructor @Profile("exposure") public class ClassifiersRestController implements ClassifiersApi { @@ -61,13 +61,13 @@ public class ClassifiersRestController implements ClassifiersApi { private int limit; @Override - @Timed("ties_exposure_http_update_classifiers_seconds") + @Timed("teiv_exposure_http_update_classifiers_seconds") public ResponseEntity updateClassifier(final String accept, final String contentType, final OranTeivClassifier oranTeivClassifier) { return runWithFailCheck(() -> { if (Optional.ofNullable(oranTeivClassifier.getEntityIds()).orElseGet(Collections::emptyList).size() + Optional .ofNullable(oranTeivClassifier.getRelationshipIds()).orElseGet(Collections::emptyList).size() > limit) { - throw TiesException.clientException("Limit exceeded", + throw TeivException.clientException("Limit exceeded", "Number of entities and relationships exceeded the limit"); } runSafeMethod(() -> classifiersService.update(oranTeivClassifier), status -> loggerHandler.logAudit(log, @@ -91,7 +91,7 @@ public class ClassifiersRestController implements ClassifiersApi { try { runnable.run(); logAudit.accept(HttpStatus.NO_CONTENT); - } catch (TiesException ex) { + } catch (TeivException ex) { logAudit.accept(ex.getStatus()); log.error("Exception during service call", ex); throw ex; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepositoryImpl.java index 44d8a63..5c68abf 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepositoryImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +21,10 @@ package org.oran.smo.teiv.exposure.consumerdata; import static org.jooq.impl.DSL.field; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.MODULE_REFERENCE; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.MODULE_REFERENCE; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; import java.util.HashMap; import java.util.HashSet; @@ -40,9 +40,9 @@ import org.jooq.Record; import org.jooq.Record1; import org.jooq.Record2; import org.jooq.SelectConditionStep; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.YangDataTypes; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.stereotype.Service; @Slf4j @@ -56,9 +56,9 @@ public class ConsumerDataRepositoryImpl implements ConsumerDataRepository { public Set loadClassifiers() { final Field classifierName = field("classifiers.name").as("classifierName"); SelectConditionStep> availableClassifiers = runMethodSafe(() -> readDataDslContext.select( - classifierName).from(String.format(TIES_CONSUMER_DATA, CLASSIFIERS)).join(String.format(TIES_CONSUMER_DATA, - MODULE_REFERENCE)).on(field("\"moduleReferenceName\"").eq(field(String.format(TIES_CONSUMER_DATA, - MODULE_REFERENCE) + ".name"))).where(field("status").like(TiesConstants.IN_USAGE))); + classifierName).from(String.format(TEIV_CONSUMER_DATA, CLASSIFIERS)).join(String.format(TEIV_CONSUMER_DATA, + MODULE_REFERENCE)).on(field("\"moduleReferenceName\"").eq(field(String.format(TEIV_CONSUMER_DATA, + MODULE_REFERENCE) + ".name"))).where(field("status").like(TeivConstants.IN_USAGE))); Set result = new HashSet<>(); for (Record record : availableClassifiers) { result.add((String) record.get("classifierName")); @@ -71,10 +71,10 @@ public class ConsumerDataRepositoryImpl implements ConsumerDataRepository { final Field decoratorName = field("decorators.name").as("decoratorName"); final Field dataType = field("decorators.\"dataType\"").as("dataType"); SelectConditionStep> availableDecorators = runMethodSafe(() -> readDataDslContext.select( - decoratorName, dataType).from(String.format(TIES_CONSUMER_DATA, DECORATORS)).join(String.format( - TIES_CONSUMER_DATA, MODULE_REFERENCE)).on(field("\"moduleReferenceName\"").eq(field(String.format( - TIES_CONSUMER_DATA, MODULE_REFERENCE) + ".name"))).where(field("status").like( - TiesConstants.IN_USAGE))); + decoratorName, dataType).from(String.format(TEIV_CONSUMER_DATA, DECORATORS)).join(String.format( + TEIV_CONSUMER_DATA, MODULE_REFERENCE)).on(field("\"moduleReferenceName\"").eq(field(String.format( + TEIV_CONSUMER_DATA, MODULE_REFERENCE) + ".name"))).where(field("status").like( + TeivConstants.IN_USAGE))); Map result = new HashMap<>(); for (Record record : availableDecorators) { result.put((String) record.get("decoratorName"), YangDataTypes.fromYangDataType("" + record.get("dataType"))); @@ -85,11 +85,11 @@ public class ConsumerDataRepositoryImpl implements ConsumerDataRepository { protected T runMethodSafe(Supplier supp) { try { return supp.get(); - } catch (TiesException ex) { + } catch (TeivException ex) { throw ex; } catch (Exception ex) { log.error("Sql exception during query execution", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataValidator.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataValidator.java index 5d58247..3af55b9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataValidator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataValidator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.consumerdata.model.Classifiers; import org.oran.smo.teiv.exposure.consumerdata.model.Decorators; import org.oran.smo.teiv.schema.ConsumerDataCache; @@ -48,7 +48,7 @@ public class ConsumerDataValidator { final List problems = checkAvailability(classifiers); if (!problems.isEmpty()) { - throw TiesException.invalidClassifiersException(problems); + throw TeivException.invalidClassifiersException(problems); } } @@ -67,7 +67,7 @@ public class ConsumerDataValidator { final Map problems = checkAvailability(decorators); if (!problems.isEmpty()) { - throw TiesException.invalidDecoratorsException(problems); + throw TeivException.invalidDecoratorsException(problems); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ClassifiersOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ClassifiersOperation.java index 5697ba7..0c14e6b 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ClassifiersOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ClassifiersOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.service.models.OperationResult; import org.oran.smo.teiv.utils.JooqTypeConverter; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Slf4j public abstract class ClassifiersOperation extends ConsumerDataOperation> { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ConsumerDataOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ConsumerDataOperation.java index dc329e4..8b218e9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ConsumerDataOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/ConsumerDataOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; import org.jooq.exception.DataAccessException; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.consumerdata.model.ConsumerData; import org.oran.smo.teiv.exposure.consumerdata.model.PersistableIdMap; import org.oran.smo.teiv.schema.Persistable; @@ -107,7 +107,7 @@ public abstract class ConsumerDataOperation { if (!entityCheckResult.idsNotFound().isEmpty() || !relationshipCheckResult.idsNotFound().isEmpty()) { - throw TiesException.resourceNotFoundException(entityCheckResult.idsNotFound(), relationshipCheckResult + throw TeivException.resourceNotFoundException(entityCheckResult.idsNotFound(), relationshipCheckResult .idsNotFound()); } @@ -154,7 +154,7 @@ public abstract class ConsumerDataOperation { return supplier.get(); } catch (DataAccessException ex) { log.error("Sql exception during query execution", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DecoratorsOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DecoratorsOperation.java index e5bfea1..a94650e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DecoratorsOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DecoratorsOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.service.models.OperationResult; import org.oran.smo.teiv.utils.JooqTypeConverter; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Slf4j public abstract class DecoratorsOperation extends ConsumerDataOperation> { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteClassifiersOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteClassifiersOperation.java index eb66562..a584dd5 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteClassifiersOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteClassifiersOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,7 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.val; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Component @Profile("exposure") diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteDecoratorsOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteDecoratorsOperation.java index 04f6e7e..3f09bbe 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteDecoratorsOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/DeleteDecoratorsOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,7 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.val; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Component @Profile("exposure") diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeClassifiersOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeClassifiersOperation.java index d55316b..72d5d27 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeClassifiersOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeClassifiersOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ import static org.jooq.impl.DSL.notExists; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.val; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Component @Profile("exposure") diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeDecoratorsOperation.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeDecoratorsOperation.java index 1967b52..62a4f2d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeDecoratorsOperation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/operation/MergeDecoratorsOperation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.not; import static org.jooq.impl.DSL.table; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Component @Profile("exposure") diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/impl/DataServiceImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/impl/DataServiceImpl.java index c189153..1a05eaf 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/impl/DataServiceImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/impl/DataServiceImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,19 +24,19 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import org.oran.smo.teiv.exposure.tiespath.resolver.ScopeResolver; +import org.oran.smo.teiv.exposure.teivpath.resolver.ScopeResolver; import org.jooq.Record; import org.jooq.Result; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.DataRepository; import org.oran.smo.teiv.exposure.spi.mapper.EntityMapper; import org.oran.smo.teiv.exposure.spi.mapper.RelationshipMapper; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.InnerFilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.refiner.BasePathRefinement; -import org.oran.smo.teiv.exposure.tiespath.resolver.TargetResolver; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.InnerFilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.refiner.BasePathRefinement; +import org.oran.smo.teiv.exposure.teivpath.resolver.TargetResolver; import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; @@ -130,7 +130,7 @@ public class DataServiceImpl implements DataService { final EntityType entityType = SchemaRegistry.getEntityTypeByName(entityName); final Result result = dataRepository.getEntityById(entityType, id); if (result.isEmpty()) { - throw TiesException.resourceNotFoundException(id); + throw TeivException.resourceNotFoundException(id); } return entityMapper.getItemsWithTotalCount(result).getLeft().get(0); @@ -218,7 +218,7 @@ public class DataServiceImpl implements DataService { final RelationType relationType = SchemaRegistry.getRelationTypeByName(relationName); final Result result = dataRepository.getRelationshipById(id, relationType); if (result.isEmpty()) { - throw TiesException.resourceNotFoundException(id); + throw TeivException.resourceNotFoundException(id); } return relationshipMapper.getItemsWithTotalCount(result).getLeft().get(0); diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/rest/controller/DataController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/rest/controller/DataController.java index 7a94aa5..d9dd04b 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/rest/controller/DataController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/rest/controller/DataController.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ import org.oran.smo.teiv.api.model.OranTeivRelationshipsResponseMessage; import org.oran.smo.teiv.exposure.data.api.DataService; import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.oran.smo.teiv.exposure.utils.RequestValidator; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -49,7 +49,7 @@ import jakarta.validation.constraints.NotNull; @Slf4j @RestController -@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequestMapping(TeivConstants.REQUEST_MAPPING) @RequiredArgsConstructor @Profile("exposure") public class DataController implements EntitiesAndRelationshipsApi { @@ -61,7 +61,7 @@ public class DataController implements EntitiesAndRelationshipsApi { private final CustomMetrics customMetrics; @Override - @Timed("ties_exposure_http_get_domain_types_seconds") + @Timed("teiv_exposure_http_get_domain_types_seconds") public ResponseEntity getAllDomains(@NotNull String accept, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { return runWithFailCheck(() -> new ResponseEntity<>(dataService.getDomainTypes(RequestDetails.builder().offset( @@ -70,7 +70,7 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_entity_types_seconds") + @Timed("teiv_exposure_http_get_entity_types_seconds") public ResponseEntity getTopologyEntityTypes(@NotNull String accept, String domain, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { return runWithFailCheck(() -> { @@ -81,7 +81,7 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_relationship_types_seconds") + @Timed("teiv_exposure_http_get_relationship_types_seconds") public ResponseEntity getTopologyRelationshipTypes(@NotNull String accept, String domain, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { return runWithFailCheck(() -> { @@ -93,7 +93,7 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_relationships_by_type_seconds") + @Timed("teiv_exposure_http_get_relationships_by_type_seconds") public ResponseEntity getRelationshipsByType(@NotNull String accept, String domain, String relationshipType, @Valid String targetFilter, @Valid String scopeFilter, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { @@ -109,19 +109,20 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_entity_by_id_seconds") + @Timed("teiv_exposure_http_get_entity_by_id_seconds") public ResponseEntity getTopologyById(@NotNull final String accept, final String domain, final String entityType, final String id) { return runWithFailCheck(() -> { requestValidator.validateDomain(domain); requestValidator.validateEntityType(entityType); requestValidator.validateEntityTypeInDomain(entityType, domain); + requestValidator.validateTopologyID(id); return new ResponseEntity<>(dataService.getEntityById(entityType, id), HttpStatus.OK); }, customMetrics::incrementNumUnsuccessfullyExposedEntityById); } @Override - @Timed("ties_exposure_http_get_entities_by_type_seconds") + @Timed("teiv_exposure_http_get_entities_by_type_seconds") public ResponseEntity getTopologyByEntityTypeName(@NotNull final String accept, final String domain, final String entityType, @Valid final String targetFilter, @Valid final String scopeFilter, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { @@ -137,7 +138,7 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_entities_by_domain_seconds") + @Timed("teiv_exposure_http_get_entities_by_domain_seconds") public ResponseEntity getEntitiesByDomain(@NotNull final String accept, final String domain, @Valid final String targetFilter, @Valid final String scopeFilter, @Min(0) @Valid final Integer offset, @Min(1) @Max(500) @Valid final Integer limit) { @@ -150,7 +151,7 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_relationships_by_entity_id_seconds") + @Timed("teiv_exposure_http_get_relationships_by_entity_id_seconds") public ResponseEntity getAllRelationshipsForEntityId(@NotNull final String accept, final String domain, final String entityType, final String id, @Valid final String targetFilter, @Valid final String scopeFilter, @Min(0) @Valid final Integer offset, @@ -159,6 +160,7 @@ public class DataController implements EntitiesAndRelationshipsApi { requestValidator.validateDomain(domain); requestValidator.validateEntityType(entityType); requestValidator.validateEntityTypeInDomain(entityType, domain); + requestValidator.validateTopologyID(id); return ResponseEntity.ok(dataService.getAllRelationshipsForObjectId(domain, entityType, id, targetFilter, scopeFilter, RequestDetails.builder().offset(offset).limit(limit).basePath(String.format( "/domains/%s/entity-types/%s/entities/%s/relationships", domain, entityType, id)).queryParam( @@ -167,13 +169,14 @@ public class DataController implements EntitiesAndRelationshipsApi { } @Override - @Timed("ties_exposure_http_get_relationship_by_id_seconds") + @Timed("teiv_exposure_http_get_relationship_by_id_seconds") public ResponseEntity getRelationshipById(final String accept, final String domain, final String relationshipType, final String id) { return runWithFailCheck(() -> { requestValidator.validateDomain(domain); requestValidator.validateRelationshipType(relationshipType); requestValidator.validateRelationshipTypeInDomain(relationshipType, domain); + requestValidator.validateTopologyID(id); return ResponseEntity.ok(dataService.getRelationshipById(relationshipType, id)); }, customMetrics::incrementNumUnsuccessfullyExposedRelationshipById); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/api/impl/DecoratorsServiceImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/api/impl/DecoratorsServiceImpl.java index 29353cd..3a59304 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/api/impl/DecoratorsServiceImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/api/impl/DecoratorsServiceImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,12 +23,13 @@ package org.oran.smo.teiv.exposure.decorators.api.impl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.api.model.OranTeivDecorator; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataOperationRegistry; import org.oran.smo.teiv.exposure.consumerdata.model.Decorators; import org.oran.smo.teiv.exposure.consumerdata.operation.DecoratorsOperation; import org.oran.smo.teiv.exposure.decorators.api.DecoratorsService; import org.oran.smo.teiv.exposure.spi.ModelRepository; +import org.oran.smo.teiv.exposure.utils.RequestValidator; import org.oran.smo.teiv.schema.ConsumerDataCache; import org.oran.smo.teiv.schema.YangDataTypes; import org.oran.smo.teiv.service.models.OperationResult; @@ -41,7 +42,7 @@ import java.util.Map; import java.util.List; import java.util.function.Consumer; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; @Slf4j @Service @@ -52,6 +53,7 @@ public class DecoratorsServiceImpl implements DecoratorsService { private final ModelRepository modelRepository; private final ConsumerDataCache consumerDataCache; private final ConsumerDataOperationRegistry consumerDataOperationRegistry; + private final RequestValidator requestValidator; @Override public void update(final OranTeivDecorator oranTeivDecorator) { @@ -86,11 +88,12 @@ public class DecoratorsServiceImpl implements DecoratorsService { public void validateMerge(final Decorators decorators) { log.debug(String.format("Validating merging %s", decorators)); - + decorators.entityIds().forEach(requestValidator::validateTopologyID); + decorators.relationshipIds().forEach(requestValidator::validateTopologyID); final Map problems = checkAvailability(decorators); if (!problems.isEmpty()) { - throw TiesException.invalidDecoratorsException(problems); + throw TeivException.invalidDecoratorsException(problems); } } @@ -99,8 +102,8 @@ public class DecoratorsServiceImpl implements DecoratorsService { for (String decorator : decorators.data().keySet()) { final String schemaName = decorator.split(":")[0]; - if (!modelRepository.doesModuleExists(TIES_CONSUMER_DATA, schemaName)) { - throw TiesException.invalidSchema(schemaName); + if (!modelRepository.doesModuleExists(TEIV_CONSUMER_DATA, schemaName)) { + throw TeivException.invalidSchema(schemaName); } } } @@ -136,7 +139,7 @@ public class DecoratorsServiceImpl implements DecoratorsService { private void runMethodSafe(Consumer consumer, Decorators classifiers) { try { consumer.accept(classifiers); - } catch (TiesException ex) { + } catch (TeivException ex) { log.error("Exception during validation", ex); throw ex; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java index 2b14804..9a460f4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.api.DecoratorsApi; import org.oran.smo.teiv.api.model.OranTeivDecorator; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.audit.AuditMapper; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.decorators.api.DecoratorsService; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; @@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController -@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequestMapping(TeivConstants.REQUEST_MAPPING) @RequiredArgsConstructor @Profile("exposure") public class DecoratorsRestController implements DecoratorsApi { @@ -61,13 +61,13 @@ public class DecoratorsRestController implements DecoratorsApi { private int limit; @Override - @Timed("ties_exposure_http_update_decorators_seconds") + @Timed("teiv_exposure_http_update_decorators_seconds") public ResponseEntity updateDecorator(final String accept, final String contentType, final OranTeivDecorator oranTeivDecorator) { return runWithFailCheck(() -> { if (Optional.ofNullable(oranTeivDecorator.getEntityIds()).orElseGet(Collections::emptyList).size() + Optional .ofNullable(oranTeivDecorator.getRelationshipIds()).orElseGet(Collections::emptyList).size() > limit) { - throw TiesException.clientException("Limit exceeded", + throw TeivException.clientException("Limit exceeded", "Number of entities and relationships exceeded the limit"); } runSafeMethod(() -> decoratorsService.update(oranTeivDecorator), status -> loggerHandler.logAudit(log, @@ -91,7 +91,7 @@ public class DecoratorsRestController implements DecoratorsApi { try { runnable.run(); logAudit.accept(HttpStatus.NO_CONTENT); - } catch (TiesException ex) { + } catch (TeivException ex) { logAudit.accept(ex.getStatus()); log.error("Exception during service call", ex); throw ex; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java index b2486c7..113a0f5 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,8 @@ package org.oran.smo.teiv.exposure.exception; import org.oran.smo.teiv.api.model.OranTeivErrorMessage; -import org.oran.smo.teiv.exception.TiesException; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.exception.TeivException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; @@ -43,8 +43,8 @@ import org.springframework.web.servlet.resource.NoResourceFoundException; public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler { @ResponseBody - @ExceptionHandler(TiesException.class) - public ResponseEntity handleTiesException(final TiesException exception) { + @ExceptionHandler(TeivException.class) + public ResponseEntity handleTeivException(final TeivException exception) { if (exception.getException() != null) { log.error(exception.getMessage(), exception.getException()); } @@ -53,8 +53,8 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler } @ResponseBody - @ExceptionHandler(TiesPathException.class) - public ResponseEntity handleTiesPathException(final TiesPathException exception) { + @ExceptionHandler(TeivPathException.class) + public ResponseEntity handleTeivPathException(final TeivPathException exception) { if (exception.getResponse() != null) { return new ResponseEntity<>(exception.getResponse(), HttpStatus.OK); } else { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/impl/ModelServiceImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/impl/ModelServiceImpl.java index 252eb62..59f7677 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/impl/ModelServiceImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/impl/ModelServiceImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.api.model.OranTeivHref; import org.oran.smo.teiv.api.model.OranTeivSchema; import org.oran.smo.teiv.api.model.OranTeivSchemaList; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangModelException; import org.oran.smo.teiv.exposure.model.api.ModelService; import org.oran.smo.teiv.exposure.spi.ModelRepository; @@ -52,9 +52,9 @@ import static org.oran.smo.teiv.exposure.utils.PaginationUtil.lastHref; import static org.oran.smo.teiv.exposure.utils.PaginationUtil.nextHref; import static org.oran.smo.teiv.exposure.utils.PaginationUtil.prevHref; import static org.oran.smo.teiv.exposure.utils.PaginationUtil.selfHref; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.INVALID_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.INVALID_SCHEMA; @Slf4j @Service @@ -89,7 +89,7 @@ public class ModelServiceImpl implements ModelService { Map decorators = (Map) result.get(DECORATORS); if (classifiers.isEmpty() && decorators.isEmpty()) { log.warn("No classifiers and decorators found in module {} ", moduleName); - throw TiesException.invalidFileInput(INVALID_SCHEMA); + throw TeivException.invalidFileInput(INVALID_SCHEMA); } modelRepository.createConsumerDataModule(Module.builder().name(moduleName).content(content).revision(revision) .ownerAppId("APP").status(ModuleStatus.IN_USAGE).build(), classifiers, decorators); @@ -122,7 +122,7 @@ public class ModelServiceImpl implements ModelService { return Optional.ofNullable(modelRepository.getModuleContentByName(name)).map(content -> new String(Base64 .getDecoder().decode(content), StandardCharsets.UTF_8)).orElseGet(() -> { log.warn("No schema found with name: {}", name); - throw TiesException.invalidSchema(name); + throw TeivException.invalidSchema(name); }); } @@ -134,7 +134,7 @@ public class ModelServiceImpl implements ModelService { schemaCleanUpService.cleanUpModule(name); }, () -> { log.warn("No module found with name: {}", name); - throw TiesException.invalidSchema(name); + throw TeivException.invalidSchema(name); }); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/rest/controller/ModelController.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/rest/controller/ModelController.java index bfdf412..8ed57af 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/rest/controller/ModelController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/rest/controller/ModelController.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,12 +24,12 @@ import java.util.Objects; import org.oran.smo.teiv.api.SchemasApi; import org.oran.smo.teiv.api.model.OranTeivSchemaList; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.model.api.ModelService; import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.oran.smo.teiv.exposure.utils.RequestValidator; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Profile; @@ -51,7 +51,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RestController -@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequestMapping(TeivConstants.REQUEST_MAPPING) @RequiredArgsConstructor @Profile("exposure") public class ModelController implements SchemasApi { @@ -69,7 +69,7 @@ public class ModelController implements SchemasApi { final String schemaName = modelService.createModule(file); loggerHandler.logAudit(logger, String.format("Successful - Create schema %s", schemaName), context); return new ResponseEntity<>(HttpStatus.CREATED); - } catch (TiesException ex) { + } catch (TeivException ex) { loggerHandler.logAudit(logger, String.format("Failed - Create schema using provided file, %s", ex.getDetails()), context); log.error("Exception during service call", ex); @@ -102,7 +102,7 @@ public class ModelController implements SchemasApi { modelService.deleteConsumerModule(schemaName); loggerHandler.logAudit(logger, String.format("Successful - Delete schema %s", schemaName), context); return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } catch (TiesException ex) { + } catch (TeivException ex) { loggerHandler.logAudit(logger, String.format("Failed - Delete schema %s, %s", schemaName, ex.getDetails()), context); log.error("Exception during service call", ex); diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java index ab15d24..64b7df1 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,8 +25,9 @@ import java.util.Set; import org.jooq.Record; import org.jooq.Result; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; import org.oran.smo.teiv.schema.EntityType; +import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.schema.RelationType; public interface DataRepository { @@ -127,4 +128,15 @@ public interface DataRepository { * @return the entity ids for classifier deletion */ List getEntityIdsForClassifierDeletion(final EntityType entityType, final Set classifiers); + + /** + * Check if a topology object - entity or relationship - exists with given id and type. + * + * @param type + * The topology type + * @param id + * The id + * @return true if exists, false if it does not + */ + boolean isTopologyExist(final Persistable type, final String id); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java index 48e63a1..21799c9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,10 @@ import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.val; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; +import static org.jooq.impl.DSL.name; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; import java.util.HashSet; import java.util.List; @@ -41,20 +42,21 @@ import org.jooq.Result; import org.jooq.SelectConditionStep; import org.jooq.SelectOrderByStep; import org.jooq.impl.DSL; +import org.oran.smo.teiv.schema.Persistable; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.DataRepository; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.refiner.BasePathRefinement; -import org.oran.smo.teiv.exposure.tiespath.refiner.PathToJooqRefinement; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.refiner.BasePathRefinement; +import org.oran.smo.teiv.exposure.teivpath.refiner.PathToJooqRefinement; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; @Slf4j @Service @@ -91,7 +93,7 @@ public class DataRepositoryImpl implements DataRepository { @Override public Set getClassifiersForSchema(final String schemaName) { SelectConditionStep availableClassifiers = runMethodSafe(() -> readDataDslContext.select().from(String - .format(TIES_CONSUMER_DATA, "classifiers")).where(field("\"moduleReferenceName\"").eq(schemaName))); + .format(TEIV_CONSUMER_DATA, "classifiers")).where(field("\"moduleReferenceName\"").eq(schemaName))); Set result = new HashSet<>(); for (Record record : availableClassifiers) { result.add((String) record.get("name")); @@ -102,7 +104,7 @@ public class DataRepositoryImpl implements DataRepository { @Override public Set getDecoratorsForSchema(final String schemaName) { SelectConditionStep availableDecorators = runMethodSafe(() -> readDataDslContext.select().from(String - .format(TIES_CONSUMER_DATA, "decorators")).where(field("\"moduleReferenceName\"").like(schemaName))); + .format(TEIV_CONSUMER_DATA, "decorators")).where(field("\"moduleReferenceName\"").like(schemaName))); Set result = new HashSet<>(); for (Record record : availableDecorators) { result.add((String) record.get("name")); @@ -172,17 +174,23 @@ public class DataRepositoryImpl implements DataRepository { .fetchInto(String.class)); } + @Override + public boolean isTopologyExist(final Persistable type, final String id) { + return runMethodSafe(() -> readDataDslContext.fetchExists(readDataDslContext.selectFrom(table(type.getTableName())) + .where(field(name(type.getIdColumnName())).eq(id)))); + } + protected T runMethodSafe(Supplier supp) { try { return supp.get(); - } catch (TiesException ex) { + } catch (TeivException ex) { throw ex; - } catch (TiesPathException ex) { + } catch (TeivPathException ex) { log.error("Exception during query construction", ex); throw ex; } catch (Exception ex) { log.error("Sql exception during query execution", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/ModelRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/ModelRepositoryImpl.java index 4cdcf05..cc42637 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/ModelRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/ModelRepositoryImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,16 +24,16 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.noCondition; import static org.jooq.impl.DSL.table; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.IN_USAGE; -import static org.oran.smo.teiv.utils.TiesConstants.MODULE_REFERENCE_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.SCHEMA_ALREADY_EXISTS; -import static org.oran.smo.teiv.utils.TiesConstants.SEMICOLON_SEPARATION; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_MODEL; -import static org.oran.smo.teiv.utils.TiesConstants.MODULE_REFERENCE; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.IN_USAGE; +import static org.oran.smo.teiv.utils.TeivConstants.MODULE_REFERENCE_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.SCHEMA_ALREADY_EXISTS; +import static org.oran.smo.teiv.utils.TeivConstants.SEMICOLON_SEPARATION; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL; +import static org.oran.smo.teiv.utils.TeivConstants.MODULE_REFERENCE; import java.util.ArrayList; import java.util.List; @@ -56,7 +56,7 @@ import org.springframework.stereotype.Component; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.ModelRepository; import org.oran.smo.teiv.exposure.spi.Module; import org.oran.smo.teiv.exposure.spi.ModuleStatus; @@ -84,7 +84,7 @@ public class ModelRepositoryImpl implements ModelRepository { @Override public Optional getConsumerModuleByName(final String name) { final Record moduleRecord = runMethodSafe(() -> readDataDslContext.select().from(table(String.format( - TIES_CONSUMER_DATA, MODULE_REFERENCE))).where(field("name").eq(name)).and(field(STATUS).eq( + TEIV_CONSUMER_DATA, MODULE_REFERENCE))).where(field("name").eq(name)).and(field(STATUS).eq( ModuleStatus.IN_USAGE.name())).fetchAny()); return Optional.ofNullable(moduleRecord).map(module -> Module.builder().name((String) module.get(NAME)).namespace( (String) module.get("namespace")).revision((String) module.get(REVISION)).ownerAppId((String) module.get( @@ -95,8 +95,8 @@ public class ModelRepositoryImpl implements ModelRepository { public List getModules() { return runMethodSafe(() -> { final List modules = new ArrayList<>(); - final List modulesFromModelSchema = getModulesBySchema(TIES_MODEL); - final List modulesFromConsumerDataSchema = getModulesBySchema(TIES_CONSUMER_DATA); + final List modulesFromModelSchema = getModulesBySchema(TEIV_MODEL); + final List modulesFromConsumerDataSchema = getModulesBySchema(TEIV_CONSUMER_DATA); modules.addAll(modulesFromModelSchema); modules.addAll(modulesFromConsumerDataSchema); return modules; @@ -106,7 +106,7 @@ public class ModelRepositoryImpl implements ModelRepository { @Override public List getDeletingModulesOnStartup() { return runMethodSafe(() -> { - Select moduleRecords = readDataDslContext.select().from(table(String.format(TIES_CONSUMER_DATA, + Select moduleRecords = readDataDslContext.select().from(table(String.format(TEIV_CONSUMER_DATA, MODULE_REFERENCE))).where(field(STATUS).eq(ModuleStatus.DELETING.name())); Function buildModuleFunction; buildModuleFunction = buildConsumerModules(); @@ -117,16 +117,16 @@ public class ModelRepositoryImpl implements ModelRepository { @Override public String getModuleContentByName(final String name) { return runMethodSafe(() -> { - String content = getModuleContentByNameFromSchema(TIES_MODEL, name); + String content = getModuleContentByNameFromSchema(TEIV_MODEL, name); if (content == null || content.equals("")) { - content = getModuleContentByNameFromSchema(TIES_CONSUMER_DATA, name); + content = getModuleContentByNameFromSchema(TEIV_CONSUMER_DATA, name); } return content; }); } private void createModule(DSLContext transactionalDSL, Module module) { - createModuleWithDuplicateCheck(() -> transactionalDSL.insertInto(table(String.format(TIES_CONSUMER_DATA, + createModuleWithDuplicateCheck(() -> transactionalDSL.insertInto(table(String.format(TEIV_CONSUMER_DATA, MODULE_REFERENCE))).set(field(NAME), module.getName()).set(field("content"), module.getContent()).set(field( "\"ownerAppId\""), module.getOwnerAppId()).set(field(STATUS), module.getStatus().name()).set(field( REVISION), module.getRevision()).execute(), module.getName()); @@ -134,13 +134,13 @@ public class ModelRepositoryImpl implements ModelRepository { @Override public void updateModuleStatus(String name, ModuleStatus status) { - runMethodSafe(() -> writeDataDslContext.update(table(String.format(TIES_CONSUMER_DATA, MODULE_REFERENCE))).set( + runMethodSafe(() -> writeDataDslContext.update(table(String.format(TEIV_CONSUMER_DATA, MODULE_REFERENCE))).set( field(STATUS), status.name()).where(field("name").eq(name)).execute()); } @Override public void deleteModuleByName(String name) { - runMethodSafe(() -> writeDataDslContext.deleteFrom(table(String.format(TIES_CONSUMER_DATA, MODULE_REFERENCE))) + runMethodSafe(() -> writeDataDslContext.deleteFrom(table(String.format(TEIV_CONSUMER_DATA, MODULE_REFERENCE))) .where(field("name").eq(name)).execute()); } @@ -149,7 +149,7 @@ public class ModelRepositoryImpl implements ModelRepository { .where(noCondition()); Function buildModuleFunction; - if (schemaName.equals(TIES_CONSUMER_DATA)) { + if (schemaName.equals(TEIV_CONSUMER_DATA)) { moduleRecords = moduleRecords.$where((field(STATUS).eq(IN_USAGE))); buildModuleFunction = buildConsumerModules(); } else { @@ -216,7 +216,7 @@ public class ModelRepositoryImpl implements ModelRepository { private void insertValues(final DSLContext transactionalDSL, final String tableName, final List columns, final Consumer> consumer) { - InsertValuesStepN executable = transactionalDSL.insertInto(table(String.format(TIES_CONSUMER_DATA, tableName))) + InsertValuesStepN executable = transactionalDSL.insertInto(table(String.format(TEIV_CONSUMER_DATA, tableName))) .columns(columns.stream().map(column -> field(column, String.class)).toList()); consumer.accept(executable); @@ -229,7 +229,7 @@ public class ModelRepositoryImpl implements ModelRepository { return supp.get(); } catch (Exception ex) { log.warn("Exception occurred during query execution.", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } @@ -240,20 +240,20 @@ public class ModelRepositoryImpl implements ModelRepository { } catch (IntegrityConstraintViolationException icve) { if (isModuleInDeletingState(moduleName)) { log.warn("Module in deleting state", icve); - throw TiesException.schemaInDeletingState(moduleName); + throw TeivException.schemaInDeletingState(moduleName); } else { log.warn("Module already exists", icve); - throw TiesException.invalidFileInput(SCHEMA_ALREADY_EXISTS); + throw TeivException.invalidFileInput(SCHEMA_ALREADY_EXISTS); } } catch (Exception ex) { log.warn("Exception occurred during query execution.", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } private boolean isModuleInDeletingState(String moduleName) { final SelectConditionStep> query = readDataDslContext.selectOne().from(String.format( - TIES_CONSUMER_DATA, MODULE_REFERENCE)).where(field(name(NAME)).eq(moduleName).and(field(STATUS).eq( + TEIV_CONSUMER_DATA, MODULE_REFERENCE)).where(field(name(NAME)).eq(moduleName).and(field(STATUS).eq( ModuleStatus.DELETING.name()))); return query.fetchAny() != null; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/mapper/ResponseMapper.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/mapper/ResponseMapper.java index e5a8d68..bfb3ddc 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/mapper/ResponseMapper.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/mapper/ResponseMapper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,12 @@ */ package org.oran.smo.teiv.exposure.spi.mapper; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.getOriginalAlias; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.PROPERTY_A_SIDE; -import static org.oran.smo.teiv.utils.TiesConstants.PROPERTY_B_SIDE; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.SOURCE_IDS; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.getOriginalAlias; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.PROPERTY_A_SIDE; +import static org.oran.smo.teiv.utils.TeivConstants.PROPERTY_B_SIDE; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; import java.util.ArrayList; import java.util.HashMap; @@ -41,7 +41,7 @@ import org.jooq.exception.DataTypeException; import org.oran.smo.teiv.schema.RelationType; import lombok.extern.slf4j.Slf4j; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; @Slf4j public abstract class ResponseMapper { @@ -126,7 +126,7 @@ public abstract class ResponseMapper { } } if (!attributes.isEmpty()) { - data.put(TiesConstants.ATTRIBUTES, attributes); + data.put(TeivConstants.ATTRIBUTES, attributes); } item.put(managedObject, List.of(data)); return item; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndLogicalBlock.java similarity index 90% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndLogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndLogicalBlock.java index cf9fb33..36169f2 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndLogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import org.jooq.Condition; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndOrLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java similarity index 89% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndOrLogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java index 9f1bb95..5cb0c3d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/AndOrLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +28,7 @@ import org.jooq.Table; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -45,7 +46,7 @@ public abstract class AndOrLogicalBlock extends LogicalBlock { @Override public Set> getJoinCondition() { - Set> tables = new HashSet<>(); + Set> tables = new LinkedHashSet<>(); tables.addAll(children.get(0).getJoinCondition()); tables.addAll(children.get(1).getJoinCondition()); return tables; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ConditionFactory.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ConditionFactory.java similarity index 74% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ConditionFactory.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ConditionFactory.java index 7d48658..6071f0c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ConditionFactory.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ConditionFactory.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,28 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.val; -import static org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction.EQ; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction.EQ; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction.GREATER_THAN; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction.GREATER_THAN_OR_EQ; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction.LESS_THAN; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction.LESS_THAN_OR_EQ; import static org.oran.smo.teiv.utils.PersistableUtil.getTableNameWithColumnName; -import static org.oran.smo.teiv.utils.TiesConstants.ITEM; +import static org.oran.smo.teiv.utils.TeivConstants.ITEM; import java.math.BigDecimal; import java.math.BigInteger; +import java.time.OffsetDateTime; import java.util.List; import java.util.Objects; +import lombok.extern.slf4j.Slf4j; import org.jooq.Condition; import org.jooq.Field; import org.jooq.JSONB; @@ -45,8 +51,9 @@ import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.RelationshipDataLocation; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; +@Slf4j @UtilityClass public class ConditionFactory { private static final String INVALID_TOPOLOGY_OBJECT_TYPE = "Invalid topology object type"; @@ -60,8 +67,11 @@ public class ConditionFactory { return switch (scopeObject.getContainer()) { case ATTRIBUTES -> new AttributesCondition(); case RELATION -> new RelationCondition(); - case ID -> new IdCondition(); - case ASSOCIATION -> new AssociationCondition(); + case ID -> switch (scopeObject.getTopologyObjectType()) { + case ASSOCIATION -> new AssociationCondition(); + default -> new IdCondition(); + }; + case NOT_NULL -> new AssociationCondition(); case CLASSIFIERS, SOURCE_IDS -> new ConsumerDataListCondition(); case DECORATORS -> new ConsumerDataMapCondition(); case METADATA -> new MetaDataMapCondition(); @@ -92,7 +102,15 @@ public class ConditionFactory { validateGeographicPoint(scopeObject.getParameter()); return scopeObject.getParameter(); } - default -> throw TiesPathException.invalidQueryCondition("Unexpected value: " + scopeObject.getDataType()); + case TIMESTAMPTZ -> { + try { + return OffsetDateTime.parse(scopeObject.getParameter()); + } catch (Exception e) { + log.error("Error while parsing timestamp in scope filter:", e); + throw TeivPathException.invalidQueryCondition("Invalid timestamp: " + scopeObject.getParameter()); + } + } + default -> throw TeivPathException.invalidQueryCondition("Unexpected value: " + scopeObject.getDataType()); } } @@ -104,7 +122,18 @@ public class ConditionFactory { case RELATION -> { return SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + case ASSOCIATION -> { + String[] topologyObjectTypeSplit = scopeObject.getTopologyObject().split("/"); + List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName( + topologyObjectTypeSplit[1]); + RelationType relationType = relationTypes.stream().filter(rel -> rel.getASide().getName().equals( + topologyObjectTypeSplit[0]) || rel.getBSide().getName().equals(topologyObjectTypeSplit[0])) + .findFirst().orElseThrow(() -> TeivPathException.grammarError("invalid relation")); + return relationType.getASide().getName().equals(topologyObjectTypeSplit[0]) ? + relationType.getBSide() : + relationType.getASide(); + } + default -> throw TeivPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); } } @@ -113,7 +142,7 @@ public class ConditionFactory { final boolean is3D = point.matches("(?i)POINT Z \\([-?\\d]+(\\.\\d+)? -?\\d+(\\.\\d+)? -?\\d+(\\.\\d+)?\\)"); if (!is2D && !is3D) { - throw TiesPathException.invalidQueryCondition( + throw TeivPathException.invalidQueryCondition( "Invalid geographic format, geographic type must be 2D or 3D coordinates. For example: POINT(39.40 67.94) or POINT Z (47.49 19.04 111.11)"); } } @@ -139,28 +168,28 @@ public class ConditionFactory { } case CONTAINS -> { if (scopeObject.getDataType().equals(DataType.GEOGRAPHIC)) { - throw TiesPathException.invalidQueryCondition("Cannot have CONTAINS on geography type data"); + throw TeivPathException.invalidQueryCondition("Cannot have CONTAINS on geography type data"); } return field(handleSimpleLeaf(scopeObject)).contains(convert(scopeObject)); } case WITHIN_METERS -> { if (!scopeObject.getDataType().equals(DataType.GEOGRAPHIC)) { - throw TiesPathException.invalidQueryCondition("Within meters condition needs geography type data"); + throw TeivPathException.invalidQueryCondition("Within meters condition needs geography type data"); } String[] parameters = scopeObject.getParameter().split(","); if (parameters.length != 2 || !parameters[0].matches(pointRegex)) { - throw TiesPathException.invalidQueryCondition("Invalid parameter for within meters condition"); + throw TeivPathException.invalidQueryCondition("Invalid parameter for within meters condition"); } return condition("ST_DWithin(?, ST_GeographyFromText(?), ?)", field("\"" + scopeObject .getLeaf() + "\""), field(parameters[0]), field(parameters[1].replaceAll(" ", ""))); } case COVERED_BY -> { if (!scopeObject.getDataType().equals(DataType.GEOGRAPHIC)) { - throw TiesPathException.invalidQueryCondition("Covered by condition needs geography type data"); + throw TeivPathException.invalidQueryCondition("Covered by condition needs geography type data"); } if (!scopeObject.getParameter().matches(polygonRegex) && !scopeObject.getParameter().matches( multiPolygonRegex)) { - throw TiesPathException.invalidQueryCondition("Invalid parameter for covered by condition"); + throw TeivPathException.invalidQueryCondition("Invalid parameter for covered by condition"); } return condition("ST_CoveredBy(?, ST_GeographyFromText(?))", field("\"" + scopeObject.getLeaf() + "\""), val(scopeObject.getParameter())); @@ -189,7 +218,7 @@ public class ConditionFactory { return condition(field(handleContainers(scopeObject) + " ->> ?", val(scopeObject.getLeaf())).like( handleLikeComplexParameter(scopeObject))); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TeivPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); } } @@ -245,7 +274,18 @@ public class ConditionFactory { switch (scopeObject.getTopologyObjectType()) { case ENTITY -> persistable = SchemaRegistry.getEntityTypeByName(scopeObject.getTopologyObject()); case RELATION -> persistable = SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); - default -> throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + case ASSOCIATION -> { + String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/"); + List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName( + topologyObjectSplit[1]); + RelationType relation = relationTypes.stream().filter(r -> r.getASide().getName().equals( + topologyObjectSplit[0]) || r.getBSide().getName().equals(topologyObjectSplit[0])).findFirst() + .orElseThrow(() -> TeivPathException.invalidQueryCondition("Relation was not found")); + persistable = relation.getASideAssociation().getName().equals(topologyObjectSplit[1]) ? + relation.getBSide() : + relation.getASide(); + } + default -> throw TeivPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); } return persistable; } @@ -265,7 +305,7 @@ public class ConditionFactory { case NOT_NULL -> { return notNullCondition(scopeObject); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TeivPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); } } @@ -278,12 +318,12 @@ public class ConditionFactory { final List relationNames = SchemaRegistry.getRelationNamesByEntityName(scopeObject .getTopologyObject()); final String relationName = relationNames.stream().filter(name -> name.equals(scopeObject - .getInnerContainer().get(0))).findFirst().orElseThrow(() -> TiesPathException.invalidQueryCondition( + .getInnerContainer().get(0))).findFirst().orElseThrow(() -> TeivPathException.invalidQueryCondition( "Relationship was not found for topology object")); final Persistable persistable = SchemaRegistry.getRelationTypeByName(relationName); return Objects.requireNonNull(persistable).getTableName() + "." + name(persistable.getIdColumnName()); } else { - throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + throw TeivPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); } } @@ -302,11 +342,20 @@ public class ConditionFactory { .getInnerContainer().get(0)); relation = relationTypes.stream().filter(r -> r.getASide().getName().equals(scopeObject .getTopologyObject()) || r.getBSide().getName().equals(scopeObject.getTopologyObject())) - .findFirst().orElseThrow(() -> TiesPathException.invalidQueryCondition( + .findFirst().orElseThrow(() -> TeivPathException.invalidQueryCondition( "Relation was not found")); } case RELATION -> relation = SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); - default -> throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + case ASSOCIATION -> { + String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/"); + List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName( + topologyObjectSplit[1]); + relation = relationTypes.stream().filter(r -> r.getASide().getName().equals(topologyObjectSplit[0]) || r + .getBSide().getName().equals(topologyObjectSplit[0]) || r.getName().equals( + topologyObjectSplit[0])).findFirst().orElseThrow(() -> TeivPathException + .invalidQueryCondition("Relation was not found")); + } + default -> throw TeivPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); } switch (scopeObject.getQueryFunction()) { case EQ, CONTAINS -> { @@ -338,14 +387,14 @@ public class ConditionFactory { return condition(field(SchemaRegistry.getReferenceColumnName(Objects.requireNonNull(relation))) .isNotNull()); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TeivPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); } } private static String checkManyToMany(RelationType relation, ScopeObject scopeObject) { - if (relation.getASide().getName().equals(scopeObject.getTopologyObject()) || SchemaRegistry - .getEntityTypeOnAssociationSide(relation, scopeObject.getInnerContainer().get(0)).getName().equals( - relation.getASide().getName())) { + if (relation.getASide().getName().equals(scopeObject.getTopologyObject().split("/")[0]) || SchemaRegistry + .getEntityTypeOnAssociationSide(relation, scopeObject.getTopologyObject().split("/")[1]).getName() + .equals(relation.getASide().getName())) { return relation.bSideColumnName(); } else { return relation.aSideColumnName(); @@ -353,7 +402,7 @@ public class ConditionFactory { } private static String checkSameEntityRelationship(RelationType relation, ScopeObject scopeObject) { - if (relation.getASideAssociation().getName().equals(scopeObject.getInnerContainer().get(0))) { + if (relation.getASideAssociation().getName().equals(scopeObject.getTopologyObject().split("/")[1])) { return relation.aSideColumnName(); } else { return relation.bSideColumnName(); @@ -364,10 +413,23 @@ public class ConditionFactory { static class MetaDataMapCondition extends AnyCondition { @Override public Condition getCondition(final ScopeObject scopeObject) { - if (!scopeObject.getQueryFunction().equals(EQ)) { - throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + if (scopeObject.getQueryFunction().equals(LESS_THAN)) { + return lessThanCondition(scopeObject); + } + if (scopeObject.getQueryFunction().equals(GREATER_THAN)) { + return greaterThanCondition(scopeObject); + } + if (scopeObject.getQueryFunction().equals(LESS_THAN_OR_EQ)) { + return lessThanOrEqualsCondition(scopeObject); + } + if (scopeObject.getQueryFunction().equals(GREATER_THAN_OR_EQ)) { + return greaterThanOrEqualsCondition(scopeObject); + } + if (scopeObject.getQueryFunction().equals(EQ)) { + return equalsCondition(scopeObject); + } else { + throw TeivPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); } - return equalsCondition(scopeObject); } private static String getColumnName(final ScopeObject scopeObject) { @@ -376,15 +438,40 @@ public class ConditionFactory { } private static Condition equalsCondition(final ScopeObject scopeObject) { + if (scopeObject.getDataType().equals(DataType.TIMESTAMPTZ)) { + return condition("(? ->> ?)::timestamptz = ?", field(getColumnName(scopeObject)), inline(scopeObject + .getLeaf()), inline(convert(scopeObject))); + } return condition("? -> ? = ?", field(getColumnName(scopeObject)), inline(scopeObject.getLeaf()), inline( "\"" + convert(scopeObject) + "\"")); } + + private static Condition lessThanCondition(final ScopeObject scopeObject) { + return condition("(? ->> ?)::timestamptz < ?", field(getColumnName(scopeObject)), inline(scopeObject.getLeaf()), + inline(convert(scopeObject))); + } + + private static Condition lessThanOrEqualsCondition(final ScopeObject scopeObject) { + return condition("(? ->> ?)::timestamptz <= ?", field(getColumnName(scopeObject)), inline(scopeObject + .getLeaf()), inline(convert(scopeObject))); + } + + private static Condition greaterThanCondition(final ScopeObject scopeObject) { + return condition("(? ->> ?)::timestamptz > ?", field(getColumnName(scopeObject)), inline(scopeObject.getLeaf()), + inline(convert(scopeObject))); + } + + private static Condition greaterThanOrEqualsCondition(final ScopeObject scopeObject) { + return condition("(? ->> ?)::timestamptz >= ?", field(getColumnName(scopeObject)), inline(scopeObject + .getLeaf()), inline(convert(scopeObject))); + } } private static Condition getConditionContainsOrEquals(ScopeObject scopeObject, RelationType relation, EntityType entityType, String sideColumnName) { - if (scopeObject.getTopologyObject().equals(entityType.getName()) || SchemaRegistry.getEntityTypeOnAssociationSide( - relation, scopeObject.getInnerContainer().get(0)).getName().equals(entityType.getName())) { + if (scopeObject.getTopologyObject().split("/")[0].equals(entityType.getName()) || SchemaRegistry + .getEntityTypeOnAssociationSide(relation, scopeObject.getTopologyObject().split("/")[1]).getName().equals( + entityType.getName())) { Field field = field(getTableNameWithColumnName(Objects.requireNonNull(entityType).getTableName(), sideColumnName)); if (scopeObject.getQueryFunction().equals(EQ)) { @@ -473,7 +560,7 @@ public class ConditionFactory { case NOT_NULL -> { return field(getColumnName(scopeObject)).isNotNull(); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TeivPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ContainerType.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ContainerType.java similarity index 89% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ContainerType.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ContainerType.java index 97b7c22..3c65699 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ContainerType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ContainerType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import jakarta.annotation.Nullable; import lombok.Getter; @@ -34,9 +34,9 @@ public enum ContainerType { SOURCE_IDS("sourceIds", false), //ToDo Resolver should not treat below two as containers but refinement do so this needs to be fixed - ASSOCIATION("association", false), RELATION("relation", false), - METADATA("metadata", false); + METADATA("metadata", false), + NOT_NULL("not_null", false); private final String value; private final boolean isParamAllowedInTargetFilter; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/EmptyLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java similarity index 93% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/EmptyLogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java index 10e59c3..4358fb6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/EmptyLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import java.util.Collections; import java.util.Set; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteria.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteria.java similarity index 95% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteria.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteria.java index 26b55e9..56908a2 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteria.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteria.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/InnerFilterCriteria.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java similarity index 87% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/InnerFilterCriteria.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java index 8b71412..17c4bbd 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/InnerFilterCriteria.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,20 +18,20 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.utils.PersistableUtil.getFullyQualifiedNameWithColumnName; import static org.oran.smo.teiv.utils.PersistableUtil.getTableNameWithColumnName; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.METADATA; -import static org.oran.smo.teiv.utils.TiesConstants.PROPERTY_A_SIDE; -import static org.oran.smo.teiv.utils.TiesConstants.PROPERTY_B_SIDE; -import static org.oran.smo.teiv.utils.TiesConstants.SOURCE_IDS; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.METADATA; +import static org.oran.smo.teiv.utils.TeivConstants.PROPERTY_A_SIDE; +import static org.oran.smo.teiv.utils.TeivConstants.PROPERTY_B_SIDE; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; import org.apache.commons.lang3.tuple.Pair; import org.jooq.Condition; @@ -42,7 +42,7 @@ import org.jooq.Table; import lombok.Builder; import lombok.Data; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.schema.RelationType; @@ -50,6 +50,7 @@ import org.oran.smo.teiv.schema.SchemaRegistry; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -74,7 +75,7 @@ public class InnerFilterCriteria { } public Set> getJoinCondition() { - Set> joins = new HashSet<>(); + Set> joins = new LinkedHashSet<>(); joins.addAll(scope.getJoinCondition()); return joins; @@ -116,7 +117,7 @@ public class InnerFilterCriteria { .bSideColumnName())).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable .getFullyQualifiedName(), PROPERTY_B_SIDE))), DataType.PRIMITIVE); } - default -> throw TiesException.unParsedTopologyObjectType(targetObject.getTopologyObject()); + default -> throw TeivException.unParsedTopologyObjectType(targetObject.getTopologyObject()); } select.put(field(idColumn).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable.getFullyQualifiedName(), @@ -144,7 +145,7 @@ public class InnerFilterCriteria { case SOURCE_IDS -> select.put(field(getTableNameWithColumnName(persistable.getTableName(), persistable .getSourceIdsColumnName()), JSONB.class).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable .getFullyQualifiedName(), SOURCE_IDS))), DataType.CONTAINER); - default -> throw TiesException.invalidContainerType(targetObject.getContainer().getValue()); + default -> throw TeivException.invalidContainerType(targetObject.getContainer().getValue()); } return Pair.of(field(idColumn).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable.getFullyQualifiedName(), @@ -159,7 +160,7 @@ public class InnerFilterCriteria { case RELATION -> { return table(SchemaRegistry.getRelationTypeByName(targetObject.getTopologyObject()).getTableName()); } - default -> throw TiesException.unParsedTopologyObjectType(targetObject.getTopologyObject()); + default -> throw TeivException.unParsedTopologyObjectType(targetObject.getTopologyObject()); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/LogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java similarity index 90% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/LogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java index e44e101..29465d4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/LogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Data; import org.apache.commons.lang3.tuple.Pair; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/OrLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/OrLogicalBlock.java similarity index 90% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/OrLogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/OrLogicalBlock.java index aff54c5..95f498a 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/OrLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/OrLogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.EqualsAndHashCode; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObject.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObject.java similarity index 91% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObject.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObject.java index 025e12d..b5ba36c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObject.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObject.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Data; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/QueryFunction.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/QueryFunction.java similarity index 80% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/QueryFunction.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/QueryFunction.java index f75ca0f..e5e7a34 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/QueryFunction.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/QueryFunction.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,14 +18,18 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Getter; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; @Getter public enum QueryFunction { EQ("="), + LESS_THAN("<"), + LESS_THAN_OR_EQ("<="), + GREATER_THAN(">"), + GREATER_THAN_OR_EQ(">="), CONTAINS("contains"), NOT_NULL("notNull"), WITHIN_METERS("withinMeters"), @@ -43,6 +47,6 @@ public enum QueryFunction { return queryFunction; } } - throw TiesPathException.grammarError("Unsupported operation: " + value); + throw TeivPathException.grammarError("Unsupported operation: " + value); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlock.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java similarity index 50% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlock.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java index 9620415..f0c1330 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlock.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,23 +28,25 @@ import org.apache.commons.lang3.tuple.Pair; import org.jooq.Condition; import org.jooq.Field; import org.jooq.Table; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.RelationshipDataLocation; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType.ASSOCIATION; import static org.oran.smo.teiv.utils.PersistableUtil.getTableNameWithColumnName; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Data @EqualsAndHashCode(callSuper = true) @@ -60,82 +62,134 @@ public class ScopeLogicalBlock extends LogicalBlock { @Override public Set
getTables() { Set
result = new HashSet<>(); - if (scopeObject.getContainer().equals(ContainerType.ASSOCIATION)) { + if (scopeObject.getTopologyObjectType() == TopologyObjectType.ASSOCIATION) { result.add(addAssociationToTable()); } else if (scopeObject.getTopologyObjectType() == TopologyObjectType.ENTITY) { result.add(addEntityToTable()); } else if (scopeObject.getTopologyObjectType() == TopologyObjectType.RELATION) { result.add(addRelationToTable()); } else if (scopeObject.getTopologyObjectType() == TopologyObjectType.UNDEFINED) { - throw TiesException.unknownTopologyObjectType(scopeObject.getTopologyObject()); + throw TeivException.unknownTopologyObjectType(scopeObject.getTopologyObject()); } return result; } + @SuppressWarnings({ "java:S1874" }) public Set> getJoinCondition() { - HashSet> joinCondition = new HashSet<>(); - if (scopeObject.getContainer().equals(ContainerType.ASSOCIATION) && scopeObject.getTopologyObjectType().equals( - TopologyObjectType.ENTITY)) { - EntityType entityType = SchemaRegistry.getEntityTypeByName(scopeObject.getTopologyObject()); - String association = scopeObject.getInnerContainer().get(0); + Set> joinCondition = new LinkedHashSet<>(); + String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/"); + if (scopeObject.getTopologyObjectType().equals(ASSOCIATION) && SchemaRegistry.getEntityTypeByName( + topologyObjectSplit[0]) != null) { + EntityType entityType = SchemaRegistry.getEntityTypeByName(topologyObjectSplit[0]); + String association = topologyObjectSplit[1]; List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName(association); RelationType relationType = relationTypes.stream().filter(relation -> relation.getASide().equals( - entityType) || relation.getBSide().equals(entityType)).findFirst().orElseThrow(() -> TiesPathException + entityType) || relation.getBSide().equals(entityType)).findFirst().orElseThrow(() -> TeivPathException .invalidAssociation(entityType.getName(), association)); - if (relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.RELATION)) { - String columnName = ""; - if (relationType.getASide().equals(entityType)) { - columnName = relationType.aSideColumnName(); - } else { - columnName = relationType.bSideColumnName(); - } + if (isManyToMany(relationType)) { + String columnName = getColumnNameForManyToManyJoin(entityType, relationType); String col1 = constructColumnNameForJoinCondition(relationType, columnName); String col2 = getTableNameWithColumnName(entityType.getTableName(), ID_COLUMN_NAME); - joinCondition.add(constructJoinConditionPair(relationType, col1, col2)); - } else if (!relationType.getStoringSideEntityType().getName().equals(scopeObject.getTopologyObject())) { + joinCondition.add(constructJoinConditionPair(relationType.getTableName(), col1, col2)); + + if (isSecondJoinNeeded()) { + joinCondition.add(getSecondJoinCondition(entityType, relationType)); + } + } else if (isJoinNeeded(topologyObjectSplit, relationType)) { String col1 = constructColumnNameForJoinCondition(relationType, relationType .getNotStoringSideEntityIdColumnNameInStoringSideTable()); String col2 = getTableNameWithColumnName(relationType.getNotStoringSideTableName(), ID_COLUMN_NAME); - joinCondition.add(constructJoinConditionPair(relationType, col1, col2)); + String tableName = getTableNameForJoin(topologyObjectSplit, relationType); + joinCondition.add(constructJoinConditionPair(tableName, col1, col2)); } } return joinCondition; } + private boolean isSecondJoinNeeded() { + return !scopeObject.getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals( + ContainerType.NOT_NULL); + } + + private static boolean isManyToMany(RelationType relationType) { + return relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.RELATION); + } + + private boolean isJoinNeeded(String[] topologyObjectSplit, RelationType relationType) { + return !relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0]) || (!scopeObject + .getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals(ContainerType.NOT_NULL)); + } + + private static String getTableNameForJoin(String[] topologyObjectSplit, RelationType relationType) { + if (relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0])) { + return relationType.getNotStoringSideTableName(); + } else { + return relationType.getTableName(); + } + } + + private static Pair getSecondJoinCondition(EntityType entityType, RelationType relationType) { + EntityType entityTypeForSecondJoin; + String columnNameForSecondJoin; + if (!relationType.getASide().equals(entityType)) { + columnNameForSecondJoin = relationType.aSideColumnName(); + entityTypeForSecondJoin = relationType.getASide(); + } else { + columnNameForSecondJoin = relationType.bSideColumnName(); + entityTypeForSecondJoin = relationType.getBSide(); + } + String col1ForSecondJoin = constructColumnNameForJoinCondition(relationType, columnNameForSecondJoin); + String col2ForSecondJoin = getTableNameWithColumnName(entityTypeForSecondJoin.getTableName(), ID_COLUMN_NAME); + return constructJoinConditionPair(entityTypeForSecondJoin.getTableName(), col1ForSecondJoin, col2ForSecondJoin); + } + + private static String getColumnNameForManyToManyJoin(EntityType entityType, RelationType relationType) { + if (relationType.getASide().equals(entityType)) { + return relationType.aSideColumnName(); + } else { + return relationType.bSideColumnName(); + } + } + private static String constructColumnNameForJoinCondition(RelationType relationType, String columnName) { return relationType.getTableName() + "." + String.format(QUOTED_STRING, columnName); } - private static Pair constructJoinConditionPair(RelationType relationType, String col1, String col2) { + private static Pair constructJoinConditionPair(String tableName, String col1, String col2) { Field equalsField = field(col1 + "=" + col2); - return new ImmutablePair<>(relationType.getTableName(), equalsField); + return new ImmutablePair<>(tableName, equalsField); } + @SuppressWarnings({ "java:S1874" }) private Table addEntityToTable() { return table(SchemaRegistry.getEntityTypeByName(scopeObject.getTopologyObject()).getTableName()); } + @SuppressWarnings({ "java:S1874" }) private Table addRelationToTable() { return table(SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()).getTableName()); } private Table addAssociationToTable() { - List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName(scopeObject - .getInnerContainer().get(0)); - if (scopeObject.getTopologyObjectType().equals(TopologyObjectType.ENTITY)) { + String[] topologyObjectArray = scopeObject.getTopologyObject().split("/"); + String topologyObject = topologyObjectArray[0]; + boolean isEntity = SchemaRegistry.getEntityNames().contains(topologyObject); + List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName(topologyObjectArray[1]); + if (isEntity) { for (RelationType relation : relationTypes) { - if (relation.getASide().getName().equals(scopeObject.getTopologyObject()) || relation.getBSide().getName() - .equals(scopeObject.getTopologyObject())) { + if (relation.getASide().getName().equals(topologyObject) || relation.getBSide().getName().equals( + topologyObject)) { return table(relation.getTableName()); } } } else { Optional relation = relationTypes.stream().filter(relationType -> relationType.getName().equals( - scopeObject.getTopologyObject())).findFirst(); + topologyObject)).findFirst(); if (relation.isPresent()) { return table(relation.get().getTableName()); } } - throw TiesException.invalidAssociationType(scopeObject.getInnerContainer().get(0)); + + throw TeivException.invalidAssociationType(scopeObject.getInnerContainer().get(0)); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeObject.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeObject.java similarity index 89% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeObject.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeObject.java index 52e0396..7f199c9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeObject.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeObject.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,10 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import lombok.Builder; -import org.oran.smo.teiv.exposure.tiespath.resolver.ResolverDataType; +import org.oran.smo.teiv.exposure.teivpath.resolver.ResolverDataType; import org.oran.smo.teiv.schema.DataType; import lombok.Data; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TargetObject.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TargetObject.java similarity index 92% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TargetObject.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TargetObject.java index d497592..eab342f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TargetObject.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TargetObject.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import java.util.List; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TopologyObjectType.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TopologyObjectType.java similarity index 87% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TopologyObjectType.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TopologyObjectType.java index 535be61..3597fd1 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/TopologyObjectType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/TopologyObjectType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,11 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; public enum TopologyObjectType { ENTITY, RELATION, + ASSOCIATION, UNDEFINED } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapper.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapper.java similarity index 93% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapper.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapper.java index 9537d50..b588262 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapper.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -31,7 +31,7 @@ import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; import jakarta.xml.bind.DatatypeConverter; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; @Slf4j @UtilityClass @@ -81,7 +81,7 @@ public class AliasMapper { return DatatypeConverter.printHexBinary(hashBytes).toUpperCase(Locale.US); } catch (NoSuchAlgorithmException exception) { log.warn("Not a valid algorithm", exception); - throw TiesException.serverException("Invalid Hashing algorithm", "Error while hashing alias", exception); + throw TeivException.serverException("Invalid Hashing algorithm", "Error while hashing alias", exception); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinement.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinement.java similarity index 65% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinement.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinement.java index 1e31205..ee99364 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinement.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,42 +18,41 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; import lombok.RequiredArgsConstructor; import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataValidator; import org.oran.smo.teiv.exposure.consumerdata.model.Classifiers; import org.oran.smo.teiv.exposure.consumerdata.model.Decorators; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndOrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.EmptyLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; - -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.InnerFilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.LogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeObject; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TopologyObjectType; -import org.oran.smo.teiv.exposure.tiespath.resolver.ResolverDataType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndOrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.EmptyLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; + +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.InnerFilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.LogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType; +import org.oran.smo.teiv.exposure.teivpath.resolver.ResolverDataType; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.Reliability; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -66,15 +65,21 @@ import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType.ATTRIBUTES; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType.ID; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType.NOT_NULL; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP; +import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType.ASSOCIATION; import static org.oran.smo.teiv.schema.DataType.BIGINT; import static org.oran.smo.teiv.schema.DataType.DECIMAL; import static org.oran.smo.teiv.schema.DataType.INTEGER; import static org.oran.smo.teiv.schema.DataType.PRIMITIVE; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.ITEM; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.ITEM; +import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; -@Component @Slf4j +@Component @RequiredArgsConstructor public class BasePathRefinement { private final ConsumerDataValidator consumerDataValidator; @@ -86,7 +91,13 @@ public class BasePathRefinement { * the filter criteria */ public void refine(FilterCriteria filterCriteria) { + filterCriteria.getFilterCriteriaList().forEach(innerFilterCriteria -> runOnTree(innerFilterCriteria.getScope(), + filterCriteria.getDomain(), this::handleAssociationsInScope)); processTopologyObjectsWithContainerTypeNull(filterCriteria); + if (filterCriteria.getResolvingTopologyObjectType().equals(RELATIONSHIP)) { + filterCriteria.getFilterCriteriaList().forEach(innerFilterCriteria -> runOnTree(innerFilterCriteria.getScope(), + filterCriteria.getDomain(), this::restrictQueriesOnAssociationOfRelationIfNotId)); + } filterCriteria.getFilterCriteriaList().forEach(innerFilterCriteria -> resolveWildCardObjectsInScopeAndTarget( innerFilterCriteria, filterCriteria.getDomain(), filterCriteria.getResolvingTopologyObjectType())); resolveUndefinedTopologyObjectTypes(filterCriteria); @@ -96,9 +107,42 @@ public class BasePathRefinement { innerFilterCriteria, filterCriteria.getDomain())); splitFilterCriteria(filterCriteria); validateQuery(filterCriteria); + matchTopologyObjectTypeWithResolvingTopologyObjectType(filterCriteria); applyRelationshipCriteria(filterCriteria); } + public void handleAssociationsInScope(ScopeLogicalBlock slb, String domain) { + String topologyObject = slb.getScopeObject().getTopologyObject(); + String[] topologyObjectSplit = topologyObject.split("/"); + if (topologyObjectSplit.length == 2) { + if ((SchemaRegistry.getEntityNamesByDomain(domain).contains(topologyObjectSplit[0]) && SchemaRegistry + .getAssociationNamesByEntityName(topologyObjectSplit[0]).contains( + topologyObjectSplit[1])) || SchemaRegistry.getAllRelationNamesByAssociationName( + topologyObjectSplit[1]).stream().anyMatch(rel -> rel.getName().equals( + topologyObjectSplit[0]))) { + slb.getScopeObject().setTopologyObjectType(ASSOCIATION); + } else if (topologyObjectSplit[0].equals(WILDCARD)) { + if (SchemaRegistry.getEntityNamesByDomain(domain).stream().anyMatch(entityName -> SchemaRegistry + .getAssociationNamesByEntityName(entityName).contains(topologyObjectSplit[1]))) { + slb.getScopeObject().setTopologyObjectType(ASSOCIATION); + } else { + slb.getScopeObject().setTopologyObject(topologyObjectSplit[1]); + } + } else { + throw TeivPathException.grammarError(String.format("Invalid parameter name (%s) after %s", + topologyObjectSplit[1], topologyObjectSplit[0])); + } + } + } + + public void restrictQueriesOnAssociationOfRelationIfNotId(ScopeLogicalBlock slb, String domain) { + if (slb.getScopeObject().getTopologyObjectType().equals(ASSOCIATION) && (!ID.equals(slb.getScopeObject() + .getContainer()) && !NOT_NULL.equals(slb.getScopeObject().getContainer()))) { + throw TeivPathException.grammarError( + "Querying any thing other than id is not supported in case of association of relation"); + } + } + /** * Process topology objects with container type null. * If scopeResolver can not differentiate ASSOCIATION from ENTITY and RELATION, @@ -114,62 +158,24 @@ public class BasePathRefinement { private void setContainerTypesAndTopologyObjects(ScopeLogicalBlock slb, String domain) { if (slb.getScopeObject().getContainer() == null) { - if (slb.getScopeObject().getInnerContainer().isEmpty()) { - throw TiesPathException.grammarError("invalid scopeFilter"); - } - boolean isResolved = false; - if (SchemaRegistry.getEntityNames().stream().anyMatch(entityName -> SchemaRegistry - .getAssociationNamesByEntityName(entityName).contains(slb.getScopeObject().getInnerContainer().get( - 0))) || !SchemaRegistry.getAllRelationNamesByAssociationName(slb.getScopeObject() - .getInnerContainer().get(0)).isEmpty()) { - setContainerTypeForScopeLogicalBlocksScopeObject(slb, ContainerType.ASSOCIATION); - isResolved = true; - } - if (SchemaRegistry.getRelationNames().contains(slb.getScopeObject().getInnerContainer().get(0))) { - checkIfAlreadyResolved(slb.getScopeObject().getInnerContainer().get(0), isResolved); - setContainerTypeForScopeLogicalBlocksScopeObject(slb, ContainerType.RELATION); - isResolved = true; - } - isResolved = entityTopologyObjectSettings(slb, isResolved); - if (!isResolved) { - throw TiesPathException.invalidInnerContainer(slb.getScopeObject().getInnerContainer().get(0)); - } - } else if (slb.getScopeObject().getContainer().equals(ContainerType.ATTRIBUTES) && !slb.getScopeObject() - .getInnerContainer().isEmpty() && slb.getScopeObject().getTopologyObject() == null) { - slb.getScopeObject().setTopologyObject("*"); - } - } - - private void setContainerTypeForScopeLogicalBlocksScopeObject(ScopeLogicalBlock slb, ContainerType containerType) { - slb.getScopeObject().setContainer(containerType); - if (slb.getScopeObject().getTopologyObject() == null) { - slb.getScopeObject().setTopologyObject("*"); - } - } - - private boolean entityTopologyObjectSettings(ScopeLogicalBlock slb, boolean isResolved) { - if (SchemaRegistry.getEntityNames().contains(slb.getScopeObject().getInnerContainer().get(0))) { - checkIfAlreadyResolved(slb.getScopeObject().getInnerContainer().get(0), isResolved); - if (slb.getScopeObject().getLeaf().equals(ID_COLUMN_NAME)) { - slb.getScopeObject().setContainer(ContainerType.ID); - slb.getScopeObject().setLeaf(null); - } else { - throw TiesPathException.grammarError("invalid scopeFilter, missing containerType"); - } - if (slb.getScopeObject().getTopologyObject() == null) { - slb.getScopeObject().setTopologyObject(slb.getScopeObject().getInnerContainer().get(0)); - slb.getScopeObject().getInnerContainer().remove(0); + if (slb.getScopeObject().getLeaf() != null) { + if (slb.getScopeObject().getLeaf().equals("id")) { + slb.getScopeObject().setContainer(ID); + slb.getScopeObject().setLeaf(null); + } else { + throw TeivPathException.grammarError(String.format("Missing container type for queried leaf %s", slb + .getScopeObject().getLeaf())); + } } else { - throw TiesPathException.grammarError("invalid ScopeFilter"); + if (slb.getScopeObject().getTopologyObjectType().equals(ASSOCIATION)) { + slb.getScopeObject().setContainer(NOT_NULL); + } else { + throw TeivPathException.invalidDataInScopeFilter(slb.getScopeObject().getTopologyObject()); + } } - isResolved = true; - } - return isResolved; - } - - private void checkIfAlreadyResolved(String innerContainer, boolean isResolved) { - if (isResolved) { - throw TiesPathException.ambiguousTopologyObject(innerContainer); + } else if (slb.getScopeObject().getContainer().equals(ATTRIBUTES) && !slb.getScopeObject().getInnerContainer() + .isEmpty() && slb.getScopeObject().getTopologyObject() == null) { + slb.getScopeObject().setTopologyObject(WILDCARD); } } @@ -183,23 +189,19 @@ public class BasePathRefinement { Set uniqueTopologyObjects = new HashSet<>(); targetObjects.stream().filter(targetObject -> targetObject.getContainer().equals(containerType)).forEach( targetObject -> uniqueTopologyObjects.add(targetObject.getTopologyObject())); - for (String topologyObject : uniqueTopologyObjects) { final Set unifiedParams = new HashSet<>(); - boolean isAllParamQueried = containerType == ContainerType.ATTRIBUTES && targetObjects.stream().anyMatch( + boolean isAllParamQueried = containerType == ATTRIBUTES && targetObjects.stream().anyMatch( targetObject -> targetObject.getTopologyObject().equals(topologyObject) && (targetObject.getParams() .isEmpty() || targetObject.isAllParamQueried()) && targetObject.getContainer().equals( containerType)); - targetObjects.stream().filter(targetObject -> targetObject.getTopologyObject().equals( topologyObject) && targetObject.getContainer().equals(containerType)).forEach( targetObject -> unifiedParams.addAll(targetObject.getParams())); - targetObjects.removeIf(targetObject -> targetObject.getTopologyObject().equals(topologyObject) && targetObject .getContainer().equals(containerType)); TargetObject unifiedTarget = TargetObject.builder(topologyObject).container(containerType).params(unifiedParams .stream().toList()).isAllParamQueried(isAllParamQueried).build(); - targetObjects.add(unifiedTarget); } } @@ -213,51 +215,50 @@ public class BasePathRefinement { public void resolveWildCardObjectsInScopeAndTarget(InnerFilterCriteria filterCriteria, String domain, FilterCriteria.ResolvingTopologyObjectType resolvingTopologyObjectType) { if (filterCriteria.getTargets() == null || filterCriteria.getTargets().isEmpty()) { - filterCriteria.setTargets(List.of(TargetObject.builder("*").container(ContainerType.ID).build())); + filterCriteria.setTargets(List.of(TargetObject.builder("*").container(ID).build())); } - // merge targets Arrays.stream(ContainerType.values()).toList().forEach(containerType -> unifyDuplicatedTargetsByContainerType( filterCriteria.getTargets(), containerType)); - // calculate situation final List wildCardsInScope = new ArrayList<>(); final List nonWildCardsInScope = new ArrayList<>(); runOnTree(filterCriteria.getScope(), domain, (lb, s) -> { - if (lb.getScopeObject().getTopologyObject().equals("*")) { + if (lb.getScopeObject().getTopologyObject().split("/")[0].equals("*")) { wildCardsInScope.add(lb); } else { nonWildCardsInScope.add(lb); } }); - boolean wildCardInTarget = filterCriteria.getTargets().stream().anyMatch(t -> t.getTopologyObject().equals("*")); boolean wildCardInScope = (filterCriteria.getScope() instanceof EmptyLogicalBlock) || !wildCardsInScope.isEmpty(); boolean isAllParamRequired = filterCriteria.getTargets().stream().anyMatch(t -> t.getTopologyObject().equals( - "*") && t.getContainer().equals(ContainerType.ATTRIBUTES) && t.isAllParamQueried()); - + "*") && t.getContainer().equals(ATTRIBUTES) && t.isAllParamQueried()); // skip when nothing to do if ((!wildCardInScope || filterCriteria.getScope() instanceof EmptyLogicalBlock) && !wildCardInTarget) { return; } - List possibleTypes = listPossibleTypes(filterCriteria, domain, nonWildCardsInScope, wildCardInTarget, wildCardInScope, resolvingTopologyObjectType); - filterPossibleTypesInTarget(filterCriteria, possibleTypes); - filterPossibleTypesInScope(wildCardsInScope, possibleTypes); - + switch (resolvingTopologyObjectType) { + case ENTITY: + filterPossibleTypesInScopeForEntities(wildCardsInScope, possibleTypes); + break; + case RELATIONSHIP: + filterPossibleTypesInScopeForRelations(wildCardsInScope, possibleTypes); + break; + default: + break; + } // check if (possibleTypes.isEmpty()) { - throw TiesPathException.notMatchingScopeAndTargetFilter(); + throw TeivPathException.notMatchingScopeAndTargetFilter(); } - resolveTargets(filterCriteria, isAllParamRequired, possibleTypes); - // merge targets Arrays.stream(ContainerType.values()).toList().forEach(containerType -> unifyDuplicatedTargetsByContainerType( filterCriteria.getTargets(), containerType)); - //resolve scope List resolvedTrees = new ArrayList<>(); if (!(filterCriteria.getScope() instanceof EmptyLogicalBlock) && wildCardInScope) { @@ -265,10 +266,10 @@ public class BasePathRefinement { } else { return; } - rebuildBinaryTree(filterCriteria, resolvedTrees); } + @SuppressWarnings({ "java:S1874" }) private List listPossibleTypes(InnerFilterCriteria filterCriteria, String domain, List nonWildCardsInScope, boolean wildCardInTarget, boolean wildCardInScope, FilterCriteria.ResolvingTopologyObjectType resolvingTopologyObjectType) { @@ -285,13 +286,13 @@ public class BasePathRefinement { } else if (!wildCardInScope) { if (resolvingTopologyObjectType.isResolveEntities()) { result.addAll(nonWildCardsInScope.stream().map(ScopeLogicalBlock::getScopeObject).map( - ScopeObject::getTopologyObject).map(SchemaRegistry::getEntityTypeByName).filter(Objects::nonNull) - .toList()); + scopeObject -> scopeObject.getTopologyObject().split("/")[0]).map( + SchemaRegistry::getEntityTypeByName).filter(Objects::nonNull).toList()); } if (resolvingTopologyObjectType.isResolveRelationships()) { result.addAll(nonWildCardsInScope.stream().map(ScopeLogicalBlock::getScopeObject).map( - ScopeObject::getTopologyObject).map(SchemaRegistry::getRelationTypeByName).filter(Objects::nonNull) - .toList()); + scopeObject -> scopeObject.getTopologyObject().split("/")[0]).map( + SchemaRegistry::getRelationTypeByName).filter(Objects::nonNull).toList()); } } else { if (resolvingTopologyObjectType.isResolveEntities()) { @@ -307,7 +308,7 @@ public class BasePathRefinement { private void filterPossibleTypesInTarget(InnerFilterCriteria filterCriteria, List possibleTypes) { for (TargetObject targetObject : filterCriteria.getTargets().stream().filter(t -> t.getTopologyObject().equals("*")) .toList()) { - if (targetObject.getContainer().equals(ContainerType.ATTRIBUTES)) { + if (targetObject.getContainer().equals(ATTRIBUTES)) { for (String parameter : targetObject.getParams()) { possibleTypes.removeIf(t -> !t.getAttributeNames().contains(parameter)); } @@ -315,7 +316,25 @@ public class BasePathRefinement { } } - private void filterPossibleTypesInScope(List wildCardsInScope, List possibleTypes) { + private void filterPossibleTypesInScopeForEntities(List wildCardsInScope, + List possibleTypes) { + for (ScopeObject scopeObject : wildCardsInScope.stream().map(ScopeLogicalBlock::getScopeObject).toList()) { + if (scopeObject.getTopologyObjectType().equals(ASSOCIATION)) { + possibleTypes.removeIf(t -> SchemaRegistry.getAllEntityForAssociation(scopeObject.getTopologyObject().split( + "/")[1]).stream().noneMatch(r -> r.getName().equals(t.getName()))); + } + if (ATTRIBUTES.equals(scopeObject.getContainer()) && !scopeObject.getTopologyObjectType().equals(ASSOCIATION)) { + if (!scopeObject.getInnerContainer().isEmpty()) { + possibleTypes.removeIf(t -> !t.getAttributeNames().contains(scopeObject.getInnerContainer().get(0))); + } else { + possibleTypes.removeIf(t -> !t.getAttributeNames().contains(scopeObject.getLeaf())); + } + } + } + } + + private void filterPossibleTypesInScopeForRelations(List wildCardsInScope, + List possibleTypes) { for (ScopeObject scopeObject : wildCardsInScope.stream().map(ScopeLogicalBlock::getScopeObject).toList()) { if (scopeObject.getContainer().equals(ContainerType.ATTRIBUTES)) { if (!scopeObject.getInnerContainer().isEmpty()) { @@ -324,21 +343,23 @@ public class BasePathRefinement { possibleTypes.removeIf(t -> !t.getAttributeNames().contains(scopeObject.getLeaf())); } } - if (scopeObject.getContainer().equals(ContainerType.ASSOCIATION)) { + if (scopeObject.getTopologyObjectType().equals(TopologyObjectType.ASSOCIATION)) { filterPossibleTypesInScopeByAssociations(possibleTypes, scopeObject); } } } + @SuppressWarnings({ "java:S1874" }) private void filterPossibleTypesInScopeByAssociations(List possibleTypes, ScopeObject scopeObject) { - String innerContainer = scopeObject.getInnerContainer().get(0); + String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/"); List entityTypesCopy = new ArrayList<>(possibleTypes); for (Persistable t : entityTypesCopy) { if ((t instanceof RelationType && !(SchemaRegistry.getRelationTypeByName(t.getName()).getASideAssociation() - .getName().equals(innerContainer) || SchemaRegistry.getRelationTypeByName(t.getName()) + .getName().equals(topologyObjectSplit[1]) || SchemaRegistry.getRelationTypeByName(t.getName()) .getBSideAssociation().getName().equals( - innerContainer))) || (t instanceof EntityType && !SchemaRegistry - .getAssociationNamesByEntityName(t.getName()).contains(innerContainer))) { + topologyObjectSplit[1]))) || (t instanceof EntityType && !SchemaRegistry + .getAssociationNamesByEntityName(t.getName()).contains( + topologyObjectSplit[1]))) { possibleTypes.remove(t); } } @@ -374,11 +395,41 @@ public class BasePathRefinement { return lb; } if (logicalBlock instanceof ScopeLogicalBlock scopeLogicalBlock) { - ScopeObject scopeObject = ScopeObject.builder((topologyObject == null || !scopeLogicalBlock.getScopeObject() - .getTopologyObject().equals("*")) ? + ScopeObject scopeObject = buildScopeObject(topologyObject, scopeLogicalBlock); + if (scopeObject.getLeaf() != null && scopeObject.getLeaf().equals(ID_COLUMN_NAME) && scopeObject.getContainer() + .equals(ID)) { + scopeObject.setLeaf(null); + } + ScopeLogicalBlock lb = new ScopeLogicalBlock(scopeObject); + lb.setValid(logicalBlock.isValid()); + return lb; + } + return EmptyLogicalBlock.getInstance(); + } + + private static ScopeObject buildScopeObject(String topologyObject, ScopeLogicalBlock scopeLogicalBlock) { + if (scopeLogicalBlock.getScopeObject().getTopologyObjectType().equals(ASSOCIATION)) { + return ScopeObject.builder((topologyObject == null || !scopeLogicalBlock.getScopeObject().getTopologyObject() + .split("/")[0].equals("*")) ? scopeLogicalBlock.getScopeObject().getTopologyObject() : - topologyObject).topologyObjectType((topologyObject == null || !scopeLogicalBlock - .getScopeObject().getTopologyObject().equals("*")) ? + String.format("%s/%s", topologyObject, scopeLogicalBlock.getScopeObject().getTopologyObject() + .split("/")[1])).topologyObjectType(ASSOCIATION).container(scopeLogicalBlock + .getScopeObject().getContainer()).innerContainer(scopeLogicalBlock + .getScopeObject().getInnerContainer()).leaf(scopeLogicalBlock + .getScopeObject().getLeaf()).queryFunction(scopeLogicalBlock + .getScopeObject().getQueryFunction()).parameter( + scopeLogicalBlock.getScopeObject() + .getParameter()).dataType( + scopeLogicalBlock + .getScopeObject() + .getDataType()) + .resolverDataType(scopeLogicalBlock.getScopeObject().getResolverDataType()).build(); + } else { + return ScopeObject.builder((topologyObject == null || !scopeLogicalBlock.getScopeObject().getTopologyObject() + .split("/")[0].equals("*")) ? + scopeLogicalBlock.getScopeObject().getTopologyObject().split("/")[0] : + topologyObject.split("/")[0]).topologyObjectType((topologyObject == null || !scopeLogicalBlock + .getScopeObject().getTopologyObject().split("/")[0].equals("*")) ? scopeLogicalBlock.getScopeObject().getTopologyObjectType() : TopologyObjectType.UNDEFINED).container(scopeLogicalBlock.getScopeObject() .getContainer()).innerContainer(scopeLogicalBlock.getScopeObject() @@ -391,17 +442,7 @@ public class BasePathRefinement { .getScopeObject() .getDataType()) .resolverDataType(scopeLogicalBlock.getScopeObject().getResolverDataType()).build(); - - if (scopeObject.getLeaf() != null && scopeObject.getLeaf().equals(ID_COLUMN_NAME) && scopeObject.getContainer() - .equals(ContainerType.ID)) { - scopeObject.setLeaf(null); - } - - ScopeLogicalBlock lb = new ScopeLogicalBlock(scopeObject); - lb.setValid(logicalBlock.isValid()); - return lb; } - return EmptyLogicalBlock.getInstance(); } private void rebuildBinaryTree(InnerFilterCriteria filterCriteria, List resolvedTrees) { @@ -412,7 +453,6 @@ public class BasePathRefinement { lb.getChildren().add(resolvedTrees.get(i)); subTree = lb; } - filterCriteria.setScope(subTree); } @@ -442,22 +482,21 @@ public class BasePathRefinement { private void defineTopologyObjectTypeInScope(ScopeLogicalBlock scopeLogicalBlock, String domain) { if (scopeLogicalBlock.getScopeObject().getTopologyObjectType().equals(TopologyObjectType.UNDEFINED)) { boolean isResolved = false; - if (SchemaRegistry.getEntityNamesByDomain(domain).contains(scopeLogicalBlock.getScopeObject() - .getTopologyObject())) { + String topologyObject = scopeLogicalBlock.getScopeObject().getTopologyObject().split("/")[0]; + if (SchemaRegistry.getEntityNamesByDomain(domain).contains(topologyObject)) { scopeLogicalBlock.getScopeObject().setTopologyObjectType(TopologyObjectType.ENTITY); isResolved = true; } - if (SchemaRegistry.getRelationNamesByDomain(domain).contains(scopeLogicalBlock.getScopeObject() - .getTopologyObject())) { + if (SchemaRegistry.getRelationNamesByDomain(domain).contains(topologyObject)) { if (!isResolved) { scopeLogicalBlock.getScopeObject().setTopologyObjectType(TopologyObjectType.RELATION); isResolved = true; } else { - throw TiesPathException.ambiguousTopologyObject(scopeLogicalBlock.getScopeObject().getTopologyObject()); + throw TeivPathException.ambiguousTopologyObject(topologyObject); } } if (!isResolved) { - throw TiesPathException.invalidTopologyObject(scopeLogicalBlock.getScopeObject().getTopologyObject()); + throw TeivPathException.invalidTopologyObject(topologyObject); } } } @@ -473,11 +512,11 @@ public class BasePathRefinement { targetObject.setTopologyObjectType(TopologyObjectType.RELATION); isResolved = true; } else { - throw TiesPathException.ambiguousTopologyObject(targetObject.getTopologyObject()); + throw TeivPathException.ambiguousTopologyObject(targetObject.getTopologyObject()); } } if (!isResolved) { - throw TiesPathException.invalidTopologyObject(targetObject.getTopologyObject()); + throw TeivPathException.invalidTopologyObject(targetObject.getTopologyObject()); } } @@ -500,9 +539,11 @@ public class BasePathRefinement { private void validateScope(LogicalBlock logicalBlock, String domain) { ScopeObject scopeObject = ((ScopeLogicalBlock) logicalBlock).getScopeObject(); - validateContainerWithMatchingParameters(scopeObject.getContainer(), new ArrayList<>(Collections.singletonList( - scopeObject.getLeaf())), scopeObject.getTopologyObject(), scopeObject.getTopologyObjectType(), scopeObject - .getInnerContainer()); + if (scopeObject.getContainer() != null) { + validateContainerWithMatchingParameters(scopeObject.getContainer(), new ArrayList<>(Collections.singletonList( + scopeObject.getLeaf())), scopeObject.getTopologyObject(), scopeObject.getTopologyObjectType(), + scopeObject.getInnerContainer()); + } } private void validateContainerWithMatchingParameters(ContainerType containerType, List params, @@ -510,7 +551,7 @@ public class BasePathRefinement { switch (containerType) { case ID: if (!params.isEmpty() && !(params.size() == 1 && params.contains(null))) { - throw TiesPathException.grammarError("Adding parameters for id container is not supported"); + throw TeivPathException.grammarError("Adding parameters for id container is not supported"); } break; case ATTRIBUTES: @@ -523,56 +564,59 @@ public class BasePathRefinement { case SOURCE_IDS, CLASSIFIERS: checkSourceIdTopologyObject(params, topologyObject); break; - case ASSOCIATION: - checkAssociationTopologyObject(params, topologyObject, topologyObjectType, innerContainer); - break; default: break; } } - private void checkAssociationTopologyObject(List params, String topologyObject, - TopologyObjectType topologyObjectType, List innerContainer) { - if (innerContainer.isEmpty()) { - throw TiesPathException.grammarError("Missing association name"); + @SuppressWarnings({ "java:S1874" }) + private void checkAssociationTopologyObject(List params, String topologyObject) { + if (topologyObject.split("/").length < 2) { + throw TeivPathException.grammarError("Missing association name"); } + String[] topologyObjectArray = topologyObject.split("/"); + String realTopologyObject = topologyObjectArray[0]; + String association = topologyObjectArray[1]; RelationType relation; - switch (topologyObjectType) { - case ENTITY -> relation = SchemaRegistry.getRelationTypes().stream().filter(relationType -> (relationType - .getASide().getName().equals(topologyObject) && relationType.getASideAssociation().getName().equals( - innerContainer.get(0))) || (relationType.getBSide().getName().equals( - topologyObject) && relationType.getBSideAssociation().getName().equals(innerContainer - .get(0)))).findFirst().orElseThrow(() -> TiesPathException.invalidAssociation( - topologyObject, innerContainer.get(0))); - case RELATION -> { - relation = SchemaRegistry.getRelationTypeByName(topologyObject); - if (!relation.getASideAssociation().getName().equals(innerContainer.get(0)) && !relation - .getBSideAssociation().getName().equals(innerContainer.get(0))) { - throw TiesPathException.invalidAssociation(topologyObject, innerContainer.get(0)); - } + // Case Entity + if (SchemaRegistry.getEntityNames().contains(realTopologyObject)) { + relation = SchemaRegistry.getRelationTypes().stream().filter(relationType -> (relationType.getASide().getName() + .equals(realTopologyObject) && relationType.getASideAssociation().getName().equals( + association)) || (relationType.getBSide().getName().equals(realTopologyObject) && relationType + .getBSideAssociation().getName().equals(association))).findFirst().orElseThrow( + () -> TeivPathException.invalidAssociation(realTopologyObject, association)); + } + // Case Relation + else if (SchemaRegistry.getRelationNames().contains(realTopologyObject)) { + relation = SchemaRegistry.getRelationTypeByName(realTopologyObject); + if (!relation.getASideAssociation().getName().equals(association) && !relation.getBSideAssociation().getName() + .equals(association)) { + throw TeivPathException.invalidAssociation(realTopologyObject, association); } - default -> throw TiesPathException.containerValidationWithUndefinedTopologyObjectType(topologyObject); + } else { + throw TeivPathException.invalidTopologyObject(realTopologyObject); } if (!params.isEmpty() && params.get(0) != null) { - checkParamsForAssociation(relation, innerContainer.get(0), params); + checkParamsForAssociation(relation, association, params); } } private void checkParamsForAssociation(RelationType relationType, String associationName, List params) { if ((relationType.getASideAssociation().getName().equals(associationName) && !params.stream().allMatch( - param -> relationType.getBSide().getFields().containsKey(param))) || (relationType.getBSideAssociation() - .getName().equals(associationName) && !params.stream().allMatch(param -> relationType.getASide() - .getFields().containsKey(param)))) { - throw TiesPathException.invalidParamsForAssociation(associationName); + param -> relationType.getBSide().getAttributeNames().contains(param))) || (relationType + .getBSideAssociation().getName().equals(associationName) && !params.stream().allMatch( + param -> relationType.getASide().getAttributeNames().contains(param)))) { + throw TeivPathException.invalidParamsForAssociation(associationName); } } private void checkSourceIdTopologyObject(List params, String topologyObject) { if (params.stream().anyMatch(param -> !param.equals(ITEM))) { - throw TiesPathException.sourceIdNameError(topologyObject); + throw TeivPathException.sourceIdNameError(topologyObject); } } + @SuppressWarnings({ "java:S1874" }) private void checkAttributesOfTopologyObject(List params, String topologyObject, TopologyObjectType topologyObjectType) { switch (topologyObjectType) { @@ -581,17 +625,19 @@ public class BasePathRefinement { List notMatchingParams = params.stream().filter(a -> !entityType.getAttributeNames().contains(a)) .toList(); if (!notMatchingParams.isEmpty()) { - throw TiesPathException.columnNamesError(topologyObject, notMatchingParams); + throw TeivPathException.columnNamesError(topologyObject, notMatchingParams); } } case RELATION -> { - RelationType relationType = SchemaRegistry.getRelationTypeByName(topologyObject); - List notMatchingParams2 = params.stream().filter(a -> !relationType.getAttributeNames().contains(a)) + RelationType relation = SchemaRegistry.getRelationTypeByName(topologyObject); + List notMatchingParams2 = params.stream().filter(a -> !relation.getAttributeNames().contains(a)) .toList(); if (!notMatchingParams2.isEmpty()) { - throw TiesPathException.columnNamesError(topologyObject, notMatchingParams2); + throw TeivPathException.columnNamesError(topologyObject, notMatchingParams2); } } + case ASSOCIATION -> checkAssociationTopologyObject(params, topologyObject); + default -> throw TeivPathException.grammarError(String.format("Undefined topologyObject: %s", topologyObject)); } } @@ -610,55 +656,68 @@ public class BasePathRefinement { } private void validateParameterOfScopeObject(ScopeLogicalBlock scopeLogicalBlock, String domain) { - ScopeObject so = scopeLogicalBlock.getScopeObject(); - switch (so.getContainer()) { - case ATTRIBUTES: - validateAttributesParameter(so); - break; - case ID: - validateIdParameter(so); - break; - case ASSOCIATION, RELATION: - validateAssociationAndRelationParameter(so); - break; - case SOURCE_IDS: - validateSourceIdsParameter(so); - break; - case CLASSIFIERS: - validateClassifiersParameter(so); - break; - case DECORATORS: - validateDecoratorsParameter(so); - break; - case METADATA: - validateMetadataParameter(so); - break; - default: - break; - } - } - + if (scopeLogicalBlock.getScopeObject().getContainer() != null) { + ScopeObject so = scopeLogicalBlock.getScopeObject(); + switch (so.getContainer()) { + case ATTRIBUTES: + validateAttributesParameter(so); + break; + case ID: + validateIdParameter(so); + break; + case RELATION: + validateAssociationAndRelationParameter(so); + break; + case SOURCE_IDS: + validateSourceIdsParameter(so); + break; + case CLASSIFIERS: + validateClassifiersParameter(so); + break; + case DECORATORS: + validateDecoratorsParameter(so); + break; + case METADATA: + validateMetadataParameter(so); + break; + default: + break; + } + } + } + + @SuppressWarnings({ "java:S1874" }) private void validateAttributesParameter(final ScopeObject so) { - if (so.getInnerContainer().isEmpty()) { - so.setDataType(SchemaRegistry.getEntityTypeByName(so.getTopologyObject()).getFields().get(so.getLeaf())); - compareResolverDataTypeToDataType(so); + String[] topologyObject = so.getTopologyObject().split("/"); + if (topologyObject.length > 1) { + if (so.getInnerContainer().isEmpty()) { + so.setDataType(SchemaRegistry.getAssociationSideEntity(topologyObject[1]).getFields().get(so.getLeaf())); + compareResolverDataTypeToDataType(so); + } else { + setDataTypeForComplexAttribute(so); + } } else { - setDataTypeForComplexAttribute(so); + if (so.getInnerContainer().isEmpty()) { + so.setDataType(SchemaRegistry.getEntityTypeByName(topologyObject[0]).getFields().get(so.getLeaf())); + compareResolverDataTypeToDataType(so); + } else { + setDataTypeForComplexAttribute(so); + } } } private void validateIdParameter(final ScopeObject so) { if (so.getResolverDataType().equals(ResolverDataType.INTEGER)) { - throw TiesPathException.grammarError("Data is given in invalid datatype in scopeFilter"); + throw TeivPathException.grammarError("Data is given in invalid datatype in scopeFilter"); } so.setDataType(DataType.PRIMITIVE); } private void validateAssociationAndRelationParameter(final ScopeObject so) { if (so.getLeaf() != null && !ID_COLUMN_NAME.equals(so.getLeaf())) { - throw TiesPathException.grammarError("Only id condition can be queried in case of association container"); + throw TeivPathException.grammarError("Only id condition can be queried in case of association container"); } else if (so.getResolverDataType().equals(ResolverDataType.INTEGER)) { - throw TiesPathException.grammarError("Invalid data type provided for scopeFilter"); + throw TeivPathException.invalidDataType(); } else if (so.getResolverDataType().equals(ResolverDataType.STRING)) { so.setDataType(DataType.PRIMITIVE); } @@ -666,27 +725,34 @@ public class BasePathRefinement { private void validateSourceIdsParameter(final ScopeObject so) { if (so.getResolverDataType().equals(ResolverDataType.INTEGER)) { - throw TiesPathException.grammarError("Invalid data type provided for scopeFilter"); + throw TeivPathException.invalidDataType(); } so.setDataType(DataType.PRIMITIVE); } private void validateMetadataParameter(final ScopeObject so) { - if (so.getLeaf() != null && so.getLeaf().equals("reliabilityIndicator")) { + final List validMetadataParameters = List.of("lastModified", "firstDiscovered", "reliabilityIndicator"); + if (so.getLeaf() != null && validMetadataParameters.contains(so.getLeaf())) { if (so.getResolverDataType().equals(ResolverDataType.STRING)) { - validateReliabilityIndicator(so.getParameter()); + if (so.getLeaf().equals("reliabilityIndicator")) { + validateReliabilityIndicator(so.getParameter()); + } } else { - throw TiesPathException.grammarError("Invalid data type provided for scopeFilter"); + throw TeivPathException.grammarError("Invalid data type provided for scopeFilter"); } } else { - throw TiesPathException.invalidMetadaFilter(so.getLeaf()); + throw TeivPathException.invalidMetadaFilter(so.getLeaf()); + } + if (so.getLeaf().equals("lastModified") || so.getLeaf().equals("firstDiscovered")) { + so.setDataType(DataType.TIMESTAMPTZ); + } else { + so.setDataType(DataType.PRIMITIVE); } - so.setDataType(DataType.PRIMITIVE); } private void validateClassifiersParameter(final ScopeObject so) { if (so.getResolverDataType().equals(ResolverDataType.INTEGER)) { - throw TiesPathException.grammarError("Invalid data type provided for scopeFilter"); + throw TeivPathException.grammarError("Invalid data type provided for scopeFilter"); } so.setDataType(DataType.PRIMITIVE); Classifiers classifier = Classifiers.builder().data(List.of(so.getParameter())).build(); @@ -719,7 +785,7 @@ public class BasePathRefinement { if ((scopeObject.getResolverDataType().equals(ResolverDataType.INTEGER) && !numericDataTypes.contains(scopeObject .getDataType())) || (scopeObject.getResolverDataType().equals(ResolverDataType.STRING) && numericDataTypes .contains(scopeObject.getDataType()))) { - throw TiesPathException.grammarError("Data is given in invalid datatype in scopeFilter"); + throw TeivPathException.grammarError("Data is given in invalid datatype in scopeFilter"); } } @@ -734,21 +800,18 @@ public class BasePathRefinement { if (filterCriteria.getScope() instanceof EmptyLogicalBlock || filterCriteria.getTargets().isEmpty()) { return; } - Set scopeTopologyObjects = new HashSet<>(); runOnTree(filterCriteria.getScope(), domain, (ScopeLogicalBlock lb, String dom) -> scopeTopologyObjects.add(lb - .getScopeObject().getTopologyObject())); - + .getScopeObject().getTopologyObject().split("/")[0])); Set targetTopologyObjects = filterCriteria.getTargets().stream().map(TargetObject::getTopologyObject) .collect(Collectors.toSet()); - if (targetTopologyObjects.size() == scopeTopologyObjects.size()) { scopeTopologyObjects.removeAll(targetTopologyObjects); if (!scopeTopologyObjects.isEmpty()) { - throw TiesPathException.notMatchingScopeAndTargetFilter(); + throw TeivPathException.notMatchingScopeAndTargetFilter(); } } else { - throw TiesPathException.notMatchingScopeAndTargetFilter(); + throw TeivPathException.notMatchingScopeAndTargetFilter(); } } @@ -760,7 +823,6 @@ public class BasePathRefinement { */ public void splitFilterCriteria(FilterCriteria filterCriteria) { Map innerFilterCriteriaMap = new HashMap<>(); - for (InnerFilterCriteria base : filterCriteria.getFilterCriteriaList()) { for (TargetObject targetObject : base.getTargets()) { if (!innerFilterCriteriaMap.containsKey(targetObject.getTopologyObject())) { @@ -770,19 +832,17 @@ public class BasePathRefinement { innerFilterCriteriaMap.get(targetObject.getTopologyObject()).getTargets().add(targetObject); } } - for (InnerFilterCriteria base : filterCriteria.getFilterCriteriaList()) { List types = base.getTargets().stream().map(TargetObject::getTopologyObject).toList(); for (String type : types) { innerFilterCriteriaMap.get(type).setScope(generateCutTree(base.getScope(), type)); } } - filterCriteria.setFilterCriteriaList(new ArrayList<>(innerFilterCriteriaMap.values())); } /** - * Validates the binary tree of LogicalBlocks (LB) in FilterCriteria based on isValid boolean of the objects.  + * Validates the binary tree of LogicalBlocks (LB) in FilterCriteria based on isValid boolean of the objects. * Remove invalid LB, when an AND block has an invalid LB set the AND block to invalid * When an OR has an invalid block, replace the OR block with the valid child element. * Throw an error when the last LB became invalid. @@ -794,11 +854,24 @@ public class BasePathRefinement { filterCriteria.getFilterCriteriaList().forEach(innerFilterCriteria -> { innerFilterCriteria.setScope(traverseTree(innerFilterCriteria.getScope())); if (!innerFilterCriteria.getScope().isValid()) { - throw TiesPathException.invalidQueryError(); + throw TeivPathException.invalidQueryError(); } }); } + private void matchTopologyObjectTypeWithResolvingTopologyObjectType(FilterCriteria filterCriteria) { + if (filterCriteria.getResolvingTopologyObjectType().equals( + FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP)) { + for (InnerFilterCriteria innerCriteria : filterCriteria.getFilterCriteriaList()) { + for (TargetObject target : innerCriteria.getTargets()) { + if (target.getTopologyObjectType() != TopologyObjectType.RELATION) { + throw TeivPathException.invalidTargetFilter(target.getTopologyObject()); + } + } + } + } + } + private LogicalBlock traverseTree(LogicalBlock logicalBlock) { if (logicalBlock instanceof AndOrLogicalBlock andOrLogicalBlock && andOrLogicalBlock.getChildren().size() == 2) { andOrLogicalBlock.getChildren().set(0, traverseTree(andOrLogicalBlock.getChildren().get(0))); @@ -829,7 +902,10 @@ public class BasePathRefinement { return getAndOrLogicalBlock(type, orLogicalBlock, OrLogicalBlock::new); } if (logicalBlock instanceof ScopeLogicalBlock scopeLogicalBlock) { - if (!scopeLogicalBlock.getScopeObject().getTopologyObject().equals(type)) { + if ((!scopeLogicalBlock.getScopeObject().getTopologyObject().equals(type) && !scopeLogicalBlock.getScopeObject() + .getTopologyObjectType().equals(ASSOCIATION)) || (!scopeLogicalBlock.getScopeObject() + .getTopologyObject().split("/")[0].equals(type) && scopeLogicalBlock.getScopeObject() + .getTopologyObjectType().equals(ASSOCIATION))) { return EmptyLogicalBlock.getInstance(); } ScopeObject response = ScopeObject.builder(type).topologyObjectType(scopeLogicalBlock.getScopeObject() @@ -839,7 +915,9 @@ public class BasePathRefinement { .parameter(scopeLogicalBlock.getScopeObject().getParameter()).dataType(scopeLogicalBlock .getScopeObject().getDataType()).resolverDataType(scopeLogicalBlock.getScopeObject() .getResolverDataType()).build(); - + if (scopeLogicalBlock.getScopeObject().getTopologyObjectType().equals(ASSOCIATION)) { + response.setTopologyObject(scopeLogicalBlock.getScopeObject().getTopologyObject()); + } return new ScopeLogicalBlock(response); } return EmptyLogicalBlock.getInstance(); @@ -849,14 +927,12 @@ public class BasePathRefinement { Supplier constructor) { LogicalBlock left = generateCutTree(andLogicalBlock.getChildren().get(0), type); LogicalBlock right = generateCutTree(andLogicalBlock.getChildren().get(1), type); - if (!left.isValid() || left instanceof EmptyLogicalBlock) { return right; } if (!right.isValid() || right instanceof EmptyLogicalBlock || left.equals(right)) { return left; } - AndOrLogicalBlock response = constructor.get(); response.getChildren().add(left); response.getChildren().add(right); @@ -900,15 +976,15 @@ public class BasePathRefinement { private ScopeLogicalBlock buildScopeLogicalBlockForRelationship(InnerFilterCriteria criteria) { return new ScopeLogicalBlock(ScopeObject.builder(criteria.getTargets().get(0).getTopologyObject()) - .topologyObjectType(TopologyObjectType.RELATION).queryFunction(QueryFunction.NOT_NULL).container( - ContainerType.ID).resolverDataType(ResolverDataType.STRING).dataType(PRIMITIVE).build()); + .topologyObjectType(TopologyObjectType.RELATION).queryFunction(QueryFunction.NOT_NULL).container(ID) + .resolverDataType(ResolverDataType.STRING).dataType(PRIMITIVE).build()); } private boolean validateReliabilityIndicator(String param) { try { return Reliability.valueOf(param) != null; } catch (IllegalArgumentException e) { - throw TiesPathException.grammarError("Invalid parameter type provided for scopeFilter"); + throw TeivPathException.grammarError("Invalid parameter type provided for scopeFilter"); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinement.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java similarity index 92% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinement.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java index d842022..349cc3f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinement.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; import org.apache.commons.lang3.tuple.Pair; import org.jooq.Field; @@ -28,10 +28,10 @@ import org.jooq.Record; import org.jooq.SelectConditionStep; import org.jooq.SelectField; import org.jooq.SelectOrderByStep; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; import lombok.experimental.UtilityClass; import org.jooq.SelectJoinStep; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.InnerFilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.InnerFilterCriteria; import org.oran.smo.teiv.schema.DataType; import java.util.ArrayList; @@ -44,7 +44,7 @@ import java.util.Set; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.selectCount; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @UtilityClass @SuppressWarnings({ "rawtypes", "unchecked" }) @@ -101,8 +101,6 @@ public class PathToJooqRefinement { resolvedFields.add(field("null::bigint").as(field.getKey().getName())); } else if (field.getValue() == DataType.DECIMAL) { resolvedFields.add(field("null::numeric").as(field.getKey().getName())); - } else if (field.getValue() == DataType.TIMESTAMPTZ) { - resolvedFields.add(field("null::timestamptz").as(field.getKey().getName())); } else if (field.getValue() == DataType.BYTEA) { resolvedFields.add(field("null::bytea").as(field.getKey().getName())); } else { @@ -163,8 +161,6 @@ public class PathToJooqRefinement { nulledFields.add(field("null::bigint").as(field.getName())); } else if (selectList.get(i).getValue().get(field) == DataType.DECIMAL) { nulledFields.add(field("null::numeric").as(field.getName())); - } else if (selectList.get(i).getValue().get(field) == DataType.TIMESTAMPTZ) { - nulledFields.add(field("null::timestamptz").as(field.getName())); } else if (selectList.get(i).getValue().get(field) == DataType.BYTEA) { nulledFields.add(field("null::bytea").as(field.getName())); } else { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/PathResolver.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/PathResolver.java similarity index 69% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/PathResolver.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/PathResolver.java index 62b199c..f6ba2d8 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/PathResolver.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/PathResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,16 +18,16 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; -import org.oran.smo.teiv.antlr4.tiesPathParser; +import org.oran.smo.teiv.antlr4.teivPathParser; import org.oran.smo.teiv.utils.path.StrictErrorStrategy; -import org.oran.smo.teiv.utils.path.TiesPathErrorListener; -import org.oran.smo.teiv.utils.path.TiesPathLexer; -import org.oran.smo.teiv.utils.path.TiesPathParser; +import org.oran.smo.teiv.utils.path.TeivPathErrorListener; +import org.oran.smo.teiv.utils.path.TeivPathLexer; +import org.oran.smo.teiv.utils.path.TeivPathParser; public interface PathResolver { @@ -54,14 +54,14 @@ public interface PathResolver { T process(String rootObject, String filter); - default tiesPathParser getTiesPathParser(String filter) { + default teivPathParser getTeivPathParser(String filter) { final CharStream inputStream = CharStreams.fromString(filter); - final TiesPathLexer tiesPathLexer = new TiesPathLexer(inputStream); - final tiesPathParser tiesPathParser = new TiesPathParser(new CommonTokenStream(tiesPathLexer)); - tiesPathParser.removeErrorListeners(); - tiesPathParser.addErrorListener(new TiesPathErrorListener()); - tiesPathParser.setErrorHandler(new StrictErrorStrategy()); + final TeivPathLexer teivPathLexer = new TeivPathLexer(inputStream); + final teivPathParser teivPathParser = new TeivPathParser(new CommonTokenStream(teivPathLexer)); + teivPathParser.removeErrorListeners(); + teivPathParser.addErrorListener(new TeivPathErrorListener()); + teivPathParser.setErrorHandler(new StrictErrorStrategy()); - return tiesPathParser; + return teivPathParser; } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverDataType.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverDataType.java similarity index 88% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverDataType.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverDataType.java index 6cf9cda..cc3a777 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverDataType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverDataType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; public enum ResolverDataType { INTEGER, diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverUtil.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverUtil.java new file mode 100644 index 0000000..8ce3a80 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ResolverUtil.java @@ -0,0 +1,139 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.exposure.teivpath.resolver; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import lombok.experimental.UtilityClass; + +import jakarta.annotation.Nullable; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; + +import static org.oran.smo.teiv.utils.TeivConstants.ATTRIBUTES; +import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; + +@UtilityClass +public class ResolverUtil { + public static String getTopologyObject(final String rootObject, final List containerNames) { + final int noOfContainers = containerNames.size(); + final String firstContainer = containerNames.get(0); + + if (noOfContainers > 2) { + throw TeivPathException.grammarError("More than two level deep path is not allowed"); + } else if (noOfContainers == 2) { + return getTopologyObjectWhenTwoContainers(rootObject, firstContainer); + } + return Optional.ofNullable(rootObject).orElse(WILDCARD); + } + + public static boolean isComplexAttribute(final List containerNames) { + int index = containerNames.indexOf(ATTRIBUTES); + return index != -1 && containerNames.size() - 1 > index; + } + + @Nullable + public static ContainerType getContainerType(final List containerNames) { + List validContainerNames = containerNames.stream().filter(container -> ContainerType.fromValue( + container) != null).toList(); + if (validContainerNames.size() > 1) { + throw TeivPathException.grammarError(String.format("More than one valid containerType appeared in path: %s", + String.join(", ", validContainerNames))); + } + return ContainerType.fromValue(containerNames.get(containerNames.size() - 1)); + } + + private static String getTopologyObjectWhenTwoContainers(final String rootObject, final String firstContainer) { + if (null == rootObject || firstContainer.equals(rootObject)) { + return firstContainer; + } else { + throw TeivPathException.grammarError( + "Target/Scope filter can only contain Root Object types mentioned in the path parameter"); + } + } + + public static String getTopologyObjectForScope(String rootObject, List containerNames) { + ContainerType containerType = identifyContainerType(containerNames); + + List containerNamesPositionedBeforeContainerType = collectContainerNamesPositionedBeforeContainerType( + containerNames, containerType); + + if (containerNamesPositionedBeforeContainerType.size() > 2) { + throw TeivPathException.grammarError(containerType != null ? + String.format("Too many containers before %s", containerType.getValue()) : + String.format("Too many containers: %s", String.join(", ", + containerNamesPositionedBeforeContainerType))); + } + + return assembleTopologyObject(rootObject, containerNamesPositionedBeforeContainerType); + } + + private static String assembleTopologyObject(String rootObject, + List containerNamesPositionedBeforeContainerType) { + if (rootObject == null) { + if (containerNamesPositionedBeforeContainerType.isEmpty()) { + return WILDCARD; + } else if (containerNamesPositionedBeforeContainerType.size() == 1) { + return WILDCARD + "/" + containerNamesPositionedBeforeContainerType.get(0); + } + return String.join("/", containerNamesPositionedBeforeContainerType); + } else { + if (containerNamesPositionedBeforeContainerType.size() == 2) { + if (containerNamesPositionedBeforeContainerType.get(0).equals(rootObject)) { + return String.join("/", containerNamesPositionedBeforeContainerType); + } + throw TeivPathException.grammarError( + "Target/Scope filter can only contain Root Object types mentioned in the path parameter"); + } else if (containerNamesPositionedBeforeContainerType.size() == 1) { + if (containerNamesPositionedBeforeContainerType.get(0).equals(rootObject)) { + return rootObject; + } else { + return String.format("%s/%s", rootObject, containerNamesPositionedBeforeContainerType.get(0)); + } + } + return rootObject; + } + } + + private static List collectContainerNamesPositionedBeforeContainerType(List containerNames, + ContainerType containerType) { + List containerNamesPositionedBeforeContainerType = new ArrayList<>(); + if (containerType != null) { + containerNamesPositionedBeforeContainerType.addAll(containerNames.subList(0, containerNames.indexOf( + containerType.getValue()))); + } else { + containerNamesPositionedBeforeContainerType.addAll(containerNames); + } + return containerNamesPositionedBeforeContainerType; + } + + private static ContainerType identifyContainerType(List containerNames) { + ContainerType containerType = null; + for (String containerName : containerNames) { + if (ContainerType.fromValue(containerName) != null) { + containerType = ContainerType.fromValue(containerName); + break; + } + } + return containerType; + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeFilterListener.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeFilterListener.java similarity index 69% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeFilterListener.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeFilterListener.java index 28a7dd7..1bbb7c5 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeFilterListener.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeFilterListener.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,34 +18,37 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; - -import org.oran.smo.teiv.antlr4.tiesPathBaseListener; -import org.oran.smo.teiv.antlr4.tiesPathParser; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndOrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.LogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeObject; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +package org.oran.smo.teiv.exposure.teivpath.resolver; + +import org.oran.smo.teiv.antlr4.teivPathBaseListener; +import org.oran.smo.teiv.antlr4.teivPathParser; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndOrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.LogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeObject; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; -import static org.oran.smo.teiv.exposure.tiespath.resolver.ResolverUtil.getContainerType; -import static org.oran.smo.teiv.exposure.tiespath.resolver.ResolverUtil.getTopologyObject; -import static org.oran.smo.teiv.exposure.tiespath.resolver.ResolverUtil.isComplexAttribute; -import static org.oran.smo.teiv.utils.TiesConstants.ATTRIBUTES; -import static org.oran.smo.teiv.utils.TiesConstants.WILDCARD; - -public class ScopeFilterListener extends tiesPathBaseListener { +import static org.oran.smo.teiv.exposure.teivpath.resolver.ResolverUtil.getContainerType; +import static org.oran.smo.teiv.exposure.teivpath.resolver.ResolverUtil.getTopologyObjectForScope; +import static org.oran.smo.teiv.exposure.teivpath.resolver.ResolverUtil.isComplexAttribute; +import static org.oran.smo.teiv.utils.TeivConstants.ATTRIBUTES; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.METADATA; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; +import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; + +public class ScopeFilterListener extends teivPathBaseListener { private final String rootObject; private final List containerNames = new ArrayList<>(); @@ -54,13 +57,23 @@ public class ScopeFilterListener extends tiesPathBaseListener { } private LogicalBlock generateLBWithContainers() { - final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = ScopeObject.builder(getTopologyObject(this.rootObject, - this.containerNames)).queryFunction(QueryFunction.NOT_NULL).innerContainer(new ArrayList<>(Arrays.asList( - this.containerNames.get(containerNames.size() - 1)))).resolverDataType(ResolverDataType.NOT_NULL); + checkIfContainerIsCompatibleWithQueryFunction(QueryFunction.NOT_NULL); + final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = ScopeObject.builder(getTopologyObjectForScope( + this.rootObject, this.containerNames)).queryFunction(QueryFunction.NOT_NULL).resolverDataType( + ResolverDataType.NOT_NULL); addScopeLogicalBlock(scopeObjectBuilder); return this.logicalBlock; } + private void checkIfContainerIsCompatibleWithQueryFunction(QueryFunction queryFunction) { + List containerTypesThatShouldNotBePairedWithNullQueryFunction = List.of(ATTRIBUTES, CLASSIFIERS, DECORATORS, + SOURCE_IDS, METADATA); + if (queryFunction.equals(QueryFunction.NOT_NULL) && containerNames.stream().anyMatch( + containerTypesThatShouldNotBePairedWithNullQueryFunction::contains)) { + throw TeivPathException.grammarError("Invalid data in scopeFilter"); + } + } + private LogicalBlock logicalBlock; public ScopeFilterListener(String rootObject) { @@ -68,38 +81,37 @@ public class ScopeFilterListener extends tiesPathBaseListener { } @Override - public void exitContainerName(final tiesPathParser.ContainerNameContext ctx) { + public void exitContainerName(final teivPathParser.ContainerNameContext ctx) { final String containerName = ctx.getText(); containerNames.add(containerName); } @Override - public void exitTextFunctionCondition(tiesPathParser.TextFunctionConditionContext ctx) { + public void exitTextFunctionCondition(teivPathParser.TextFunctionConditionContext ctx) { if (getContainerType(this.containerNames) == ContainerType.ID) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(null, QueryFunction.EQ); scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType( ResolverDataType.STRING); addScopeLogicalBlock(scopeObjectBuilder); } else { - throw TiesPathException.grammarError("text() is supported for ID only"); + throw TeivPathException.grammarError("text() is supported for ID only"); } } @Override - public void exitContainsTextFunctionCondition(tiesPathParser.ContainsTextFunctionConditionContext ctx) { + public void exitContainsTextFunctionCondition(teivPathParser.ContainsTextFunctionConditionContext ctx) { if (getContainerType(this.containerNames) == ContainerType.ID) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(null, QueryFunction.CONTAINS); scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType( ResolverDataType.STRING); addScopeLogicalBlock(scopeObjectBuilder); } else { - throw TiesPathException.grammarError("text() is supported for ID only"); + throw TeivPathException.grammarError("text() is supported for ID only"); } - } @Override - public void exitContainsFunctionCondition(final tiesPathParser.ContainsFunctionConditionContext ctx) { + public void exitContainsFunctionCondition(final teivPathParser.ContainsFunctionConditionContext ctx) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), QueryFunction.CONTAINS); scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType(ResolverDataType.STRING); @@ -107,11 +119,10 @@ public class ScopeFilterListener extends tiesPathBaseListener { } @Override - public void exitWithinMetersFunctionCondition(final tiesPathParser.WithinMetersFunctionConditionContext ctx) { + public void exitWithinMetersFunctionCondition(final teivPathParser.WithinMetersFunctionConditionContext ctx) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), QueryFunction.WITHIN_METERS); String parameter = ctx.StringLiteral().getText() + ", "; - if (ctx.IntegerLiteral() != null) { parameter += ctx.IntegerLiteral().getText(); } else if (ctx.DoubleLiteral() != null) { @@ -119,16 +130,14 @@ public class ScopeFilterListener extends tiesPathBaseListener { } else if (ctx.DecimalLiteral() != null) { parameter += ctx.DecimalLiteral().getText(); } else { - throw TiesPathException.grammarError("Integer, decimal or double meters parameter expected!"); + throw TeivPathException.grammarError("Integer, decimal or double meters parameter expected!"); } - scopeObjectBuilder.parameter(parameter).resolverDataType(ResolverDataType.STRING); - addScopeLogicalBlock(scopeObjectBuilder); } @Override - public void exitCoveredByFunctionCondition(final tiesPathParser.CoveredByFunctionConditionContext ctx) { + public void exitCoveredByFunctionCondition(final teivPathParser.CoveredByFunctionConditionContext ctx) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), QueryFunction.COVERED_BY); scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType(ResolverDataType.STRING); @@ -136,19 +145,17 @@ public class ScopeFilterListener extends tiesPathBaseListener { } @Override - public void exitLeafCondition(final tiesPathParser.LeafConditionContext ctx) { + public void exitLeafCondition(final teivPathParser.LeafConditionContext ctx) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), QueryFunction.fromValue(ctx.comparativeOperators().getText())); - if (ctx.IntegerLiteral() != null) { scopeObjectBuilder.parameter(ctx.IntegerLiteral().getText()).resolverDataType(ResolverDataType.INTEGER); } else if (ctx.StringLiteral() != null) { scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType( ResolverDataType.STRING); } else { - throw TiesPathException.grammarError("Unsupported comparison value encountered in expression" + ctx.getText()); + throw TeivPathException.grammarError("Unsupported comparison value encountered in expression" + ctx.getText()); } - addScopeLogicalBlock(scopeObjectBuilder); } @@ -158,7 +165,7 @@ public class ScopeFilterListener extends tiesPathBaseListener { } @Override - public void exitBooleanOperators(final tiesPathParser.BooleanOperatorsContext ctx) { + public void exitBooleanOperators(final teivPathParser.BooleanOperatorsContext ctx) { final AndOrLogicalBlock andOrLogicalBlock; if (ctx.getText().equals("and")) { andOrLogicalBlock = new AndLogicalBlock(); @@ -167,32 +174,29 @@ public class ScopeFilterListener extends tiesPathBaseListener { andOrLogicalBlock = new OrLogicalBlock(); andOrLogicalBlock.addChild(this.logicalBlock); } - this.logicalBlock = andOrLogicalBlock; } @Override - public void exitFieldLeaf(final tiesPathParser.FieldLeafContext ctx) { - throw TiesPathException.grammarError("Parameter without any condition is not supported in scope filter"); + public void exitFieldLeaf(final teivPathParser.FieldLeafContext ctx) { + throw TeivPathException.grammarError("Parameter without any condition is not supported in scope filter"); } private ScopeObject.ScopeObjectBuilder getScopeObjectBuilder(final String leafName, final QueryFunction queryFunction) { - final String topologyObject = getTopologyObject(this.rootObject, this.containerNames); + final String topologyObject = getTopologyObjectForScope(this.rootObject, this.containerNames); final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = ScopeObject.builder(topologyObject).leaf(leafName) .queryFunction(queryFunction); - Optional.ofNullable(getContainerType(this.containerNames)).ifPresentOrElse(scopeObjectBuilder::container, () -> { if (!isComplexAttribute(containerNames)) { final String container = this.containerNames.get(containerNames.size() - 1); if (topologyObject.equals(container)) { Optional.ofNullable(getContainerType(List.of(leafName))).ifPresentOrElse( containerType -> scopeObjectBuilder.container(containerType).leaf(null), () -> { - throw TiesPathException.grammarError(String.format( + throw TeivPathException.grammarError(String.format( "%s is not a valid leaf for topology object: %s", leafName, rootObject)); }); } else { - scopeObjectBuilder.topologyObject(Objects.equals(topologyObject, WILDCARD) ? null : topologyObject) - .innerContainer(new ArrayList<>(Arrays.asList(container))); + scopeObjectBuilder.topologyObject(Objects.equals(topologyObject, WILDCARD) ? null : topologyObject); } } else { scopeObjectBuilder.topologyObject(topologyObject.equals(WILDCARD) ? null : topologyObject).container( @@ -200,6 +204,7 @@ public class ScopeFilterListener extends tiesPathBaseListener { containerNames.indexOf(ATTRIBUTES) + 1, containerNames.size()))); } }); + return scopeObjectBuilder; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolver.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolver.java similarity index 81% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolver.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolver.java index 857289d..8bd0e3f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolver.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,18 +18,18 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import java.util.Optional; import org.antlr.v4.runtime.misc.ParseCancellationException; -import org.oran.smo.teiv.antlr4.tiesPathParser; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.EmptyLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.LogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.antlr4.teivPathParser; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.EmptyLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.LogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; import org.oran.smo.teiv.utils.path.exception.PathParsingException; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @@ -83,16 +83,16 @@ public class ScopeResolver implements PathResolver { private LogicalBlock getLogicalBlock(final String rootObject, final String filter) { try { - final tiesPathParser tiesPathParser = getTiesPathParser(filter); + final teivPathParser teivPathParser = getTeivPathParser(filter); final ScopeFilterListener scopeFilterListener = new ScopeFilterListener(rootObject); - tiesPathParser.addParseListener(scopeFilterListener); - tiesPathParser.tiesPath(); + teivPathParser.addParseListener(scopeFilterListener); + teivPathParser.teivPath(); LogicalBlock logicalBlock = scopeFilterListener.getLogicalBlock(); - return Optional.ofNullable(logicalBlock).orElseThrow(() -> TiesPathException.grammarError(String.format( + return Optional.ofNullable(logicalBlock).orElseThrow(() -> TeivPathException.grammarError(String.format( "Unsupported filter token: %s", filter))); } catch (ParseCancellationException | PathParsingException e) { log.error("Parsing error on target {} :", filter, e); - throw TiesPathException.grammarError(e.getMessage()); + throw TeivPathException.grammarError(e.getMessage()); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetFilterListener.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetFilterListener.java similarity index 71% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetFilterListener.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetFilterListener.java index 08e8bcc..ce70880 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetFilterListener.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetFilterListener.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,24 +18,24 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.antlr.v4.runtime.RuleContext; -import org.oran.smo.teiv.antlr4.tiesPathBaseListener; -import org.oran.smo.teiv.antlr4.tiesPathParser; -import org.oran.smo.teiv.exception.TiesException; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.antlr4.teivPathBaseListener; +import org.oran.smo.teiv.antlr4.teivPathParser; +import org.oran.smo.teiv.exception.TeivException; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; -import static org.oran.smo.teiv.exposure.tiespath.resolver.ResolverUtil.getContainerType; -import static org.oran.smo.teiv.exposure.tiespath.resolver.ResolverUtil.getTopologyObject; +import static org.oran.smo.teiv.exposure.teivpath.resolver.ResolverUtil.getContainerType; +import static org.oran.smo.teiv.exposure.teivpath.resolver.ResolverUtil.getTopologyObject; -public class TargetFilterListener extends tiesPathBaseListener { +public class TargetFilterListener extends teivPathBaseListener { private final String rootObject; private final List containerNames = new ArrayList<>(); private List attributeNames = new ArrayList<>(); @@ -47,7 +47,7 @@ public class TargetFilterListener extends tiesPathBaseListener { public TargetObject getTargetObject() { if (containerNames.isEmpty()) { //invalid scenario - throw TiesException.serverException("Server unknown exception", "Requested query could not be processed", null); + throw TeivException.serverException("Server unknown exception", "Requested query could not be processed", null); } return Optional.ofNullable(getContainerType(this.containerNames)).map(containerType -> { validateIfParamsApplicable(containerType); @@ -59,34 +59,34 @@ public class TargetFilterListener extends tiesPathBaseListener { private void validateIfParamsApplicable(ContainerType containerType) { if (!containerType.isParamAllowedInTargetFilter() && !this.attributeNames.isEmpty()) { - throw TiesPathException.grammarError(String.format("Parameters are not supported for %s in target filter", + throw TeivPathException.grammarError(String.format("Parameters are not supported for %s in target filter", containerType.getValue())); } } @Override - public void exitContainerName(final tiesPathParser.ContainerNameContext ctx) { + public void exitContainerName(final teivPathParser.ContainerNameContext ctx) { final String containerName = ctx.getText(); containerNames.add(containerName); } @Override - public void exitContainsFunctionCondition(final tiesPathParser.ContainsFunctionConditionContext ctx) { - throw TiesPathException.grammarError(""); + public void exitContainsFunctionCondition(final teivPathParser.ContainsFunctionConditionContext ctx) { + throw TeivPathException.grammarError(""); } @Override - public void exitLeafCondition(final tiesPathParser.LeafConditionContext ctx) { - throw TiesPathException.grammarError("Parameter condition is not supported in target filter"); + public void exitLeafCondition(final teivPathParser.LeafConditionContext ctx) { + throw TeivPathException.grammarError("Parameter condition is not supported in target filter"); } @Override - public void exitBooleanOperators(final tiesPathParser.BooleanOperatorsContext ctx) { - throw TiesPathException.grammarError(""); + public void exitBooleanOperators(final teivPathParser.BooleanOperatorsContext ctx) { + throw TeivPathException.grammarError(""); } @Override - public void exitFieldLeaf(final tiesPathParser.FieldLeafContext ctx) { + public void exitFieldLeaf(final teivPathParser.FieldLeafContext ctx) { attributeNames = ctx.leafName().stream().map(RuleContext::getText).toList(); } @@ -97,13 +97,13 @@ public class TargetFilterListener extends tiesPathBaseListener { assertAttributesApplicableForContainer(attributeNames); return TargetObject.builder(containerNames.get(0)).build(); } - throw TiesPathException.grammarError( + throw TeivPathException.grammarError( "Invalid Container name or Root Object name does not match to the path parameter"); } private void assertAttributesApplicableForContainer(List attrNames) { if (!attrNames.isEmpty()) { - throw TiesPathException.grammarError("Attributes cannot be associated at this level"); + throw TeivPathException.grammarError("Attributes cannot be associated at this level"); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolver.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolver.java similarity index 82% rename from teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolver.java rename to teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolver.java index 927e2df..2c061f5 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolver.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import java.util.ArrayList; import java.util.Arrays; @@ -26,15 +26,15 @@ import java.util.List; import java.util.Optional; import org.antlr.v4.runtime.misc.ParseCancellationException; -import org.oran.smo.teiv.antlr4.tiesPathParser; +import org.oran.smo.teiv.antlr4.teivPathParser; import org.springframework.stereotype.Component; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; import org.oran.smo.teiv.utils.path.exception.PathParsingException; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import lombok.extern.slf4j.Slf4j; -import static org.oran.smo.teiv.utils.TiesConstants.WILDCARD; +import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; @Slf4j @Component @@ -52,7 +52,7 @@ public class TargetResolver implements PathResolver> { @Override public void preCheck(String rootObject, String filter) { if (filter.contains("|")) { - throw TiesPathException.grammarError("OR (|) is not supported for target filter"); + throw TeivPathException.grammarError("OR (|) is not supported for target filter"); } } @@ -70,15 +70,15 @@ public class TargetResolver implements PathResolver> { List targetObjects = new ArrayList<>(); Arrays.stream(filter.split(";")).forEach(targetToken -> { try { - tiesPathParser pathParser = getTiesPathParser(targetToken); + teivPathParser pathParser = getTeivPathParser(targetToken); final TargetFilterListener targetFilterListener = new TargetFilterListener(rootObject); pathParser.addParseListener(targetFilterListener); - pathParser.tiesPath(); + pathParser.teivPath(); targetObjects.add(targetFilterListener.getTargetObject()); } catch (ParseCancellationException | PathParsingException e) { log.error("Parsing error on target {} :", targetToken, e); - throw TiesPathException.grammarError(e.getMessage()); + throw TeivPathException.grammarError(e.getMessage()); } }); return targetObjects; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverUtil.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverUtil.java deleted file mode 100644 index 93aeb75..0000000 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/tiespath/resolver/ResolverUtil.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ -package org.oran.smo.teiv.exposure.tiespath.resolver; - -import java.util.List; -import java.util.Optional; - -import lombok.experimental.UtilityClass; - -import jakarta.annotation.Nullable; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; - -import static org.oran.smo.teiv.utils.TiesConstants.ATTRIBUTES; -import static org.oran.smo.teiv.utils.TiesConstants.WILDCARD; - -@UtilityClass -public class ResolverUtil { - - public static String getTopologyObject(final String rootObject, final List containerNames) { - final int noOfContainers = containerNames.size(); - final String firstContainer = containerNames.get(0); - if (isComplexAttribute(containerNames)) { - return getTopologyObjectOnComplexAttributeCondition(rootObject, firstContainer); - } else if (noOfContainers > 2) { - throw TiesPathException.grammarError("More than two level deep path is not allowed"); - } else if (noOfContainers == 2) { - return getTopologyObjectWhenTwoContainers(rootObject, firstContainer); - } - - return Optional.ofNullable(rootObject).orElse(WILDCARD); - } - - public static boolean isComplexAttribute(final List containerNames) { - int index = containerNames.indexOf(ATTRIBUTES); - return index != -1 && containerNames.size() - 1 > index; - } - - @Nullable - public static ContainerType getContainerType(final List containerNames) { - return ContainerType.fromValue(containerNames.get(containerNames.size() - 1)); - } - - private static String getTopologyObjectWhenTwoContainers(final String rootObject, final String firstContainer) { - if (null == rootObject || firstContainer.equals(rootObject)) { - return firstContainer; - } else { - throw TiesPathException.grammarError( - "Target/Scope filter can only contain Root Object types mentioned in the path parameter"); - } - } - - private static String getTopologyObjectOnComplexAttributeCondition(String rootObject, String firstContainer) { - final ContainerType containerType = ContainerType.fromValue(firstContainer); - if (rootObject == null) { - if (containerType != null) { - return WILDCARD; - } - return firstContainer; - } else { - if (rootObject.equals(firstContainer) || containerType != null) { - return rootObject; - } - throw TiesPathException.grammarError( - "Target/Scope filter can only contain Root Object types mentioned in the path parameter"); - } - } -} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/PaginationUtil.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/PaginationUtil.java index 150c201..7257d14 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/PaginationUtil.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/PaginationUtil.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ package org.oran.smo.teiv.exposure.utils; import lombok.experimental.UtilityClass; import org.oran.smo.teiv.api.model.OranTeivHref; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; /** * Generates the pagination link as href. @@ -35,7 +35,7 @@ public class PaginationUtil { */ public static void validateOffset(int offset, int totalCount) { if (totalCount > 0 && totalCount <= offset) { - throw TiesException.invalidValueException("Offset", totalCount - 1, true); + throw TeivException.invalidValueException("Offset", totalCount - 1, true); } } @@ -46,7 +46,7 @@ public class PaginationUtil { * - offset from the request * @param totalCount * - total count of the records - * @throws TiesException + * @throws TeivException * - if offset is greater than totalCount */ public static int getViableLimit(final int offset, final int limit, final int totalCount) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/RequestValidator.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/RequestValidator.java index 6f87682..4eda472 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/RequestValidator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/utils/RequestValidator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,13 +23,15 @@ package org.oran.smo.teiv.exposure.utils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.SchemaRegistry; import lombok.RequiredArgsConstructor; import org.springframework.web.multipart.MultipartFile; import java.util.Objects; +import static org.oran.smo.teiv.utils.TeivConstants.URN_PREFIX; + @Service @RequiredArgsConstructor @Slf4j @@ -37,32 +39,32 @@ public class RequestValidator { public void validateDomain(String domain) { if (!SchemaRegistry.getDomains().contains(domain)) { - throw TiesException.unknownDomain(domain, SchemaRegistry.getDomains()); + throw TeivException.unknownDomain(domain, SchemaRegistry.getDomains()); } } public void validateEntityType(String entityType) { if (!SchemaRegistry.getEntityNames().contains(entityType)) { - throw TiesException.unknownEntityType(entityType, SchemaRegistry.getEntityNames()); + throw TeivException.unknownEntityType(entityType, SchemaRegistry.getEntityNames()); } } public void validateEntityTypeInDomain(String entityType, String domain) { if (!SchemaRegistry.getEntityNamesByDomain(domain).contains(entityType)) { - throw TiesException.unknownEntityTypeInDomain(entityType, domain, SchemaRegistry.getEntityNamesByDomain( + throw TeivException.unknownEntityTypeInDomain(entityType, domain, SchemaRegistry.getEntityNamesByDomain( domain)); } } public void validateRelationshipType(String relationShipType) { if (!SchemaRegistry.getRelationNames().contains(relationShipType)) { - throw TiesException.unknownRelationshipType(relationShipType, SchemaRegistry.getRelationNames()); + throw TeivException.unknownRelationshipType(relationShipType, SchemaRegistry.getRelationNames()); } } public void validateRelationshipTypeInDomain(String relationshipType, String domain) { if (!SchemaRegistry.getRelationNamesByDomain(domain).contains(relationshipType)) { - throw TiesException.unknownRelationshipTypeInDomain(relationshipType, domain, SchemaRegistry + throw TeivException.unknownRelationshipTypeInDomain(relationshipType, domain, SchemaRegistry .getRelationNamesByDomain(domain)); } } @@ -70,8 +72,14 @@ public class RequestValidator { public void validateYangFile(MultipartFile file) { if (!Objects.equals(file.getContentType(), "application/yang")) { - throw TiesException.invalidFileInput("Invalid file"); + throw TeivException.invalidFileInput("Invalid file"); } } + + public void validateTopologyID(String id) { + if (!id.startsWith(URN_PREFIX)) { + throw TeivException.invalidTopologyID(id); + } + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java b/teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java index 9f1f49d..c960752 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,19 +42,19 @@ public class GroupsCustomMetrics { private final Counter httpUpdateProvidedMembersFailedCount; public GroupsCustomMetrics(final MeterRegistry meterRegistry) { - httpCreateGroupFailedCount = Counter.builder("ties_groups_http_create_group_fail_total").register(meterRegistry); - this.httpGetAllGroupsFailedCount = Counter.builder("ties_groups_http_get_all_groups_fail_total").register( + httpCreateGroupFailedCount = Counter.builder("teiv_groups_http_create_group_fail_total").register(meterRegistry); + this.httpGetAllGroupsFailedCount = Counter.builder("teiv_groups_http_get_all_groups_fail_total").register( meterRegistry); - this.httpGetGroupByIdFailedCount = Counter.builder("ties_groups_http_get_group_by_id_fail_total").register( + this.httpGetGroupByIdFailedCount = Counter.builder("teiv_groups_http_get_group_by_id_fail_total").register( meterRegistry); - this.httpDeleteGroupFailedCount = Counter.builder("ties_groups_http_delete_group_fail_total").register( + this.httpDeleteGroupFailedCount = Counter.builder("teiv_groups_http_delete_group_fail_total").register( meterRegistry); - this.httpUpdateGroupNameFailedCount = Counter.builder("ties_groups_http_update_group_name_fail_total").register( + this.httpUpdateGroupNameFailedCount = Counter.builder("teiv_groups_http_update_group_name_fail_total").register( meterRegistry); - this.httpGetMembersFailedCount = Counter.builder("ties_groups_http_get_members_fail_total").register(meterRegistry); - this.httpGetProvidedMembersFailedCount = Counter.builder("ties_groups_http_get_provided_members_fail_total") + this.httpGetMembersFailedCount = Counter.builder("teiv_groups_http_get_members_fail_total").register(meterRegistry); + this.httpGetProvidedMembersFailedCount = Counter.builder("teiv_groups_http_get_provided_members_fail_total") .register(meterRegistry); - this.httpUpdateProvidedMembersFailedCount = Counter.builder("ties_groups_http_update_provided_members_fail_total") + this.httpUpdateProvidedMembersFailedCount = Counter.builder("teiv_groups_http_update_provided_members_fail_total") .register(meterRegistry); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java index 0647e23..83a1446 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,13 @@ */ package org.oran.smo.teiv.groups.api.impl.creator; +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE; +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.RESOURCE_NOT_FOUND; import static org.oran.smo.teiv.groups.rest.controller.GroupsUtil.generateMembersHref; +import org.oran.smo.teiv.exception.TeivException; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.api.impl.resolver.CriteriaResolverRegistry; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -47,6 +52,7 @@ import org.oran.smo.teiv.utils.JooqTypeConverter; public class DynamicGroupCreator implements GroupCreator { private final ObjectMapper objectMapper; private final GroupsRepository groupsRepository; + private final CriteriaResolverRegistry criteriaResolverRegistry; @Override public OranTeivGroupByIdResponse create(final OranTeivCreateGroupPayload createGroupPayload) { @@ -59,7 +65,7 @@ public class DynamicGroupCreator implements GroupCreator { log.warn("Error while serializing the criteria for the dynamic group: {}", dynamicGroup, e); throw GroupsException.criteriaSerializationException(e.getMessage()); } - + validateGroup(dynamicGroup); final String groupId = GroupCreator.generateGroupId(); final DynamicGroupRecord groupRecord = DynamicGroupRecord.builder().id(groupId).groupName(dynamicGroup.getName()) .groupType(dynamicGroup.getType()).criteria(JooqTypeConverter.toJsonb(criteriaString)).build(); @@ -70,4 +76,17 @@ public class DynamicGroupCreator implements GroupCreator { OranTeivDynamicEnum.DYNAMIC).members(generateMembersHref(groupId)).criteria(dynamicGroup.getCriteria()) .build(); } + + private void validateGroup(OranTeivDynamic dynamicGroup) { + try { + criteriaResolverRegistry.getResolver(dynamicGroup.getCriteria().getQueryType()).resolveByCriteria(dynamicGroup + .getCriteria(), RequestDetails.builder().basePath(String.format(MEMBERS_HREF_TEMPLATE, "tempGroup")) + .limit(1).build()); + } catch (TeivException ex) { + if (!(dynamicGroup.getCriteria().getQueryType().equals("getRelationshipsForEntityId") && ex + .getLocalizedMessage().equals(RESOURCE_NOT_FOUND))) { + throw ex; + } + } + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java index 9c6652c..c523f74 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ */ package org.oran.smo.teiv.groups.api.impl.resolver; +import org.oran.smo.teiv.exposure.utils.RequestValidator; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -39,12 +40,14 @@ import org.oran.smo.teiv.exposure.utils.RequestDetails; @Profile("groups") public class RelationshipByEntityIdResolver implements CriteriaResolver { private final DataService dataService; + private final RequestValidator requestValidator; @Override public OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails) { log.debug("Resolve group with getRelationshipsByEntityId criteria: {}", criteria); OranTeivGetRelationshipsForEntityId relForEntityId = (OranTeivGetRelationshipsForEntityId) criteria; + requestValidator.validateTopologyID(relForEntityId.getEntityId()); final OranTeivRelationshipsResponseMessage relationshipsByEntityId = this.dataService .getAllRelationshipsForObjectId(relForEntityId.getDomain(), relForEntityId.getEntityTypeName(), relForEntityId.getEntityId(), relForEntityId.getTargetFilter(), relForEntityId.getScopeFilter(), diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java index f212e02..0fdee0d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ public class AuditInfo { private final ExecutionStatus status; private final GroupOperation operation; private final OranTeivCreateGroupPayload createGroupPayload; + private final String createGroupPayloadString; private final String groupId; private final String groupName; private final List providedMembers; @@ -50,7 +51,10 @@ public class AuditInfo { private String generateFailureMessage() { return switch (operation) { - case CREATE -> String.format("%s - Create %s, %s", status, generateCreateGroupMsg(), exceptionMessage); + case CREATE -> String.format("%s - Create group %s, %s", status, + createGroupPayloadString != null && !createGroupPayloadString.isEmpty() ? + createGroupPayloadString : + generateCreateGroupMsg(), exceptionMessage); case DELETE -> String.format("%s - Delete group %s, %s", status, groupId, exceptionMessage); case UPDATE_NAME -> String.format("%s - Update name %s for group %s, %s", status, groupName, groupId, exceptionMessage); @@ -64,7 +68,7 @@ public class AuditInfo { private String generateSuccessMessage() { StringBuilder str = new StringBuilder(String.format("%s - ", status)); switch (operation) { - case CREATE -> str.append(generateCreateGroupMsg()).append(String.format(" with id %s", this.groupId)); + case CREATE -> str.append(String.format("Create group %s with id %s", generateCreateGroupMsg(), this.groupId)); case DELETE -> str.append(String.format("Delete group %s", groupId)); case UPDATE_NAME -> str.append(String.format("Update name %s for group %s", groupName, groupId)); case MERGE_PROVIDED_MEMBERS -> str.append(String.format("Merge provided members %s for group %s", @@ -77,10 +81,10 @@ public class AuditInfo { private String generateCreateGroupMsg() { if (createGroupPayload instanceof OranTeivDynamic payload) { - return String.format("Create group type=dynamic, name=%s, criteria=%s", payload.getName(), payload + return String.format("type=%s, name=%s, criteria=%s", payload.getType(), payload.getName(), payload .getCriteria()); } else if (createGroupPayload instanceof OranTeivStatic payload) { - return String.format("Create group type=static, name=%s, providedMembers=%s", payload.getName(), payload + return String.format("type=%s, name=%s, providedMembers=%s", payload.getType(), payload.getName(), payload .getProvidedMembers()); } return null; diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java index f17e7c6..fa88d8c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,4 +27,5 @@ public class GroupsConstants { public static final String MEMBERS_HREF_TEMPLATE = "/groups/%s/members"; public static final String PROVIDED_MEMBERS_HREF_TEMPLATE = "/groups/%s/provided-members"; public static final String GROUP_ID_PREFIX = "urn:o-ran:smo:teiv:group="; + public static final String RESOURCE_NOT_FOUND = "Resource Not Found"; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java index 9aeb063..9e488bf 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,7 +39,11 @@ import org.oran.smo.teiv.api.model.OranTeivStaticGroupByIdResponse; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.groups.audit.AuditInfo; import org.oran.smo.teiv.groups.audit.ExecutionStatus; +import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; +import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -62,11 +66,11 @@ import org.oran.smo.teiv.api.model.OranTeivUpdateGroupNamePayload; import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.oran.smo.teiv.groups.GroupsCustomMetrics; import org.oran.smo.teiv.groups.api.GroupsService; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; @Slf4j @RestController -@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequestMapping(TeivConstants.REQUEST_MAPPING) @RequiredArgsConstructor @Profile("groups") public class GroupsController implements GroupsApi { @@ -76,7 +80,7 @@ public class GroupsController implements GroupsApi { private final HttpServletRequest context; @Override - @Timed("ties_groups_http_create_group_seconds") + @Timed("teiv_groups_http_create_group_seconds") public ResponseEntity createGroup(final String accept, final String contentType, final OranTeivCreateGroupPayload createGroupPayload) { return runWithFailCheck(() -> { @@ -104,7 +108,7 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_get_all_groups_seconds") + @Timed("teiv_groups_http_get_all_groups_seconds") public ResponseEntity getAllGroups(final String accept, final Integer offset, final Integer limit, final String name) { return runWithFailCheck(() -> { @@ -115,7 +119,7 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_delete_group_seconds") + @Timed("teiv_groups_http_delete_group_seconds") public ResponseEntity deleteGroup(final String groupId) { return runWithFailCheck(() -> { runWithAuditLogs(() -> groupsService.deleteGroup(groupId), response -> loggerHandler.logAudit(log, AuditInfo @@ -126,7 +130,7 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_update_group_name_seconds") + @Timed("teiv_groups_http_update_group_name_seconds") public ResponseEntity updateGroupName(final String contentType, final String groupId, final OranTeivUpdateGroupNamePayload groupNameUpdatePayload) { return runWithFailCheck(() -> { @@ -139,7 +143,7 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_get_members_seconds") + @Timed("teiv_groups_http_get_members_seconds") public ResponseEntity getMembers(final String accept, final String groupId, final Integer offset, final Integer limit) { return runWithFailCheck(() -> { @@ -150,7 +154,7 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_get_provided_members_seconds") + @Timed("teiv_groups_http_get_provided_members_seconds") public ResponseEntity getProvidedMembers(final String accept, final String groupId, final String status, final Integer offset, final Integer limit) { return runWithFailCheck(() -> { @@ -162,14 +166,14 @@ public class GroupsController implements GroupsApi { } @Override - @Timed("ties_groups_http_get_group_by_id_seconds") + @Timed("teiv_groups_http_get_group_by_id_seconds") public ResponseEntity getGroupById(final String accept, final String groupId) { return runWithFailCheck(() -> ResponseEntity.ok(groupsService.getGroupById(groupId)), customMetrics::incrementHttpGetGroupByIdFailedCount); } @Override - @Timed("ties_groups_http_update_provided_members_seconds") + @Timed("teiv_groups_http_update_provided_members_seconds") public ResponseEntity updateProvidedMembers(final String accept, final String contentType, final String groupId, final OranTeivUpdateProvidedMembersPayload updateProvidedMembersPayload) { return runWithFailCheck(() -> { @@ -218,4 +222,13 @@ public class GroupsController implements GroupsApi { throw ex; } } + + @Bean + public FilterRegistrationBean loggingFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new GroupCreationRequestFilter(loggerHandler)); + registrationBean.addUrlPatterns("/groups"); + registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); + return registrationBean; + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java index 34870ac..1fc6e19 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,15 @@ package org.oran.smo.teiv.groups.spi; import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.GROUP_ID_PREFIX; +import static org.oran.smo.teiv.utils.TeivConstants.URN_PREFIX; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.schema.SchemaRegistryException; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import lombok.RequiredArgsConstructor; @@ -63,12 +66,13 @@ public class StaticGroupMemberProcessor { validateListItem(providedMember); final Map.Entry topologyEntry = providedMember.fields().next(); final String topologyType = topologyEntry.getKey(); + validateTopologyType(topologyType); for (JsonNode topologyIdObject : topologyEntry.getValue()) { validateListItem(topologyIdObject); final Map.Entry topologyIdEntry = topologyIdObject.fields().next(); if (topologyIdEntry.getKey().equals("id") && topologyIdEntry.getValue().isTextual()) { final String id = topologyIdEntry.getValue().asText(); - groupIdCheck(id); + validateTopologyId(id); groupedProvidedMembers.computeIfAbsent(topologyType, v -> new ArrayList<>()).add(id); } else { throw GroupsException.invalidProvidedMembers(String.format("Invalid key/value present in %s.", @@ -80,6 +84,23 @@ public class StaticGroupMemberProcessor { return groupedProvidedMembers; } + private void validateTopologyType(String topologyType) { + final String[] parts = topologyType.split(":"); + if (parts.length != 2) { + throw GroupsException.invalidProvidedMembers( + "Topology type must be in the format 'moduleName:topologyTypeName'. Provided: " + topologyType); + } + final String moduleName = parts[0]; + final String topologyTypeName = parts[1]; + try { + SchemaRegistry.getTopologyTypeByModuleAndTopologyName(moduleName, topologyTypeName); + } catch (SchemaRegistryException ex) { + String errorMessage = String.format("Invalid topology type '%s', not found in the model", topologyType); + log.warn(errorMessage, ex); + throw GroupsException.invalidProvidedMembers(String.format(errorMessage, topologyType)); + } + } + private void validateListItem(final JsonNode jsonNode) { if (!jsonNode.isObject()) { throw GroupsException.invalidProvidedMembers("List elements are not of the type object."); @@ -90,10 +111,13 @@ public class StaticGroupMemberProcessor { } } - private void groupIdCheck(final String id) { + private void validateTopologyId(final String id) { if (id.startsWith(GROUP_ID_PREFIX)) { throw GroupsException.invalidProvidedMembers(String.format( "Nested topology groups is not supported. Provided members contain topology group id: %s", id)); + } else if (!id.startsWith(URN_PREFIX)) { + throw GroupsException.invalidProvidedMembers(String.format( + "Topology id %s is not in supported format. Provided members id should start with %s", id, URN_PREFIX)); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java index 901edfc..9351839 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,14 +80,14 @@ import org.oran.smo.teiv.groups.spi.StaticGroupRecord; public class GroupsRepositoryImpl implements GroupsRepository { @Value("${groups.static.provided-members-ids.max-limit}") private int maxLimit; - private static final String TIES_GROUPS = "ties_groups.%s"; - private static final Table GROUPS_TABLE = table(String.format(TIES_GROUPS, "groups")); + private static final String TEIV_GROUPS = "teiv_groups.%s"; + private static final Table GROUPS_TABLE = table(String.format(TEIV_GROUPS, "groups")); private static final Field GROUP_ID = field(name("id"), String.class); private static final Field GROUP_NAME = field(name("name"), String.class); private static final Field GROUP_TYPE = field(name("type"), String.class); - private static final Table DYNAMIC_GROUPS_TABLE = table(String.format(TIES_GROUPS, "dynamic_groups")); + private static final Table DYNAMIC_GROUPS_TABLE = table(String.format(TEIV_GROUPS, "dynamic_groups")); private static final Field CRITERIA = field(name("criteria"), JSONB.class); - private static final Table STATIC_GROUPS_TABLE = table(String.format(TIES_GROUPS, "static_groups")); + private static final Table STATIC_GROUPS_TABLE = table(String.format(TEIV_GROUPS, "static_groups")); private static final Field TOPOLOGY_TYPE = field(name("topology_type"), String.class); private static final Field PROVIDED_MEMBERS_IDS = field(name("provided_members_ids"), String[].class); @@ -259,7 +259,7 @@ public class GroupsRepositoryImpl implements GroupsRepository { if (deletedRows == 0) { log.warn("Group with ID: {} doesn't exist when trying to delete the group.", groupId); throw new GroupNotFoundException( - "Group with ID: " + groupId + "doesn't exist when tyring to delete the group."); + "Group with ID: " + groupId + "doesn't exist when trying to delete the group."); } } @@ -270,7 +270,7 @@ public class GroupsRepositoryImpl implements GroupsRepository { if (result.isEmpty()) { log.warn("Group with ID: {} doesn't exist when trying to get the provided members.", groupId); throw new GroupNotFoundException( - "Group with ID: " + groupId + "doesn't exist when tyring to get the provided members."); + "Group with ID: " + groupId + "doesn't exist when trying to get the provided members."); } final Map> groupedProvidedMembers = new HashMap<>(); result.forEach(staticGroupRecord -> groupedProvidedMembers.put(staticGroupRecord.get(TOPOLOGY_TYPE), List.of( diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java new file mode 100644 index 0000000..02cea94 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java @@ -0,0 +1,56 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.groups.utils; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +import org.springframework.util.StreamUtils; + +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper { + + private final byte[] cachedBody; + + public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException { + super(request); + InputStream requestInputStream = request.getInputStream(); + this.cachedBody = StreamUtils.copyToByteArray(requestInputStream); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return new CachedBodyServletInputStream(this.cachedBody); + } + + @Override + public BufferedReader getReader() throws IOException { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody); + return new BufferedReader(new InputStreamReader(byteArrayInputStream, StandardCharsets.UTF_8)); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java new file mode 100644 index 0000000..5b651d1 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java @@ -0,0 +1,61 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.groups.utils; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; + +public class CachedBodyServletInputStream extends ServletInputStream { + + private final InputStream cachedBodyInputStream; + + public CachedBodyServletInputStream(byte[] cachedBody) { + this.cachedBodyInputStream = new ByteArrayInputStream(cachedBody); + } + + @Override + public int read() throws IOException { + return cachedBodyInputStream.read(); + } + + @Override + public boolean isFinished() { + try { + return cachedBodyInputStream.available() == 0; + } catch (IOException e) { + throw new IllegalStateException("Error checking if input stream is finished", e); + } + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener listener) { + throw new UnsupportedOperationException(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java new file mode 100644 index 0000000..e00bd71 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java @@ -0,0 +1,140 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Ericsson + * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.groups.utils; + +import static org.oran.smo.teiv.groups.audit.ExecutionStatus.FAILED; +import static org.oran.smo.teiv.groups.audit.GroupOperation.CREATE; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.oran.smo.teiv.exposure.audit.LoggerHandler; +import org.oran.smo.teiv.groups.audit.AuditInfo; +import org.springframework.context.annotation.Profile; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +@Order(Ordered.HIGHEST_PRECEDENCE) +@Profile("groups") +public class GroupCreationRequestFilter implements jakarta.servlet.Filter { + + private final LoggerHandler loggerHandler; + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException { + ContentCachingRequestWrapper httpServletRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); + CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest); + ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper( + (HttpServletResponse) response); + String payloadString = readRequestBody(cachedBodyHttpServletRequest); + try { + if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) { + JsonNode createGroupPayload = objectMapper.readValue(payloadString, JsonNode.class); + String message = validateGroupType(createGroupPayload); + if (!message.isEmpty()) { + loggerHandler.logAudit(log, AuditInfo.builder().operation(CREATE).createGroupPayloadString( + payloadString).exceptionMessage(message).status(FAILED).build().toString(), + cachedBodyHttpServletRequest); + httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); + httpServletResponse.setContentType("application/json"); + httpServletResponse.getWriter().write(generateResponse(message)); + httpServletResponse.getWriter().flush(); + return; + } + } + chain.doFilter(cachedBodyHttpServletRequest, httpServletResponse); + } catch (JsonProcessingException ex) { + String message = String.format("Unable to parse the given request body. %s", ex.getMessage()); + loggerHandler.logAudit(log, AuditInfo.builder().operation(CREATE).createGroupPayloadString(payloadString) + .exceptionMessage(message).status(FAILED).build().toString(), cachedBodyHttpServletRequest); + chain.doFilter(cachedBodyHttpServletRequest, httpServletResponse); + } finally { + httpServletResponse.copyBodyToResponse(); + } + } + + private String validateGroupType(JsonNode createGroupPayload) { + String message = ""; + if (createGroupPayload.has("type")) { + String groupType = createGroupPayload.get("type").asText(); + if (createGroupPayload.has("providedMembers") && groupType.equals("dynamic")) { + message = "A static group cannot be created of type 'dynamic'"; + } else if (createGroupPayload.has("criteria") && groupType.equals("static")) { + message = "A dynamic group cannot be created of type 'static'"; + } else if (!"static".equals(groupType) && !groupType.equals("dynamic")) { + message = "Invalid group type. Only 'static' or 'dynamic' types are allowed"; + } else if (createGroupPayload.has("criteria") && createGroupPayload.get("criteria").has("queryType")) { + String queryType = createGroupPayload.get("criteria").get("queryType").asText(); + if (!List.of("getRelationshipsForEntityId", "getEntitiesByDomain", "getEntitiesByType", + "getRelationshipsByType").contains(queryType)) { + return "Invalid query type. Only 'getRelationshipsForEntityId', 'getEntitiesByDomain', 'getEntitiesByType' & 'getRelationshipsByType' are supported."; + } + } + } + return message; + } + + private String generateResponse(String details) throws JsonProcessingException { + Map jsonResponse = new HashMap<>(); + jsonResponse.put("details", details); + jsonResponse.put("message", "Invalid type specified"); + jsonResponse.put("status", HttpStatus.BAD_REQUEST); + return objectMapper.writeValueAsString(jsonResponse); + } + + private String readRequestBody(HttpServletRequest request) throws IOException { + StringBuilder body = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), + StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + body.append(line); + } + } + return body.toString(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidator.java b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidator.java index 59766d2..7a56c92 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.ingestion.validation; -import static org.oran.smo.teiv.utils.TiesConstants.INFINITE_MAXIMUM_CARDINALITY; +import static org.oran.smo.teiv.utils.TeivConstants.INFINITE_MAXIMUM_CARDINALITY; import java.util.List; import org.oran.smo.teiv.schema.RelationType; @@ -47,7 +47,7 @@ public class IngestionOperationValidator { INFINITE_INFINITE } - private final TiesDbServiceForValidation tiesDbServiceForValidation; + private final TeivDbServiceForValidation teivDbServiceForValidation; public void validate(ParsedCloudEventData parsedCloudEventData) throws MaximumCardinalityViolationException { validateRelationshipMaximumCardinality(parsedCloudEventData.getRelationships()); @@ -172,8 +172,8 @@ public class IngestionOperationValidator { private boolean executeValidationQuery(String tableName, String foreignKeyColumnName, String foreignKeyValue, String tableReferencedFromForeignKeyColumn, long maxOccurrence) { - tiesDbServiceForValidation.acquireEntityInstanceExclusiveLock(tableReferencedFromForeignKeyColumn, foreignKeyValue); - return tiesDbServiceForValidation.executeValidationQuery(tableName, foreignKeyColumnName, foreignKeyValue, + teivDbServiceForValidation.acquireEntityInstanceExclusiveLock(tableReferencedFromForeignKeyColumn, foreignKeyValue); + return teivDbServiceForValidation.executeValidationQuery(tableName, foreignKeyColumnName, foreignKeyValue, maxOccurrence); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorFactory.java b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorFactory.java index 6fb56f6..2c9f2c3 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorFactory.java +++ b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorFactory.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,6 @@ import org.springframework.stereotype.Component; @Component public class IngestionOperationValidatorFactory { public IngestionOperationValidator createValidator(DSLContext dslContext) { - return new IngestionOperationValidator(new TiesDbServiceForValidation(dslContext)); + return new IngestionOperationValidator(new TeivDbServiceForValidation(dslContext)); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TiesDbServiceForValidation.java b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TeivDbServiceForValidation.java similarity index 92% rename from teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TiesDbServiceForValidation.java rename to teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TeivDbServiceForValidation.java index 7a979c7..639d1f0 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TiesDbServiceForValidation.java +++ b/teiv/src/main/java/org/oran/smo/teiv/ingestion/validation/TeivDbServiceForValidation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import org.jooq.DSLContext; import org.jooq.Field; import org.jooq.Record1; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -36,7 +36,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RequiredArgsConstructor(access = AccessLevel.PROTECTED) -public class TiesDbServiceForValidation { +public class TeivDbServiceForValidation { private final DSLContext dslContext; @@ -49,7 +49,7 @@ public class TiesDbServiceForValidation { * Unique id of the entity */ public void acquireEntityInstanceExclusiveLock(String tableName, String entityId) { - Field idField = field(TiesConstants.ID_COLUMN_NAME); + Field idField = field(TeivConstants.ID_COLUMN_NAME); dslContext.select(idField).from(tableName).where(idField.eq(entityId)).forUpdate().execute(); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java index c2dfe53..671f4bf 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,15 +27,18 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; +import org.oran.smo.teiv.service.models.OperationResult; import org.oran.smo.teiv.utils.CloudEventUtil; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; -import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_CREATE; +import java.util.List; + +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE; @Component @Slf4j @@ -45,7 +48,7 @@ public class CreateTopologyProcessor implements TopologyProcessor { private final CloudEventParser cloudEventParser; private final CustomMetrics customMetrics; - private final TiesDbOperations tiesDbOperations; + private final TeivDbOperations teivDbOperations; private final IngestionAuditLogger auditLogger; @Override @@ -66,9 +69,11 @@ public class CreateTopologyProcessor implements TopologyProcessor { customMetrics.incrementNumSuccessfullyParsedCreateCloudEvents(); stopWatch.start(); + List operationResults; final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { - tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter); + operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, + sourceAdapter); } catch (InvalidFieldInYangDataException e) { log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java index 7112f95..b8ea59c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,8 +35,8 @@ import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.RelationshipDataLocation; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.service.TiesDbOperations; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbOperations; +import org.oran.smo.teiv.service.TeivDbService; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; import org.oran.smo.teiv.service.models.OperationResult; @@ -45,7 +45,7 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; -import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE; +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_DELETE; @Component @Slf4j @@ -54,8 +54,8 @@ import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE public class DeleteTopologyProcessor implements TopologyProcessor { private final CloudEventParser cloudEventParser; - private final TiesDbService tiesDbService; - private final TiesDbOperations tiesDbOperations; + private final TeivDbService teivDbService; + private final TeivDbOperations teivDbOperations; private final CustomMetrics customMetrics; private final IngestionAuditLogger auditLogger; @@ -84,24 +84,24 @@ public class DeleteTopologyProcessor implements TopologyProcessor { parsedCloudEventData.getEntities().forEach(entity -> { EntityType entityType = SchemaRegistry.getEntityTypeByName(entity.getType()); dbOperations.add(dslContext -> operationResults - .addAll(tiesDbOperations.deleteEntity(dslContext, entityType, entity.getId()))); + .addAll(teivDbOperations.deleteEntity(dslContext, entityType, entity.getId()))); }); parsedCloudEventData.getRelationships().forEach(relationship -> { RelationType relationType = SchemaRegistry.getRelationTypeByName(relationship.getType()); if (Objects.requireNonNull(relationType) .getRelationshipStorageLocation() == RelationshipDataLocation.RELATION) { - dbOperations.add(dslContext -> tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, + dbOperations.add(dslContext -> teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, relationType, relationship.getId()).ifPresent(operationResults::add)); } else { dbOperations - .add(dslContext -> tiesDbOperations.deleteRelationFromEntityTableByRelationId(dslContext, + .add(dslContext -> teivDbOperations.deleteRelationFromEntityTableByRelationId(dslContext, relationship.getId(), relationType).ifPresent(operationResults::add)); } }); try { - tiesDbService.execute(dbOperations); + teivDbService.execute(dbOperations); } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java index 08858a7..920b915 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; +import org.oran.smo.teiv.service.models.OperationResult; import org.oran.smo.teiv.utils.CloudEventUtil; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -32,13 +33,16 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; import org.springframework.util.StopWatch; -import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_MERGE; +import java.util.ArrayList; +import java.util.List; + +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_MERGE; @AllArgsConstructor @Component @@ -49,7 +53,7 @@ public class MergeTopologyProcessor implements TopologyProcessor { private final CloudEventParser cloudEventParser; private final CustomMetrics customMetrics; - private final TiesDbOperations tiesDbOperations; + private final TeivDbOperations teivDbOperations; private final IngestionAuditLogger auditLogger; //spotless:off @@ -70,9 +74,10 @@ public class MergeTopologyProcessor implements TopologyProcessor { customMetrics.incrementNumSuccessfullyParsedMergeCloudEvents(); stopWatch.start(); + List operationResults = new ArrayList<>(); final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { - tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter); + operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter); } catch (InvalidFieldInYangDataException e) { log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java b/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java index d2e7704..e8f5dba 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,20 +43,20 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import org.oran.smo.teiv.CustomMetrics; -import org.oran.smo.teiv.service.TiesDbOperations; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbOperations; +import org.oran.smo.teiv.service.TeivDbService; -import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE; +import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE; @Component @Slf4j @AllArgsConstructor @Profile("ingestion") public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { - private final TiesDbService tiesDbService; + private final TeivDbService teivDbService; private final ObjectMapper objectMapper; private final CustomMetrics customMetrics; - private final TiesDbOperations tiesDbOperations; + private final TeivDbOperations teivDbOperations; private final IngestionAuditLogger auditLogger; @Override @@ -94,15 +94,15 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { try { List> dbOperations = new ArrayList<>(); SchemaRegistry.getEntityTypes().forEach(entityType -> dbOperations.add(dslContext -> { - List results = tiesDbOperations.selectByCmHandleFormSourceIds(dslContext, entityType.getTableName(), + List results = teivDbOperations.selectByCmHandleFormSourceIds(dslContext, entityType.getTableName(), sourceEntityDelete.value); if (!results.isEmpty()) { for (String result : results) { - operationResults.addAll(tiesDbOperations.deleteEntity(dslContext, entityType, result)); + operationResults.addAll(teivDbOperations.deleteEntity(dslContext, entityType, result)); } } })); - tiesDbService.execute(dbOperations); + teivDbService.execute(dbOperations); } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyListener.java b/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyListener.java index 236adc3..d32f225 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyListener.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyListener.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import java.util.List; import java.util.Optional; import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.common.errors.RecordTooLargeException; import org.springframework.context.annotation.Profile; import org.springframework.core.log.LogAccessor; import org.springframework.kafka.annotation.KafkaListener; @@ -49,17 +50,22 @@ public class TopologyListener { public void processEvents(List> events) { log.info("Processing events: {}", events.size()); for (ConsumerRecord rec : events) { - if (rec.value() == null) { - metrics.incrementNumReceivedCloudEventNotSupported(); - Optional deserializationException = Optional.ofNullable(SerializationUtils - .getExceptionFromHeader(rec, SerializationUtils.VALUE_DESERIALIZER_EXCEPTION_HEADER, this.logger)); - deserializationException.ifPresent(exception -> { - logger.error(exception.getCause().getLocalizedMessage()); - logger.error(exception, "Record at offset " + rec.offset() + " could not be deserialized"); - }); - } else { - String messageKey = rec.key(); - topologyProcessorRegistry.getProcessor(rec.value()).process(rec.value(), messageKey); + try { + if (rec.value() == null) { + metrics.incrementNumReceivedCloudEventNotSupported(); + Optional deserializationException = Optional.ofNullable(SerializationUtils + .getExceptionFromHeader(rec, SerializationUtils.VALUE_DESERIALIZER_EXCEPTION_HEADER, + this.logger)); + deserializationException.ifPresent(exception -> { + logger.error(exception.getCause().getLocalizedMessage()); + logger.error(exception, "Record at offset " + rec.offset() + " could not be deserialized"); + }); + } else { + String messageKey = rec.key(); + topologyProcessorRegistry.getProcessor(rec.value()).process(rec.value(), messageKey); + } + } catch (RecordTooLargeException exception) { + logger.warn("Ingestion message is too large to be processed:" + exception.getMessage()); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyProcessorRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyProcessorRegistry.java index 9e83acd..b6ca7b3 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyProcessorRegistry.java +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/TopologyProcessorRegistry.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.CustomMetrics; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; @Component @Slf4j @@ -45,22 +45,22 @@ public class TopologyProcessorRegistry { public TopologyProcessor getProcessor(CloudEvent event) { String cloudEventType = getCloudEventType(event); switch (cloudEventType) { - case TiesConstants.CLOUD_EVENT_WITH_TYPE_CREATE -> { + case TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE -> { log.debug("Create CloudEvent received with id: {}", event.getId()); metrics.incrementNumReceivedCloudEventCreate(); return createTopologyProcessor; } - case TiesConstants.CLOUD_EVENT_WITH_TYPE_MERGE -> { + case TeivConstants.CLOUD_EVENT_WITH_TYPE_MERGE -> { log.debug("Merge CloudEvent received with id: {}", event.getId()); metrics.incrementNumReceivedCloudEventMerge(); return mergeTopologyProcessor; } - case TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE -> { + case TeivConstants.CLOUD_EVENT_WITH_TYPE_DELETE -> { log.debug("Delete CloudEvent received with id: {}", event.getId()); metrics.incrementNumReceivedCloudEventDelete(); return deleteTopologyProcessor; } - case TiesConstants.CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE -> { + case TeivConstants.CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE -> { log.debug("Source Entity Delete CloudEvent received with id: {}", event.getId()); metrics.incrementNumReceivedCloudEventSourceEntityDelete(); return sourceEntityDeleteTopologyProcessor; diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/BidiDbNameMapper.java b/teiv/src/main/java/org/oran/smo/teiv/schema/BidiDbNameMapper.java index 5cacbb2..3659c54 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/BidiDbNameMapper.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/BidiDbNameMapper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ public class BidiDbNameMapper { * @return the mapped DB name */ public static String getDbName(String name) { - if (!nameMap.containsKey(name)) { + if (nameMap == null || !nameMap.containsKey(name)) { return name; } return nameMap.get(name); diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/DataType.java b/teiv/src/main/java/org/oran/smo/teiv/schema/DataType.java index 7e72446..ab44d71 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/DataType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/DataType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,9 +29,9 @@ public enum DataType { BIGINT, CONTAINER, GEOGRAPHIC, - TIMESTAMPTZ, BYTEA, - RELIABILITY; + RELIABILITY, + TIMESTAMPTZ; public static DataType fromDbDataType(final String dbDatatype) { return switch (dbDatatype.toUpperCase(Locale.US)) { @@ -41,9 +41,9 @@ public enum DataType { case "BIGINT", "INT8" -> BIGINT; case "JSONB" -> CONTAINER; case "GEOGRAPHY" -> GEOGRAPHIC; - case "TIMESTAMPTZ" -> TIMESTAMPTZ; case "BYTEA" -> BYTEA; case "RELIABILITY" -> RELIABILITY; + case "TIMESTAMPTZ" -> TIMESTAMPTZ; default -> throw new IllegalStateException("Unexpected value: " + dbDatatype.toUpperCase(Locale.US)); }; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/EntityType.java b/teiv/src/main/java/org/oran/smo/teiv/schema/EntityType.java index fd17faa..513a834 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/EntityType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/EntityType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,23 +21,20 @@ package org.oran.smo.teiv.schema; import static org.jooq.impl.DSL.field; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.schema.BidiDbNameMapper.getDbName; import static org.oran.smo.teiv.schema.DataType.CONTAINER; import static org.oran.smo.teiv.schema.DataType.GEOGRAPHIC; -import static org.oran.smo.teiv.utils.TiesConstants.ATTRIBUTES_ABBREVIATION; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.CONSUMER_DATA_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.METADATA; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.REL_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.RESP_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.RI_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.ST_TO_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA; -import static org.oran.smo.teiv.utils.TiesConstants.SOURCE_IDS; +import static org.oran.smo.teiv.utils.TeivConstants.ATTRIBUTES_ABBREVIATION; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.CONSUMER_DATA_PREFIX; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.METADATA; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.ST_TO_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; import java.util.HashMap; import java.util.List; @@ -55,9 +52,6 @@ import org.oran.smo.teiv.exposure.spi.Module; @Value @Builder public class EntityType implements Persistable { - private static final String RELIABILITY_INDICATOR_COL = RI_PREFIX + "%s"; - private static final String RESPONSIBLE_ADAPTER_ID_COL = RESP_PREFIX + ID_COLUMN_NAME; - private static final String RESPONSIBLE_ADAPTER_COL = RESP_PREFIX + "%s"; @EqualsAndHashCode.Include String name; Map fields; @@ -68,7 +62,7 @@ public class EntityType implements Persistable { @Override public String getTableName() { - return String.format(TIES_DATA, getDbName(this.tableName)); + return String.format(TEIV_DATA, getDbName(this.tableName)); } @Override @@ -85,24 +79,21 @@ public class EntityType implements Persistable { @SuppressWarnings("java:S5738") public Map getSpecificAttributeColumns(List attributes) { final Map fieldList = new HashMap<>(); - this.fields.forEach((fieldName, dataType) -> { - if (!attributes.contains(fieldName) && !attributes.isEmpty()) { - return; - } - if (fieldName.startsWith(REL_PREFIX) || fieldName.startsWith(CONSUMER_DATA_PREFIX) || fieldName.equals( - ID_COLUMN_NAME)) { - return; - } + if (attributeNames.isEmpty()) { + return fieldList; + } + attributes.stream().filter(attributeNames::contains).forEach(attribute -> { + final DataType dataType = this.fields.get(attribute); if (GEOGRAPHIC.equals(dataType)) { fieldList.put(field(String.format(ST_TO_STRING, getTableName() + "." + String.format(QUOTED_STRING, - getDbName(fieldName)))).as(hashAlias( - getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + fieldName)), dataType); + getDbName(attribute)))).as(hashAlias( + getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + attribute)), dataType); } else if (CONTAINER.equals(dataType)) { - fieldList.put(field(getTableName() + "." + String.format(QUOTED_STRING, getDbName(fieldName)), JSONB.class) - .as(hashAlias(getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + fieldName)), dataType); + fieldList.put(field(getTableName() + "." + String.format(QUOTED_STRING, getDbName(attribute)), JSONB.class) + .as(hashAlias(getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + attribute)), dataType); } else { - fieldList.put(field(getTableName() + "." + String.format(QUOTED_STRING, getDbName(fieldName))).as(hashAlias( - getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + fieldName)), dataType); + fieldList.put(field(getTableName() + "." + String.format(QUOTED_STRING, getDbName(attribute))).as(hashAlias( + getFullyQualifiedName() + ATTRIBUTES_ABBREVIATION + attribute)), dataType); } }); return fieldList; @@ -133,33 +124,6 @@ public class EntityType implements Persistable { return getDbName(CONSUMER_DATA_PREFIX + DECORATORS); } - /** - * Gets the reliability indicator column name as String, for the given DB name of an attribute. - * - * @return the reliability indicator column as String - */ - public String getReliabilityColumnName(String attributeName) { - return getDbName(String.format(RELIABILITY_INDICATOR_COL, attributeName)); - } - - /** - * Gets the responsible adapter ID column name as String, for the given DB name. - * - * @return the responsible adapter column as String - */ - public String getResponsibleAdapterIdColumnName() { - return getDbName(RESPONSIBLE_ADAPTER_ID_COL); - } - - /** - * Gets the responsible adapter column name as String, for the given DB name of an attribute. - * - * @return the responsible adapter column as String - */ - public String getResponsibleAdapterAttributeColumnName(String attributeName) { - return getDbName(String.format(RESPONSIBLE_ADAPTER_COL, attributeName)); - } - @Override public String getMetadataColumnName() { return getDbName(METADATA); @@ -169,9 +133,4 @@ public class EntityType implements Persistable { public String getCategory() { return "entity"; } - - @Override - public String getUpdatedTimeColumnName() { - return getDbName(UPDATED_TIME); - } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/Persistable.java b/teiv/src/main/java/org/oran/smo/teiv/schema/Persistable.java index 7391ecd..9fa61f4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/Persistable.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/Persistable.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,9 @@ import org.jooq.Field; import org.jooq.JSONB; import static org.jooq.impl.DSL.field; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.utils.PersistableUtil.getFullyQualifiedNameWithColumnName; -import static org.oran.smo.teiv.utils.TiesConstants.*; +import static org.oran.smo.teiv.utils.TeivConstants.*; public interface Persistable { @@ -83,6 +83,8 @@ public interface Persistable { hashAlias(getFullyQualifiedNameWithColumnName(fullyQuelifiedName, CLASSIFIERS)))); result.add(field(getTableName() + "." + String.format(QUOTED_STRING, getDecoratorsColumnName()), JSONB.class).as( hashAlias(getFullyQualifiedNameWithColumnName(fullyQuelifiedName, DECORATORS)))); + result.add(field(getTableName() + "." + String.format(QUOTED_STRING, getMetadataColumnName()), JSONB.class).as( + hashAlias(getFullyQualifiedNameWithColumnName(fullyQuelifiedName, METADATA)))); return result; } @@ -126,11 +128,4 @@ public interface Persistable { * @return category as a String */ String getCategory(); - - /** - * Gets updatedTime column Name as String - * - * @return the String value of updated_time column - */ - String getUpdatedTimeColumnName(); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/PostgresSchemaLoader.java b/teiv/src/main/java/org/oran/smo/teiv/schema/PostgresSchemaLoader.java index 29a3797..b3bea78 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/PostgresSchemaLoader.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/PostgresSchemaLoader.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,9 +21,9 @@ package org.oran.smo.teiv.schema; import static org.oran.smo.teiv.schema.BidiDbNameMapper.getModelledName; -import static org.oran.smo.teiv.utils.TiesConstants.TEIV_DOMAIN; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_MODEL; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DOMAIN; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL; import static org.jooq.impl.DSL.field; import java.io.IOException; @@ -43,7 +43,7 @@ import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; import com.fasterxml.jackson.databind.ObjectMapper; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.Module; @Slf4j @@ -60,7 +60,7 @@ public class PostgresSchemaLoader extends SchemaLoader { @Override protected void loadBidiDbNameMapper() { log.debug("Start loading bidirectional DB name mapper"); - SelectJoinStep records = readWriteDataDslContext.select().from(String.format(TIES_MODEL, "hash_info")); + SelectJoinStep records = readWriteDataDslContext.select().from(String.format(TEIV_MODEL, "hash_info")); Map hash = new HashMap<>(); Map reverseHash = new HashMap<>(); records.forEach(entry -> { @@ -75,7 +75,7 @@ public class PostgresSchemaLoader extends SchemaLoader { public void loadModules() throws SchemaLoaderException { log.debug("Start loading modules"); SelectConditionStep moduleRecords = runMethodSafe(() -> readWriteDataDslContext.select().from(String.format( - TIES_MODEL, "module_reference")).where(field("name").isNotNull())); + TEIV_MODEL, "module_reference")).where(field("name").isNotNull())); Map moduleMap = new HashMap<>(); for (Record moduleRecord : moduleRecords) { JSONB includedModules = (JSONB) moduleRecord.get("includedModules"); @@ -105,10 +105,10 @@ public class PostgresSchemaLoader extends SchemaLoader { final String columnName = "column_name"; SelectConditionStep> tableDetails = runMethodSafe(() -> readWriteDataDslContext .select(field(tableName), field(columnName), field("udt_name")).from("information_schema.columns").where( - field("table_schema").equal(TIES_DATA_SCHEMA))); + field("table_schema").equal(TEIV_DATA_SCHEMA))); SelectJoinStep entityInfoRecords = runMethodSafe(() -> readWriteDataDslContext.select().from(String.format( - TIES_MODEL, "entity_info"))); + TEIV_MODEL, "entity_info"))); for (Record entityInfoRecord : entityInfoRecords) { String name = (String) entityInfoRecord.get("name"); @@ -145,7 +145,7 @@ public class PostgresSchemaLoader extends SchemaLoader { log.debug("Start loading relations"); List relationTypes = new ArrayList<>(); SelectJoinStep relationInfoResult = runMethodSafe(() -> readWriteDataDslContext.select().from(String.format( - TIES_MODEL, "relationship_info"))); + TEIV_MODEL, "relationship_info"))); for (Record entry : relationInfoResult) { //build associations Association aSideAssociation = Association.builder().name(((String) entry.get("aSideAssociationName"))) @@ -184,11 +184,11 @@ public class PostgresSchemaLoader extends SchemaLoader { private T runMethodSafe(Supplier supp) { try { return supp.get(); - } catch (TiesException ex) { + } catch (TeivException ex) { throw ex; } catch (Exception ex) { log.error("Sql exception during query execution", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/RelationType.java b/teiv/src/main/java/org/oran/smo/teiv/schema/RelationType.java index 4cb3c9c..9d8a85e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/RelationType.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/RelationType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,20 +20,18 @@ */ package org.oran.smo.teiv.schema; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.schema.BidiDbNameMapper.getDbName; import static org.oran.smo.teiv.schema.RelationshipDataLocation.RELATION; import static org.jooq.impl.DSL.field; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.CONSUMER_DATA_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.METADATA; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.REL_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.RESP_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.SOURCE_IDS; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.CONSUMER_DATA_PREFIX; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.METADATA; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA; import org.oran.smo.teiv.exposure.spi.Module; import java.util.List; @@ -54,10 +52,6 @@ public class RelationType implements Persistable { private static final String REL_CLASSIFIERS_COL_PREFIX = "REL_CD_classifiers_%s"; private static final String REL_DECORATORS_COL_PREFIX = "REL_CD_decorators_%s"; private static final String REL_METADATA_COL_PREFIX = "REL_metadata_%s"; - private static final String REL_UPDATETIME_COL_PREFIX = "REL_updated_time_%s"; - private static final String RESPONSIBLE_ADAPTER_ID_COL = RESP_PREFIX + ID_COLUMN_NAME; - private static final String REL_RESPONSIBLE_ADAPTER_ID_COL_PREFIX = REL_PREFIX + RESP_PREFIX + ID_COLUMN_NAME + "_%s"; - public static final String UPDATED_TIME = "updated_time"; String name; Association aSideAssociation; @@ -72,7 +66,7 @@ public class RelationType implements Persistable { @Override public String getTableName() { - return String.format(TIES_DATA, getDbName(this.tableName)); + return String.format(TEIV_DATA, getDbName(this.tableName)); } @Override @@ -109,19 +103,6 @@ public class RelationType implements Persistable { return result; } - /** - * Gets the responsible adapter ID column name as String, for the given DB name. - * - * @return the responsible adapter column as String - */ - public String getResponsibleAdapterIdColumnName() { - if (relationshipStorageLocation.equals(RELATION)) { - return getDbName(RESPONSIBLE_ADAPTER_ID_COL); - } else { - return getDbName(String.format(REL_RESPONSIBLE_ADAPTER_ID_COL_PREFIX, name)); - } - } - /** * Gets id, aSide and bSide column name of the relation. * @@ -236,13 +217,4 @@ public class RelationType implements Persistable { public String getCategory() { return "relationship"; } - - @Override - public String getUpdatedTimeColumnName() { - if (relationshipStorageLocation.equals(RELATION)) { - return getDbName(UPDATED_TIME); - } else { - return getDbName(String.format(REL_UPDATETIME_COL_PREFIX, name)); - } - } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java b/teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java index ab2e3f1..b15bba1 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.schema; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; import org.jooq.EnumType; import org.jooq.Schema; @@ -39,7 +39,7 @@ public enum Reliability implements EnumType { @Override public Schema getSchema() { - return new SchemaImpl(TIES_DATA_SCHEMA); + return new SchemaImpl(TEIV_DATA_SCHEMA); } @Override diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java b/teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java index 8c2affd..0fca3ef 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.schema; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import lombok.Value; import java.nio.charset.StandardCharsets; @@ -28,14 +28,14 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import static org.oran.smo.teiv.schema.BidiDbNameMapper.getDbName; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.RESPONSIBLE_ADAPTER; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.RESPONSIBLE_ADAPTER; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA; @Value public class ResponsibleAdapter { - private static final String RESPONSIBLE_ADAPTER_TABLE_NAME = String.format(TIES_DATA, getDbName(RESPONSIBLE_ADAPTER)); + private static final String RESPONSIBLE_ADAPTER_TABLE_NAME = String.format(TEIV_DATA, getDbName(RESPONSIBLE_ADAPTER)); String id; byte[] hashedId; @@ -61,7 +61,7 @@ public class ResponsibleAdapter { try { return MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException exception) { - throw TiesException.serverException("Invalid Hashing algorithm", "Error while hashing alias", exception); + throw TeivException.serverException("Invalid Hashing algorithm", "Error while hashing alias", exception); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java index 663ed3d..840bbde 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,8 +25,10 @@ import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_ import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -42,8 +44,8 @@ import lombok.experimental.UtilityClass; import jakarta.annotation.Nullable; -import org.oran.smo.teiv.utils.TiesConstants; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.utils.TeivConstants; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.Module; @Slf4j @@ -75,7 +77,7 @@ public class SchemaRegistry { * @return the {@link Module} */ public static Module getModuleByName(String name) { - return Optional.ofNullable(moduleRegistry.get(name)).orElseThrow(() -> TiesException.unknownModule(name)); + return Optional.ofNullable(moduleRegistry.get(name)).orElseThrow(() -> TeivException.unknownModule(name)); } /** @@ -87,7 +89,7 @@ public class SchemaRegistry { */ public static Module getModuleByDomain(String domain) { return moduleRegistry.values().stream().filter(module -> module.getDomain() != null && module.getDomain().equals( - domain)).findFirst().orElseThrow(() -> TiesException.unknownDomain(domain, getDomains())); + domain)).findFirst().orElseThrow(() -> TeivException.unknownDomain(domain, getDomains())); } /** @@ -155,7 +157,7 @@ public class SchemaRegistry { /** * Gets the {@link EntityType} by the given module name and the entity type name. - * Since TIES supports TEIV as top level domain on the exposure side, there is possibility to return more than one + * Since TEIV supports TEIV as top level domain on the exposure side, there is possibility to return more than one * EntityType for a given name * with domain as TIEV. * @@ -350,13 +352,16 @@ public class SchemaRegistry { } public static List getAssociationNamesByEntityName(final String entityName) { - return getRelationTypesByEntityName(entityName).stream().map(relationType -> { + List associations = new ArrayList<>(); + getRelationTypesByEntityName(entityName).stream().forEach(relationType -> { if (relationType.getASide().getName().equals(entityName)) { - return relationType.getASideAssociation().getName(); - } else { - return relationType.getBSideAssociation().getName(); + associations.add(relationType.getASideAssociation().getName()); } - }).toList(); + if (relationType.getBSide().getName().equals(entityName)) { + associations.add(relationType.getBSideAssociation().getName()); + } + }); + return associations; } /** @@ -408,10 +413,10 @@ public class SchemaRegistry { public static String getReferenceColumnName(RelationType relationType) { if (relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.A_SIDE)) { - return Objects.requireNonNull(relationType).getTableName() + "." + String.format(TiesConstants.QUOTED_STRING, + return Objects.requireNonNull(relationType).getTableName() + "." + String.format(TeivConstants.QUOTED_STRING, relationType.bSideColumnName()); } else if (relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.B_SIDE)) { - return Objects.requireNonNull(relationType).getTableName() + "." + String.format(TiesConstants.QUOTED_STRING, + return Objects.requireNonNull(relationType).getTableName() + "." + String.format(TeivConstants.QUOTED_STRING, relationType.aSideColumnName()); } return Objects.requireNonNull(relationType).getTableName() + "." + relationType.getIdColumnName(); @@ -424,4 +429,30 @@ public class SchemaRegistry { } return relationType.getBSide(); } + + public static EntityType getAssociationSideEntity(String associationName) { + RelationType relationType = getRelationTypes().stream().filter(relation -> (relation.getASideAssociation().getName() + .equals(associationName) || relation.getBSideAssociation().getName().equals(associationName))).findFirst() + .orElseGet(() -> { + log.warn("Unknown association name {}", associationName); + return null; + }); + return relationType.getASideAssociation().getName().equals(associationName) ? + relationType.getBSide() : + relationType.getASide(); + } + + public static Set getAllEntityForAssociation(String associationName) { + Set entities = new HashSet<>(); + + getRelationTypes().stream().forEach(relation -> { + if (relation.getASideAssociation().getName().equals(associationName) || relation.getBSideAssociation().getName() + .equals(associationName)) { + entities.add(relation.getASide()); + entities.add(relation.getBSide()); + } + }); + entities.remove(getAssociationSideEntity(associationName)); + return entities; + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java index cb927e0..7b48051 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,5 +27,5 @@ public enum SchemaRegistryErrorCode { ENTITY_NOT_FOUND_IN_DOMAIN, ENTITY_NOT_FOUND_IN_MODULE, RELATIONSHIP_NOT_FOUND_IN_DOMAIN, - RELATIONSHIP_NOT_FOUND_IN_MODULE, + RELATIONSHIP_NOT_FOUND_IN_MODULE } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/RelationshipMergeValidator.java b/teiv/src/main/java/org/oran/smo/teiv/service/RelationshipMergeValidator.java index c324afe..3881cd4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/RelationshipMergeValidator.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/RelationshipMergeValidator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ package org.oran.smo.teiv.service; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.service.cloudevent.data.Relationship; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; import org.springframework.stereotype.Component; import org.jooq.Record; diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java similarity index 82% rename from teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java rename to teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java index 6f1f13b..3acb2bd 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,25 +20,24 @@ */ package org.oran.smo.teiv.service; +import static org.jooq.impl.DSL.jsonbExists; import static org.oran.smo.teiv.schema.BidiDbNameMapper.getDbName; import static org.oran.smo.teiv.schema.RelationshipDataLocation.B_SIDE; import static org.oran.smo.teiv.schema.RelationshipDataLocation.RELATION; +import static org.oran.smo.teiv.service.TeivMetadataResolver.APPEND_QUERY; +import static org.oran.smo.teiv.service.TeivMetadataResolver.getMetadataForInferredEntity; import static org.oran.smo.teiv.service.models.OperationResult.ENTITY_CATEGORY; import static org.oran.smo.teiv.service.models.OperationResult.RELATIONSHIP_CATEGORY; import static org.oran.smo.teiv.utils.JooqTypeConverter.toJsonb; -import static org.oran.smo.teiv.utils.TiesConstants.FOREIGN_KEY_VIOLATION_ERROR_CODE; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.RELIABILITY_INDICATOR; -import static org.oran.smo.teiv.utils.TiesConstants.UNIQUE_CONSTRAINT_VIOLATION_CODE; +import static org.oran.smo.teiv.utils.TeivConstants.FOREIGN_KEY_VIOLATION_ERROR_CODE; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.UNIQUE_CONSTRAINT_VIOLATION_CODE; import static org.jooq.impl.DSL.field; -import static org.jooq.impl.DSL.jsonExists; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.table; import static org.jooq.impl.SQLDataType.OTHER; -import java.sql.Timestamp; -import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -57,10 +56,9 @@ import org.oran.smo.teiv.exception.IllegalOneToManyRelationshipUpdateException; import org.jooq.Configuration; import org.jooq.Condition; import org.jooq.DSLContext; -import org.jooq.JSON; import org.jooq.exception.DataAccessException; -import org.oran.smo.teiv.exception.TiesException; -import org.oran.smo.teiv.schema.Reliability; +import org.oran.smo.teiv.exception.TeivException; +import org.oran.smo.teiv.schema.Persistable; import org.oran.smo.teiv.schema.ResponsibleAdapter; import org.oran.smo.teiv.utils.JooqTypeConverter; import org.springframework.stereotype.Component; @@ -82,22 +80,21 @@ import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; import org.oran.smo.teiv.service.cloudevent.data.Relationship; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.oran.smo.teiv.utils.schema.Geography; @Component @RequiredArgsConstructor -public class TiesDbOperations { +public class TeivDbOperations { - private static final Map RELIABILITY_INDICATOR_OK_MAP = Map.of(RELIABILITY_INDICATOR, Reliability.OK - .name()); - - private final TiesDbService tiesDbService; + private final TeivDbService teivDbService; private final IngestionOperationValidatorFactory ingestionOperationValidatorFactory; private final RelationshipMergeValidator relationshipMergeValidator; + private final TeivMetadataResolver teivMetadataResolver; + /** * Insert or update a row in the given table. *

@@ -106,20 +103,18 @@ public class TiesDbOperations { * * @param context * The context where the database operation should be executed - * @param tableName - * Name of the database table to use. + * @param objectType + * The type of object being ingested. * @param values * A map of column name and value pairs. The value is converted to the corresponding Postgres type based on the * dynamic type of the value. For * example: <"column1", 5L> means that the value 5 should be inserted to the column1 as a BIGINT. - * @param updatedTimeColumnName - * Name of the database column for entity update time. - * A boolean to indicate if the reliabilityIndicator of the entity to be set to OK? * @return Xmax value, if 0 it was a insert, if greater than 0 it was an update, if -1 that means we didn't get the xmax * value back after the operation. */ - public int merge(DSLContext context, String tableName, Map values, String updatedTimeColumnName) { + public int merge(DSLContext context, Persistable objectType, Map values) { + final String tableName = objectType.getTableName(); Map valuesToInsert = new HashMap<>(values.size()); values.forEach((key, value) -> { if ((value instanceof Geography)) { @@ -133,10 +128,16 @@ public class TiesDbOperations { Map valuesToUpdate = new HashMap<>(valuesToInsert); valuesToUpdate.remove(ID_COLUMN_NAME); - if (valuesToUpdate.isEmpty()) { + if (valuesToUpdate.isEmpty()) {//If there is no data in this event then only do a DB insert, no DB update. return context.insertInto(table(tableName)).set(valuesToInsert).onConflict(field(ID_COLUMN_NAME)).doNothing() .execute() > 0 ? 0 : -1; } + if (values.containsKey(objectType.getMetadataColumnName())) { + final String sqlConcatJsonb = String.format(APPEND_QUERY, tableName, objectType.getMetadataColumnName(), + toJsonb(values.get(objectType.getMetadataColumnName()))); + valuesToUpdate.put(objectType.getMetadataColumnName(), field(sqlConcatJsonb, JSONB.class)); + } + //Do an insert or update depending on conflict Record fetch = context.insertInto(table(tableName)).set(valuesToInsert).onConflict(field(ID_COLUMN_NAME)).doUpdate() .set(valuesToUpdate).returning(field("xmax", int.class)).fetchOne(); if (fetch != null) { @@ -174,7 +175,8 @@ public class TiesDbOperations { int updateResult = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))) .set(field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) - .where(field(String.format(QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).execute(); + .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String + .format(QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).execute(); return updateResult > 0 ? relationshipList : List.of(); } @@ -185,11 +187,11 @@ public class TiesDbOperations { String oneSideEntityIdColumn = relationType.getRelationshipStorageLocation().equals(B_SIDE) ? relationType.aSideColumnName() : relationType.bSideColumnName(); - int affectedRows = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))).set( field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) - .where(field(String.format(QUOTED_STRING, relationType.getIdColumnName())).eq(relationshipId)).execute(); + .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String + .format(QUOTED_STRING, relationType.getIdColumnName())).eq(relationshipId)).execute(); return affectedRows > 0 ? Optional.of(OperationResult.builder().id(relationshipId).type(relationType.getName()).category( RELATIONSHIP_CATEGORY).build()) : @@ -200,8 +202,8 @@ public class TiesDbOperations { String entityId, String aSideColumnName, String bSideColumnName) { List deletedIds = context.delete(table((relationType.getTableName()))).where(field(String.format( QUOTED_STRING, aSideColumnName)).eq(entityId).or(field(String.format(QUOTED_STRING, bSideColumnName)).eq( - entityId))).returning(field(TiesConstants.ID_COLUMN_NAME)).fetch().getValues(field( - TiesConstants.ID_COLUMN_NAME), String.class); + entityId))).returning(field(TeivConstants.ID_COLUMN_NAME)).fetch().getValues(field( + TeivConstants.ID_COLUMN_NAME), String.class); return deletedIds.stream().map(id -> OperationResult.builder().id(id).type(relationType.getName()).category( RELATIONSHIP_CATEGORY).build()).collect(Collectors.toList()); @@ -221,22 +223,22 @@ public class TiesDbOperations { String sourceAdapter) throws InvalidFieldInYangDataException, MaximumCardinalityViolationException { List> dbOperations = new ArrayList<>(); List results = new ArrayList<>(); - Timestamp updateTime = Timestamp.from(Instant.now()); ResponsibleAdapter responsibleAdapter = new ResponsibleAdapter(sourceAdapter); byte[] respAdapterHash = responsibleAdapter.getHashedId(); + dbOperations.add(getResponsibleAdapterOperation(responsibleAdapter)); for (Entity entity : parsedCloudEventData.getEntities()) { - dbOperations.add(getEntityOperation(entity, results, updateTime, respAdapterHash)); + dbOperations.add(getEntityOperation(entity, results, respAdapterHash)); } for (Relationship relationship : parsedCloudEventData.getRelationships()) { - dbOperations.addAll(getRelationshipOperations(relationship, results, updateTime, respAdapterHash)); + dbOperations.addAll(getRelationshipOperations(relationship, results, respAdapterHash)); } dbOperations.add(dslContext -> ingestionOperationValidatorFactory.createValidator(dslContext).validate( parsedCloudEventData)); - tiesDbService.execute(dbOperations); + teivDbService.execute(dbOperations); return results; } - public Consumer getResponsibleAdapterOperation(ResponsibleAdapter responsibleAdapter) throws TiesException { + public Consumer getResponsibleAdapterOperation(ResponsibleAdapter responsibleAdapter) throws TeivException { Map dbMap = new HashMap<>(); dbMap.put(responsibleAdapter.getIdColumnName(), responsibleAdapter.getId()); @@ -248,16 +250,15 @@ public class TiesDbOperations { public List selectByCmHandleFormSourceIds(DSLContext context, String tableName, String cmHandle) { String path = String.format("$[*] ? (@ == \"urn:cmHandle:%s\")", cmHandle); - return context.select(field(String.format(QUOTED_STRING, "id"), String.class)).from(tableName).where(jsonExists( - field(String.format(QUOTED_STRING, "CD_sourceIds"), JSON.class), path)).orderBy(field(String.format( + return context.select(field(String.format(QUOTED_STRING, "id"), String.class)).from(tableName).where(jsonbExists( + field(String.format(QUOTED_STRING, "CD_sourceIds"), JSONB.class), path)).orderBy(field(String.format( QUOTED_STRING, "id"))).fetch().getValues(field(String.format(QUOTED_STRING, "id"), String.class)); } - private Consumer getEntityOperation(Entity entity, List results, Timestamp updateTime, - byte[] respAdapterHash) throws InvalidFieldInYangDataException { + private Consumer getEntityOperation(Entity entity, List results, byte[] respAdapterHash) + throws InvalidFieldInYangDataException { EntityType entityType = SchemaRegistry.getEntityTypeByName(entity.getType()); Map fieldsFromModel = entityType.getFields(); - HashMap metadata = new HashMap<>(); Map dbMap = new HashMap<>(); List resultExclusion = new ArrayList<>(); for (Map.Entry entry : entity.getAttributes().entrySet()) { @@ -271,22 +272,21 @@ public class TiesDbOperations { switch (dataType) { case GEOGRAPHIC -> dbMap.put(dbName, JooqTypeConverter.toGeography(entry.getValue())); case CONTAINER -> dbMap.put(dbName, toJsonb(entry.getValue())); - case PRIMITIVE, DECIMAL, INTEGER, BIGINT, TIMESTAMPTZ, BYTEA -> dbMap.put(dbName, entry.getValue()); + case PRIMITIVE, DECIMAL, INTEGER, BIGINT, BYTEA -> dbMap.put(dbName, entry.getValue()); } } dbMap.put(ID_COLUMN_NAME, entity.getId()); if (entity.getSourceIds() != null) { dbMap.put(entityType.getSourceIdsColumnName(), toJsonb(entity.getSourceIds())); } - return dslContext -> { - int xmax = merge(dslContext, entityType.getTableName(), dbMap, entityType.getUpdatedTimeColumnName()); + final Map metadata = teivMetadataResolver.setEntityMetadataChangeInDbMap(dslContext, entityType, + entity, dbMap); + int xmax = merge(dslContext, entityType, dbMap); if (xmax >= 0) { boolean isUpdatedInDb = xmax != 0; dbMap.remove(ID_COLUMN_NAME); dbMap.remove(entityType.getSourceIdsColumnName()); - dbMap.remove(entityType.getUpdatedTimeColumnName()); - dbMap.remove(entityType.getResponsibleAdapterIdColumnName()); dbMap.remove(entityType.getMetadataColumnName()); resultExclusion.forEach(dbMap::remove); results.add(OperationResult.builder().id(entity.getId()).type(entity.getType()).category(ENTITY_CATEGORY) @@ -298,7 +298,7 @@ public class TiesDbOperations { } private List> getRelationshipOperations(Relationship relationship, List results, - Timestamp updateTime, byte[] respAdapterByteArray) { + byte[] respAdapterByteArray) { List> relationshipOperations = new ArrayList<>(); RelationType relationType = SchemaRegistry.getRelationTypeByName(relationship.getType()); RelationshipDataLocation relationshipDataLocation = relationType.getRelationshipStorageLocation(); @@ -317,7 +317,7 @@ public class TiesDbOperations { relationship, results, relationType, dbMap)); } catch (DataAccessException e) { if (e.sqlState().equals(FOREIGN_KEY_VIOLATION_ERROR_CODE)) { - createMissingEntities(outer, relationship, relationType, results, updateTime, respAdapterByteArray); + createMissingEntities(outer, relationship, relationType, results, respAdapterByteArray); mergeManyToManyRelationship(outer, relationship, results, relationType, dbMap); } else { throw e; @@ -326,16 +326,17 @@ public class TiesDbOperations { }); } else { relationshipOperations.add(dslContext -> mergeOneToManyOrOneToOneRelationship(dslContext, relationship, results, - relationType, dbMap, updateTime, respAdapterByteArray)); + relationType, dbMap, respAdapterByteArray)); } return relationshipOperations; } private void mergeOneToManyOrOneToOneRelationship(DSLContext dslContext, Relationship relationship, - List results, RelationType relationType, Map dbMap, Timestamp updateTime, + List results, RelationType relationType, Map dbMap, byte[] respAdapterByteArray) { AtomicBoolean isManySideEntityMissingAtTheBeginning = new AtomicBoolean(false); + final Map metadataMissingEntity = getMetadataForInferredEntity(); try { dslContext.dsl().transaction((Configuration nested) -> updateRelationshipInEntityTable(nested.dsl(), relationship, relationType, dbMap).ifPresentOrElse(results::add, () -> { @@ -344,10 +345,10 @@ public class TiesDbOperations { ID_COLUMN_NAME, relationship.getStoringSideEntityId(), dslContext); if (manySideRow == null) { isManySideEntityMissingAtTheBeginning.set(true); - createMissingStoringSideEntity(dslContext, relationship, relationType, updateTime, - respAdapterByteArray); + createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, + metadataMissingEntity); addEntityToOperationResults(results, relationship.getStoringSideEntityId(), - RELIABILITY_INDICATOR_OK_MAP, relationType.getStoringSideEntityType().getName()); + metadataMissingEntity, relationType.getStoringSideEntityType().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse( results::add, () -> { throw new IllegalOneToManyRelationshipUpdateException(relationship, true); @@ -361,13 +362,14 @@ public class TiesDbOperations { throw new UniqueRelationshipIdConstraintException(relationship); } else if (e.sqlState().equals(FOREIGN_KEY_VIOLATION_ERROR_CODE)) { if (isManySideEntityMissingAtTheBeginning.get()) { - createMissingStoringSideEntity(dslContext, relationship, relationType, updateTime, - respAdapterByteArray); - addEntityToOperationResults(results, relationship.getStoringSideEntityId(), - RELIABILITY_INDICATOR_OK_MAP, relationType.getStoringSideEntityType().getName()); + createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, + metadataMissingEntity); + addEntityToOperationResults(results, relationship.getStoringSideEntityId(), metadataMissingEntity, + relationType.getStoringSideEntityType().getName()); } - createMissingNotStoringSideEntity(dslContext, relationship, relationType, updateTime, respAdapterByteArray); - addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), RELIABILITY_INDICATOR_OK_MAP, + createMissingNotStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray, + metadataMissingEntity); + addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), metadataMissingEntity, relationType.getNotStoringSideEntityType().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse(results::add, () -> { @@ -381,6 +383,8 @@ public class TiesDbOperations { private Optional updateRelationshipInEntityTable(DSLContext dslContext, Relationship relationship, RelationType relationType, Map values) { + final Map metadata = teivMetadataResolver.setRelationMetadataChangeInDbMap(dslContext, relationType, + relationship, values); Condition condition = field(ID_COLUMN_NAME).eq(relationship.getStoringSideEntityId()).and(field(name(relationType .getIdColumnName())).isNull().or(field(name(relationType.getIdColumnName())).eq(relationship.getId()).and( field(name(relationType.getNotStoringSideEntityIdColumnNameInStoringSideTable())).eq(relationship @@ -394,8 +398,7 @@ public class TiesDbOperations { boolean isUpdatedInDb = fetch.getValue("xmax", int.class) != 0; return Optional.of(OperationResult.builder().id(relationship.getId()).type(relationship.getType()).category( RELATIONSHIP_CATEGORY).aSide(relationship.getASide()).bSide(relationship.getBSide()).sourceIds( - relationship.getSourceIds()).isUpdatedInDb(isUpdatedInDb).metadata(RELIABILITY_INDICATOR_OK_MAP) - .build()); + relationship.getSourceIds()).isUpdatedInDb(isUpdatedInDb).metadata(metadata).build()); } return Optional.empty(); } @@ -418,8 +421,11 @@ public class TiesDbOperations { private void mergeManyToManyRelationship(DSLContext dslContext, Relationship relationship, List results, RelationType relationType, Map valuesToInsert) { + final Map valuesToUpdate = new HashMap<>(valuesToInsert); + final Map metadata = teivMetadataResolver.setRelationMetadataChangeInDbMap(dslContext, relationType, + relationship, valuesToUpdate); + valuesToInsert.put(relationType.getMetadataColumnName(), toJsonb(metadata)); String primaryKeyColumn = relationType.getIdColumnName(); - Map valuesToUpdate = new HashMap<>(valuesToInsert); valuesToUpdate.remove(primaryKeyColumn); Record fetch = dslContext.insertInto(table(relationType.getTableName())).set(valuesToInsert).onConflict(field( primaryKeyColumn)).doUpdate().set(valuesToUpdate).where(field(relationType.getTableName() + "." + name( @@ -430,30 +436,30 @@ public class TiesDbOperations { boolean isUpdatedInDb = fetch.getValue("xmax", int.class) != 0; results.add(OperationResult.builder().id(relationship.getId()).type(relationship.getType()).category( RELATIONSHIP_CATEGORY).aSide(relationship.getASide()).bSide(relationship.getBSide()).sourceIds( - relationship.getSourceIds()).isUpdatedInDb(isUpdatedInDb).metadata(RELIABILITY_INDICATOR_OK_MAP) - .build()); + relationship.getSourceIds()).isUpdatedInDb(isUpdatedInDb).metadata(metadata).build()); } else { throw new IllegalManyToManyRelationshipUpdateException(relationship); } } private void createMissingEntities(DSLContext dslContext, Relationship relationship, RelationType relationType, - List results, Timestamp updateTime, byte[] respAdapterByteArray) { + List results, byte[] respAdapterByteArray) { String aSideTableName = relationType.getASide().getTableName(); String aSideId = relationship.getASide(); String bSideTableName = relationType.getBSide().getTableName(); String bSideId = relationship.getBSide(); String relationshipId = relationship.getId(); + final Map metadata = TeivMetadataResolver.getMetadataForInferredEntity(); - if (createMissingEntity(aSideTableName, aSideId, relationshipId, dslContext, relationType.getASide(), updateTime, - respAdapterByteArray) == 1) { + if (createMissingEntity(aSideTableName, aSideId, relationshipId, dslContext, relationType.getASide(), + respAdapterByteArray, metadata) == 1) { results.add(OperationResult.builder().id(aSideId).type(relationType.getASide().getName()).category( - ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).build()); + ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build()); } - if (createMissingEntity(bSideTableName, bSideId, relationshipId, dslContext, relationType.getBSide(), updateTime, - respAdapterByteArray) == 1) { + if (createMissingEntity(bSideTableName, bSideId, relationshipId, dslContext, relationType.getBSide(), + respAdapterByteArray, metadata) == 1) { results.add(OperationResult.builder().id(bSideId).type(relationType.getBSide().getName()).category( - ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).build()); + ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build()); } } @@ -479,23 +485,24 @@ public class TiesDbOperations { } private int createMissingEntity(String entityTableName, String entityId, String relationshipId, DSLContext dslContext, - EntityType entityType, Timestamp updateTime, byte[] respAdapterByteArray) { + EntityType entityType, byte[] respAdapterByteArray, Map metadata) { final JSONB sourceIds = toJsonb(relationshipId); return dslContext.insertInto(table(entityTableName)).set(field(name(ID_COLUMN_NAME)), entityId).set(field(name( - entityType.getSourceIdsColumnName())), sourceIds).onConflictDoNothing().execute(); + entityType.getSourceIdsColumnName())), sourceIds).set(field(name(entityType.getMetadataColumnName())), + toJsonb(metadata)).onConflictDoNothing().execute(); } private void createMissingNotStoringSideEntity(DSLContext dslContext, Relationship relationship, - RelationType relationType, Timestamp updateTime, byte[] respAdapterByteArray) { + RelationType relationType, byte[] respAdapterByteArray, Map metadata) { createMissingEntity(relationType.getNotStoringSideTableName(), relationship.getNotStoringSideEntityId(), - relationship.getId(), dslContext, relationType.getNotStoringSideEntityType(), updateTime, - respAdapterByteArray); + relationship.getId(), dslContext, relationType.getNotStoringSideEntityType(), respAdapterByteArray, + metadata); } private void createMissingStoringSideEntity(DSLContext dslContext, Relationship relationship, RelationType relationType, - Timestamp updateTime, byte[] respAdapterByteArray) { + byte[] respAdapterByteArray, Map metadata) { createMissingEntity(relationType.getTableName(), relationship.getStoringSideEntityId(), relationship.getId(), - dslContext, relationType.getStoringSideEntityType(), updateTime, respAdapterByteArray); + dslContext, relationType.getStoringSideEntityType(), respAdapterByteArray, metadata); } private Record selectColumnsByIdForUpdate(List columnNames, String tableName, String idFieldName, diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbService.java b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbService.java similarity index 88% rename from teiv/src/main/java/org/oran/smo/teiv/service/TiesDbService.java rename to teiv/src/main/java/org/oran/smo/teiv/service/TeivDbService.java index 82e9c82..594572a 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/TeivDbService.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,11 +29,11 @@ import org.jooq.impl.DSL; import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Service; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.ingestion.DeadlockRetryPolicy; import org.oran.smo.teiv.ingestion.validation.MaximumCardinalityViolationException; import org.oran.smo.teiv.utils.RetryOperationUtils; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -41,7 +41,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -public class TiesDbService { +public class TeivDbService { private final DSLContext readDataDslContext; private final DSLContext writeDataDslContext; private final DeadlockRetryPolicy deadlockRetryPolicy; @@ -66,14 +66,14 @@ public class TiesDbService { private T runMethodSafe(Supplier supp) { try { return supp.get(); - } catch (TiesException | MaximumCardinalityViolationException ex) { + } catch (TeivException | MaximumCardinalityViolationException ex) { throw ex; - } catch (TiesPathException ex) { + } catch (TeivPathException ex) { log.error("Exception during query construction", ex); throw ex; } catch (Exception ex) { log.error("Sql exception during query execution", ex); - throw TiesException.serverSQLException(); + throw TeivException.serverSQLException(); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/TeivMetadataResolver.java b/teiv/src/main/java/org/oran/smo/teiv/service/TeivMetadataResolver.java new file mode 100644 index 0000000..8b5f735 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/service/TeivMetadataResolver.java @@ -0,0 +1,231 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.teiv.service; + +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.jsonbGetAttributeAsText; +import static org.jooq.impl.DSL.quotedName; +import static org.jooq.impl.DSL.name; +import static org.jooq.impl.DSL.table; +import static org.oran.smo.teiv.utils.JooqTypeConverter.toJsonb; +import static org.oran.smo.teiv.utils.TeivConstants.RELIABILITY_INDICATOR; + +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jooq.DSLContext; +import org.jooq.Field; +import org.jooq.JSONB; +import org.jooq.Record; +import org.oran.smo.teiv.schema.EntityType; +import org.oran.smo.teiv.schema.RelationType; +import org.oran.smo.teiv.schema.RelationshipDataLocation; +import org.oran.smo.teiv.schema.Reliability; +import org.oran.smo.teiv.service.cloudevent.data.Entity; +import org.oran.smo.teiv.service.cloudevent.data.Relationship; +import org.springframework.stereotype.Component; + +@Component +public class TeivMetadataResolver { + static final String FIRST_DISCOVERED = "firstDiscovered"; + static final String LAST_MODIFIED = "lastModified"; + public static final String APPEND_QUERY = "%s.\"%s\" || '%s'"; + + /** + * Determines what changes are needed to metadata of provided entity with respect to reliabilityIndicator, + * firstDiscovered and lastModified. These changes are put in a metadata map, and this metadata map is put in the + * provided + * DB map with the metadata column name as its key. + * In other words, the following entry will be put in the provided DB map: + * metadata -> [reliabilityIndicator -> OK, + * firstDiscovered -> , lastModified -> ] + * In addition, this metadata change map will be returned by this method. + * Note: reliabilityIndicator and firstDiscovered will only be included in the metadata map IF NEEDED. The map will + * always include lastModified at least. + * + * @param dslContext + * The DSL context + * @param entityType + * The type of entity being ingested + * @param entity + * The entity being ingested + * @param dbMap + * The map of DB column names to values to be merged + * @return The metadata change. + */ + public Map setEntityMetadataChangeInDbMap(DSLContext dslContext, EntityType entityType, Entity entity, + Map dbMap) { + final List attribReliabilityColumnsToGet = new ArrayList<>(); + final List attributesNotIngested = new ArrayList<>(entityType.getAttributeNames()); + attributesNotIngested.removeIf(attribute -> entity.getAttributes().containsKey(attribute)); + final Record record = selectEntityDataForMetadataResolution(entityType, entity, attribReliabilityColumnsToGet, + dslContext); + final HashMap metadataChange = new HashMap<>(); + final String utcTime = getUtcTimeNow(); + final boolean isNewEntity = isNewDbObject(record); + if (isNewEntity) { + metadataChange.put(RELIABILITY_INDICATOR, Reliability.OK); + metadataChange.put(FIRST_DISCOVERED, utcTime); + metadataChange.put(LAST_MODIFIED, utcTime); + } else { + if (isEntityReliabilityToBeSetOk(record, attribReliabilityColumnsToGet)) { + metadataChange.put(RELIABILITY_INDICATOR, Reliability.OK); + } + metadataChange.put(LAST_MODIFIED, utcTime); + } + dbMap.put(entityType.getMetadataColumnName(), metadataChange); + return metadataChange; + } + + /** + * Determines what changes are needed to metadata of provided relationship with respect to reliabilityIndicator, + * firstDiscovered and lastModified. These changes are put in a metadata map, and this metadata map is put in the + * provided + * DB map with the metadata column name as its key. + * In other words, the following entry will be put in the provided DB map: + * metadata -> [reliabilityIndicator -> OK, + * firstDiscovered -> , lastModified -> ] + * In addition, this metadata change map will be returned by this method. + * Note: reliabilityIndicator and firstDiscovered will only be included in the metadata map IF NEEDED. The map will + * always include lastModified at least. + * + * @param dslContext + * The DSL context + * @param relationType + * The type of relationship being ingested + * @param relationship + * The relationship being ingested + * @param dbMap + * The map of DB column names to values to be merged + * @return The metadata change. + */ + public Map setRelationMetadataChangeInDbMap(DSLContext dslContext, RelationType relationType, + Relationship relationship, Map dbMap) { + final HashMap metadataChange = new HashMap<>(); + final String tableName = relationType.getTableName(); + final String metadataColumnName = relationType.getMetadataColumnName(); + Record record; + if (relationType.getRelationshipStorageLocation() == RelationshipDataLocation.RELATION) { + record = selectRelationshipDataForMetadataResolution(tableName, relationType.getIdColumnName(), relationship + .getId(), metadataColumnName, dslContext); + } else { + record = selectRelationshipDataForMetadataResolution(tableName, relationType.getStoringSideEntityType() + .getIdColumnName(), relationship.getStoringSideEntityId(), metadataColumnName, dslContext); + } + final boolean isNewRelationship = isNewDbObject(record); + if (isNewRelationship) { + metadataChange.put(RELIABILITY_INDICATOR, Reliability.OK); + metadataChange.put(FIRST_DISCOVERED, getUtcTimeNow()); + metadataChange.put(LAST_MODIFIED, getUtcTimeNow()); + } else { + if (isRelationReliabilityToBeSetOk(record)) { + metadataChange.put(RELIABILITY_INDICATOR, Reliability.OK); + } + metadataChange.put(LAST_MODIFIED, getUtcTimeNow()); + } + dbMap.put(metadataColumnName, isNewRelationship ? + toJsonb(metadataChange) : + toSqlConcatinationJsonbField(toJsonb(metadataChange), tableName, metadataColumnName)); + return metadataChange; + } + + /** + * Get metadata for an inferred entity. It will include all the keys required for an inferred entity - when a + * relationship + * is ingested and an entity that has not been ingested. + * + * @return map for metadata of an inferred entity + */ + public static Map getMetadataForInferredEntity() { + return Map.of(RELIABILITY_INDICATOR, Reliability.ADVISED, FIRST_DISCOVERED, getUtcTimeNow(), LAST_MODIFIED, + getUtcTimeNow()); + } + + private Record selectEntityDataForMetadataResolution(EntityType entityType, Entity entity, List columnsToGet, + DSLContext dslContext) { + return selectColumnsAndMetadataKeysByIdForUpdate(columnsToGet, entityType.getTableName(), entityType + .getIdColumnName(), entity.getId(), entityType.getMetadataColumnName(), dslContext); + } + + private Record selectRelationshipDataForMetadataResolution(String tableName, String relIdFieldName, String relId, + String metadataColumnName, DSLContext dslContext) { + return dslContext.select(jsonbGetAttributeAsText(field(quotedName(metadataColumnName), JSONB.class), + RELIABILITY_INDICATOR).as(RELIABILITY_INDICATOR)).select(jsonbGetAttributeAsText(field(quotedName( + metadataColumnName), JSONB.class), FIRST_DISCOVERED).as(FIRST_DISCOVERED)).from(table(tableName)) + .where(field(relIdFieldName).eq(relId)).fetchOne(); + } + + private static boolean isNewDbObject(Record record) { + return record == null || record.get(FIRST_DISCOVERED) == null; + } + + private Object toSqlConcatinationJsonbField(JSONB jsonb, String tableName, String metadataColumnName) { + final String sqlConcatJsonb = String.format(APPEND_QUERY, tableName, metadataColumnName, jsonb); + return field(sqlConcatJsonb, JSONB.class); + } + + private boolean isEntityReliabilityToBeSetOk(Record record, List attribReliabilityColumnsToGet) { + if (record == null) { + return true;//Entity not found in DB + } else if (isReliabilityOkInDb(record)) { + return false; + } else { + return isAllAttribReliabilitiesOkOrNull(record, attribReliabilityColumnsToGet); + } + } + + private boolean isRelationReliabilityToBeSetOk(Record record) { + if (record == null) { + return true;//Relationship not found in DB + } else { + return !isReliabilityOkInDb(record); + } + } + + private static String getUtcTimeNow() { + return OffsetDateTime.now(ZoneOffset.UTC).toString(); + } + + private Record selectColumnsAndMetadataKeysByIdForUpdate(List columnNames, String tableName, String idFieldName, + String id, String metadataColumnName, DSLContext dslContext) { + List> fields = columnNames.stream().map(n -> field(name(n))).toList(); + return dslContext.select(fields).select(jsonbGetAttributeAsText(field(quotedName(metadataColumnName), JSONB.class), + RELIABILITY_INDICATOR).as(RELIABILITY_INDICATOR)).select(jsonbGetAttributeAsText(field(quotedName( + metadataColumnName), JSONB.class), FIRST_DISCOVERED).as(FIRST_DISCOVERED)).from(table(tableName)) + .where(field(idFieldName).eq(id)).forUpdate().fetchOne(); + } + + private boolean isReliabilityOkInDb(Record currentReliabilitiesInDb) { + if (currentReliabilitiesInDb.get(RELIABILITY_INDICATOR) == null) { + return false;//Can happen when entity is being created and merged to in very close succession + } else { + return currentReliabilitiesInDb.get(RELIABILITY_INDICATOR).equals(Reliability.OK.name()); + } + } + + private boolean isAllAttribReliabilitiesOkOrNull(Record record, List attribReliabilitiesToCheck) { + return attribReliabilitiesToCheck.stream().allMatch(ri -> record.get(ri) == null || record.get(ri).equals( + Reliability.OK.name())); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/CloudEventParser.java b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/CloudEventParser.java index 1937466..1ca1b36 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/CloudEventParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/CloudEventParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,7 +39,7 @@ import org.oran.smo.teiv.exception.YangParsingException; import org.oran.smo.teiv.exception.YangValidationException; import org.oran.smo.teiv.schema.SchemaRegistryException; import org.oran.smo.teiv.utils.CloudEventUtil; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.oran.smo.teiv.utils.yangparser.IngestionYangParser; import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; import org.oran.smo.yangtools.parser.data.instance.AbstractStructureInstance; @@ -49,8 +49,8 @@ import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; import org.oran.smo.teiv.service.cloudevent.data.Relationship; -import static org.oran.smo.teiv.utils.TiesConstants.ENTITIES; -import static org.oran.smo.teiv.utils.TiesConstants.RELATIONSHIPS; +import static org.oran.smo.teiv.utils.TeivConstants.ENTITIES; +import static org.oran.smo.teiv.utils.TeivConstants.RELATIONSHIPS; @Slf4j @Component @@ -66,7 +66,7 @@ public class CloudEventParser { try { JsonNode eventPayload = processEventPayload(cloudEvent); boolean areSidesMandatory = !cloudEvent.getType().split("\\.")[1].equals( - TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE); + TeivConstants.CLOUD_EVENT_WITH_TYPE_DELETE); List entities = processEntities(eventPayload, areSidesMandatory); List relationships = processRelationships(eventPayload, areSidesMandatory); if (entities.isEmpty() && relationships.isEmpty()) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Entity.java b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Entity.java index ec5c591..91af233 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Entity.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Entity.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,7 +45,7 @@ import org.oran.smo.yangtools.parser.model.statements.StatementModuleAndName; import org.oran.smo.yangtools.parser.util.NamespaceModuleIdentifier; import static org.oran.smo.teiv.utils.CloudEventUtil.hasInvalidCharacter; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; @Slf4j public class Entity extends ModuleObject { diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/ModuleObject.java b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/ModuleObject.java index a6b89bb..ed8acc1 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/ModuleObject.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/ModuleObject.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; import java.util.ArrayList; import java.util.List; -import static org.oran.smo.teiv.utils.TiesConstants.SOURCE_IDS; +import static org.oran.smo.teiv.utils.TeivConstants.SOURCE_IDS; @NoArgsConstructor @AllArgsConstructor diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/ConvertToJooqTypeUtil.java b/teiv/src/main/java/org/oran/smo/teiv/utils/ConvertToJooqTypeUtil.java deleted file mode 100644 index cbb573a..0000000 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/ConvertToJooqTypeUtil.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ -package org.oran.smo.teiv.utils; - -import java.io.IOException; -import java.util.List; - -import org.jooq.JSONB; -import org.jooq.tools.json.JSONArray; - -import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; -import org.oran.smo.teiv.utils.schema.Geography; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ConvertToJooqTypeUtil { - - /** - * Creates a jooq.JSONB object from a json formatted String. - * - * The Yang Parser library parses the single element arrays as a JSON primitive. - * The use of yang models will solve this problem. As a temporary workaround, - * if one of the following is true, then the @param value is transformed into - * a single element json array before creating the JSONB object: - * - @param value is not a String, or - * - @param value is a String, but does not contain a JSON. - * - * @param value - * @return The jooq.JSONB object created from the value. - */ - public static JSONB toJsonb(Object value) { - if (value instanceof String str && isJsonObjectOrArray(str)) { - return JSONB.jsonb(str); - } else { - return JSONB.jsonb(makeSingleElementJsonArray(value)); - } - } - - /** - * Creates a jooq.JSONB object from a List of strings. - * - * @param stringList - * @return The jooq.JSONB object created from the value. - */ - public static JSONB toJsonb(List stringList) { - return JSONB.jsonb(JSONArray.toJSONString(stringList)); - } - - private static boolean isJsonObjectOrArray(String str) { - String trimmedStr = str.stripLeading(); - return trimmedStr.startsWith("{") || trimmedStr.startsWith("["); - } - - private static String makeSingleElementJsonArray(Object obj) { - return JSONArray.toJSONString(List.of(obj)); - } - - public static Geography toGeography(Object value) throws InvalidFieldInYangDataException { - try { - return new Geography((String) value); - } catch (ClassCastException | IOException e) { - throw new InvalidFieldInYangDataException(String.format("Can't create a Geography object from: %s", value), e); - } - } -} diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/JooqTypeConverter.java b/teiv/src/main/java/org/oran/smo/teiv/utils/JooqTypeConverter.java index 6874e71..3237d01 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/JooqTypeConverter.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/JooqTypeConverter.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.utils.schema.Geography; @UtilityClass @@ -50,7 +50,7 @@ public class JooqTypeConverter { } catch (JsonProcessingException e) { String message = "Exception during converting jsonb to list"; log.error(message, e); - throw TiesException.serverException(message, null, e); + throw TeivException.serverException(message, null, e); } } @@ -60,7 +60,7 @@ public class JooqTypeConverter { } catch (JsonProcessingException e) { String message = "Exception during converting jsonb to map"; log.error(message, e); - throw TiesException.serverException(message, null, e); + throw TeivException.serverException(message, null, e); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java b/teiv/src/main/java/org/oran/smo/teiv/utils/TeivConstants.java similarity index 87% rename from teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/TeivConstants.java index c278d4e..125e710 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/TeivConstants.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ package org.oran.smo.teiv.utils; import lombok.experimental.UtilityClass; @UtilityClass -public class TiesConstants { +public class TeivConstants { public static final String ENTITIES = "entities"; public static final String RELATIONSHIPS = "relationships"; public static final String API_VERSION = "v1alpha11"; @@ -31,12 +31,12 @@ public class TiesConstants { public static final String REQUEST_MAPPING_AUDIT = "topology-inventory-audit/" + API_VERSION; public static final String TEIV_DOMAIN = "TEIV"; - public static final String TIES_DATA_SCHEMA = "ties_data"; - public static final String TIES_MODEL_SCHEMA = "ties_model"; - public static final String TIES_CONSUMER_DATA_SCHEMA = "ties_consumer_data"; - public static final String TIES_DATA = TIES_DATA_SCHEMA + ".\"%s\""; - public static final String TIES_MODEL = "ties_model.%s"; - public static final String TIES_CONSUMER_DATA = "ties_consumer_data.%s"; + public static final String TEIV_DATA_SCHEMA = "teiv_data"; + public static final String TEIV_MODEL_SCHEMA = "teiv_model"; + public static final String TEIV_CONSUMER_DATA_SCHEMA = "teiv_consumer_data"; + public static final String TEIV_DATA = TEIV_DATA_SCHEMA + ".\"%s\""; + public static final String TEIV_MODEL = "teiv_model.%s"; + public static final String TEIV_CONSUMER_DATA = "teiv_consumer_data.%s"; public static final String ST_TO_STRING = "ST_AsText(%s)"; public static final String ST_TO_STRING_COLUMN_WITH_TABLE_NAME = "ST_AsText(%s)"; public static final String QUOTED_STRING = "\"%s\""; @@ -48,9 +48,7 @@ public class TiesConstants { public static final String DECORATORS = "decorators"; public static final String METADATA = "metadata"; public static final String RESPONSIBLE_ADAPTER = "responsible_adapter"; - public static final String RI_PREFIX = "RI_"; public static final String REL_PREFIX = "REL_"; - public static final String RESP_PREFIX = "RESP_"; public static final String PROPERTY_A_SIDE = "aSide"; public static final String PROPERTY_B_SIDE = "bSide"; public static final String ITEM = "item"; @@ -82,4 +80,6 @@ public class TiesConstants { public static final String TOPOLOGY_INVENTORY_AUDIT_SCHEMA = "topology-inventory:audit:1.0.0"; public static final String TOPOLOGY_INVENTORY_AUDIT_SOURCE = "topology-inventory:audit"; public static final String TOPOLOGY_INVENTORY_AUDIT_TYPE = "topology-inventory-audit.initiate"; + + public static final String URN_PREFIX = "urn:"; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java index 762d349..ec121f5 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangModelException; import org.oran.smo.yangtools.parser.data.YangData; import org.oran.smo.yangtools.parser.findings.FindingSeverity; @@ -57,9 +57,9 @@ import org.oran.smo.teiv.api.model.OranTeivSchema; import org.oran.smo.teiv.api.model.OranTeivHref; import org.springframework.web.multipart.MultipartFile; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.INVALID_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.SEMICOLON_SEPARATION; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.INVALID_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.SEMICOLON_SEPARATION; @Service @Slf4j @@ -162,7 +162,7 @@ public class YangParser { * * @return OranTeivSchemasMetaData */ - public static List returnAllTiesSchemas(YangDeviceModel yangDeviceModel) { + public static List returnAllTeivSchemas(YangDeviceModel yangDeviceModel) { List OranTeivSchemasMetaData = new ArrayList<>(); for (final YangModel yangModel : yangDeviceModel.getModuleRegistry().getAllYangModels()) { OranTeivSchema schemasMetaData = new OranTeivSchema(); @@ -244,7 +244,7 @@ public class YangParser { .getChildren().get(0).getValue().equals(formattedName)).toList(); if (domElement.isEmpty()) { - throw TiesException.invalidSchema("Invalid classifier " + element.getValue()); + throw TeivException.invalidSchema("Invalid classifier " + element.getValue()); } else { result.add(element.getValue()); } @@ -266,7 +266,7 @@ public class YangParser { case "string" -> "TEXT"; case "boolean" -> "BOOLEAN"; case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT"; - default -> throw TiesException.invalidFileInput("Invalid data type"); + default -> throw TeivException.invalidFileInput("Invalid data type"); })); } }); @@ -279,9 +279,9 @@ public class YangParser { for (Finding finding : findingsManager.getAllFindings()) { if (severityCalculator.calculateSeverity(finding.getFindingType()).equals(FindingSeverity.ERROR)) { if (finding.getMessage().contains("exception") || finding.getFindingType().contains("UNSPECIFIED_ERROR")) { - throw TiesException.invalidFileInput(INVALID_SCHEMA); + throw TeivException.invalidFileInput(INVALID_SCHEMA); } else { - throw TiesException.invalidFileInput(finding.getMessage()); + throw TeivException.invalidFileInput(finding.getMessage()); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathBuilder.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathBuilder.java similarity index 69% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathBuilder.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathBuilder.java index f2a16a0..e9a3054 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathBuilder.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathBuilder.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ */ package org.oran.smo.teiv.utils.path; -import org.oran.smo.teiv.antlr4.tiesPathBaseListener; -import org.oran.smo.teiv.antlr4.tiesPathParser; +import org.oran.smo.teiv.antlr4.teivPathBaseListener; +import org.oran.smo.teiv.antlr4.teivPathParser; import org.oran.smo.teiv.utils.path.exception.PathParsingException; import lombok.SneakyThrows; import org.antlr.v4.runtime.RuleContext; @@ -30,17 +30,17 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -public class TiesPathBuilder extends tiesPathBaseListener { +public class TeivPathBuilder extends teivPathBaseListener { private static final String OPEN_BRACKET = "["; private static final String CLOSE_BRACKET = "]"; - private final TiesPathQuery tiesPathQuery = new TiesPathQuery(); + private final TeivPathQuery teivPathQuery = new TeivPathQuery(); - private final List leavesData = new ArrayList<>(); + private final List leavesData = new ArrayList<>(); - private final StringBuilder normalizedTiesPathBuilder = new StringBuilder(); + private final StringBuilder normalizedTeivPathBuilder = new StringBuilder(); private final List containerNames = new ArrayList<>(); @@ -50,35 +50,35 @@ public class TiesPathBuilder extends tiesPathBaseListener { private List attributeNames = new ArrayList<>(); - TiesPathQuery build() { - tiesPathQuery.setNormalizedXpath(normalizedTiesPathBuilder.toString()); - tiesPathQuery.setContainerNames(containerNames); - tiesPathQuery.setBooleanOperators(booleanOperators); - tiesPathQuery.setComparativeOperators(comparativeOperators); - tiesPathQuery.setAttributeNames(attributeNames); - return tiesPathQuery; + TeivPathQuery build() { + teivPathQuery.setNormalizedXpath(normalizedTeivPathBuilder.toString()); + teivPathQuery.setContainerNames(containerNames); + teivPathQuery.setBooleanOperators(booleanOperators); + teivPathQuery.setComparativeOperators(comparativeOperators); + teivPathQuery.setAttributeNames(attributeNames); + return teivPathQuery; } @SneakyThrows @Override - public void exitInvalidPostFix(final tiesPathParser.InvalidPostFixContext ctx) { + public void exitInvalidPostFix(final teivPathParser.InvalidPostFixContext ctx) { throw new PathParsingException(ctx.getText()); } @Override - public void exitParent(final tiesPathParser.ParentContext ctx) { - tiesPathQuery.setNormalizedParentPath(normalizedTiesPathBuilder.toString()); + public void exitParent(final teivPathParser.ParentContext ctx) { + teivPathQuery.setNormalizedParentPath(normalizedTeivPathBuilder.toString()); } @SneakyThrows @Override - public void exitIncorrectPrefix(final tiesPathParser.IncorrectPrefixContext ctx) { + public void exitIncorrectPrefix(final teivPathParser.IncorrectPrefixContext ctx) { throw new PathParsingException("Path can only start with one slash (/)"); } @SneakyThrows @Override - public void exitLeafCondition(final tiesPathParser.LeafConditionContext ctx) { + public void exitLeafCondition(final teivPathParser.LeafConditionContext ctx) { final Object comparisonValue; if (ctx.IntegerLiteral() != null) { comparisonValue = Integer.valueOf(ctx.IntegerLiteral().getText()); @@ -91,7 +91,7 @@ public class TiesPathBuilder extends tiesPathBaseListener { } @Override - public void exitBooleanOperators(final tiesPathParser.BooleanOperatorsContext ctx) { + public void exitBooleanOperators(final teivPathParser.BooleanOperatorsContext ctx) { if (ctx.getText().equals("or")) throw new PathParsingException("Boolean operator 'or' is not supported, at " + ctx.getStart() .getCharPositionInLine()); @@ -99,7 +99,7 @@ public class TiesPathBuilder extends tiesPathBaseListener { } @Override - public void exitComparativeOperators(final tiesPathParser.ComparativeOperatorsContext ctx) { + public void exitComparativeOperators(final teivPathParser.ComparativeOperatorsContext ctx) { if (!ctx.getText().equals("=")) throw new PathParsingException(String.format("Comparative operator '%s' is not supported, at %d", ctx.getText(), ctx.getStart().getCharPositionInLine())); @@ -107,50 +107,50 @@ public class TiesPathBuilder extends tiesPathBaseListener { } @Override - public void enterMultipleLeafConditions(final tiesPathParser.MultipleLeafConditionsContext ctx) { - normalizedTiesPathBuilder.append(OPEN_BRACKET); + public void enterMultipleLeafConditions(final teivPathParser.MultipleLeafConditionsContext ctx) { + normalizedTeivPathBuilder.append(OPEN_BRACKET); leavesData.clear(); booleanOperators.clear(); comparativeOperators.clear(); } @Override - public void exitMultipleLeafConditions(final tiesPathParser.MultipleLeafConditionsContext ctx) { - normalizedTiesPathBuilder.append(CLOSE_BRACKET); - tiesPathQuery.setLeavesData(leavesData); + public void exitMultipleLeafConditions(final teivPathParser.MultipleLeafConditionsContext ctx) { + normalizedTeivPathBuilder.append(CLOSE_BRACKET); + teivPathQuery.setLeavesData(leavesData); } @Override - public void exitContainsFunctionCondition(final tiesPathParser.ContainsFunctionConditionContext ctx) { - tiesPathQuery.setContainsFunctionConditionLeafName(ctx.leafName().getText()); - tiesPathQuery.setContainsFunctionConditionValue(unwrapQuotedString(ctx.StringLiteral().getText())); + public void exitContainsFunctionCondition(final teivPathParser.ContainsFunctionConditionContext ctx) { + teivPathQuery.setContainsFunctionConditionLeafName(ctx.leafName().getText()); + teivPathQuery.setContainsFunctionConditionValue(unwrapQuotedString(ctx.StringLiteral().getText())); } @Override - public void enterListElementRef(final tiesPathParser.ListElementRefContext ctx) { - normalizedTiesPathBuilder.append(OPEN_BRACKET); + public void enterListElementRef(final teivPathParser.ListElementRefContext ctx) { + normalizedTeivPathBuilder.append(OPEN_BRACKET); } @Override - public void exitListElementRef(final tiesPathParser.ListElementRefContext ctx) { - normalizedTiesPathBuilder.append(CLOSE_BRACKET); + public void exitListElementRef(final teivPathParser.ListElementRefContext ctx) { + normalizedTeivPathBuilder.append(CLOSE_BRACKET); } @Override - public void exitContainerName(final tiesPathParser.ContainerNameContext ctx) { + public void exitContainerName(final teivPathParser.ContainerNameContext ctx) { final String containerName = ctx.getText(); - normalizedTiesPathBuilder.append("/").append(containerName); + normalizedTeivPathBuilder.append("/").append(containerName); containerNames.add(containerName); } @Override - public void exitFieldLeaf(final tiesPathParser.FieldLeafContext ctx) { + public void exitFieldLeaf(final teivPathParser.FieldLeafContext ctx) { attributeNames = ctx.leafName().stream().map(RuleContext::getText).collect(Collectors.toList()); } - private void leafContext(final tiesPathParser.LeafNameContext ctx, final Object comparisonValue) { - leavesData.add(new TiesPathQuery.DataLeaf(ctx.getText(), comparisonValue)); - appendCondition(normalizedTiesPathBuilder, ctx.getText(), comparisonValue); + private void leafContext(final teivPathParser.LeafNameContext ctx, final Object comparisonValue) { + leavesData.add(new TeivPathQuery.DataLeaf(ctx.getText(), comparisonValue)); + appendCondition(normalizedTeivPathBuilder, ctx.getText(), comparisonValue); } private void appendCondition(final StringBuilder currentNormalizedPathBuilder, final String name, final Object value) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathErrorListener.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathErrorListener.java similarity index 91% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathErrorListener.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathErrorListener.java index 63c7f2e..12c2f4d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathErrorListener.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathErrorListener.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.misc.ParseCancellationException; -public class TiesPathErrorListener extends BaseErrorListener { +public class TeivPathErrorListener extends BaseErrorListener { @Override public void syntaxError(Recognizer recognizer, Object o, int i, int i1, String s, RecognitionException e) diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathLexer.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathLexer.java similarity index 86% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathLexer.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathLexer.java index ed49bd4..900992e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathLexer.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathLexer.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,14 +20,14 @@ */ package org.oran.smo.teiv.utils.path; -import org.oran.smo.teiv.antlr4.tiesPathLexer; +import org.oran.smo.teiv.antlr4.teivPathLexer; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.LexerNoViableAltException; import org.antlr.v4.runtime.misc.ParseCancellationException; -public class TiesPathLexer extends tiesPathLexer { +public class TeivPathLexer extends teivPathLexer { - public TiesPathLexer(CharStream input) { + public TeivPathLexer(CharStream input) { super(input); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathParser.java similarity index 85% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathParser.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathParser.java index 8156aee..a6cd2be 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,12 @@ */ package org.oran.smo.teiv.utils.path; -import org.oran.smo.teiv.antlr4.tiesPathParser; +import org.oran.smo.teiv.antlr4.teivPathParser; import lombok.SneakyThrows; import org.antlr.v4.runtime.TokenStream; -public class TiesPathParser extends tiesPathParser { - public TiesPathParser(TokenStream input) { +public class TeivPathParser extends teivPathParser { + public TeivPathParser(TokenStream input) { super(input); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathQuery.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathQuery.java similarity index 93% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathQuery.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathQuery.java index 8ea931d..96540e6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathQuery.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathQuery.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,8 +30,8 @@ import java.util.List; @Getter @Setter(AccessLevel.PACKAGE) -public class TiesPathQuery { - private String tiesPathPrefix; +public class TeivPathQuery { + private String teivPathPrefix; private String normalizedParentPath; private String normalizedXpath; private List containerNames; diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathUtil.java b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathUtil.java similarity index 60% rename from teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathUtil.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathUtil.java index b94bc5e..29819ce 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/path/TiesPathUtil.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/path/TeivPathUtil.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.utils.path; -import org.oran.smo.teiv.antlr4.tiesPathParser; +import org.oran.smo.teiv.antlr4.teivPathParser; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.antlr.v4.runtime.CharStream; @@ -28,23 +28,23 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class TiesPathUtil { +public class TeivPathUtil { /** * @deprecated (this method is deprecated) */ @Deprecated - public static TiesPathQuery getTiesPathQuery(final String TiesPathSource) { - final CharStream inputStream = CharStreams.fromString(TiesPathSource); - final TiesPathLexer tiesPathLexer = new TiesPathLexer(inputStream); - final tiesPathParser tiesPathParser = new TiesPathParser(new CommonTokenStream(tiesPathLexer)); - tiesPathParser.removeErrorListeners(); - tiesPathParser.addErrorListener(new TiesPathErrorListener()); - tiesPathParser.setErrorHandler(new StrictErrorStrategy()); - final TiesPathBuilder tiesPathBuilder = new TiesPathBuilder(); - tiesPathParser.addParseListener(tiesPathBuilder); - tiesPathParser.tiesPath(); + public static TeivPathQuery getTeivPathQuery(final String TeivPathSource) { + final CharStream inputStream = CharStreams.fromString(TeivPathSource); + final TeivPathLexer teivPathLexer = new TeivPathLexer(inputStream); + final teivPathParser teivPathParser = new TeivPathParser(new CommonTokenStream(teivPathLexer)); + teivPathParser.removeErrorListeners(); + teivPathParser.addErrorListener(new TeivPathErrorListener()); + teivPathParser.setErrorHandler(new StrictErrorStrategy()); + final TeivPathBuilder teivPathBuilder = new TeivPathBuilder(); + teivPathParser.addParseListener(teivPathBuilder); + teivPathParser.teivPath(); - return tiesPathBuilder.build(); + return teivPathBuilder.build(); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TiesPathException.java b/teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TeivPathException.java similarity index 70% rename from teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TiesPathException.java rename to teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TeivPathException.java index 42727b9..873e811 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TiesPathException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/query/exception/TeivPathException.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ import java.util.List; import java.util.Set; @Getter -public class TiesPathException extends RuntimeException { +public class TeivPathException extends RuntimeException { private final String message; private final String details; @@ -37,29 +37,29 @@ public class TiesPathException extends RuntimeException { private final transient List response; private static final List defaultResponse = Collections.emptyList(); - public static TiesPathException invalidRelationshipName(final String relationship) { + public static TeivPathException invalidRelationshipName(final String relationship) { return clientException("Invalid relationship name", String.format("%s is not a known relationship", relationship)); } - public static TiesPathException noConnectionFound(final String object) { + public static TeivPathException noConnectionFound(final String object) { return clientException("Objects are not related", String.format( "No relationship can be found between %s and scopeFilter elements", object)); } - public static TiesPathException noConnectionFoundWhenRootIsNull() { + public static TeivPathException noConnectionFoundWhenRootIsNull() { return clientException("Objects are not related", "None of the elements in the targetFilter is part of connection provided in relationships filter"); } - public static TiesPathException grammarError(final String message) { + public static TeivPathException grammarError(final String message) { return clientException("Grammar error", message); } - public static TiesPathException columnNameError(String entity, String column) { + public static TeivPathException columnNameError(String entity, String column) { return clientException("Grammar Error", String.format("%s is not a valid attribute of %s", column, entity)); } - public static TiesPathException columnNamesError(String entity, List columns) { + public static TeivPathException columnNamesError(String entity, List columns) { if (columns.size() == 1) { return columnNameError(entity, columns.get(0)); } else { @@ -68,88 +68,97 @@ public class TiesPathException extends RuntimeException { } } - public static TiesPathException sourceIdNameError(String entity) { + public static TeivPathException sourceIdNameError(String entity) { return clientException("Invalid parameter error", String.format("Invalid source id parameter provided for %s", entity)); } - private static TiesPathException clientException(final String message, final String details) { - return new TiesPathException(message, details, HttpStatus.BAD_REQUEST, null); + private static TeivPathException clientException(final String message, final String details) { + return new TeivPathException(message, details, HttpStatus.BAD_REQUEST, null); } - public static TiesPathException idAmongAttributesError() { + public static TeivPathException idAmongAttributesError() { return clientException("Grammar Error", "ID is not considered to be an attribute"); } - public static TiesPathException invalidQueryError() { + public static TeivPathException invalidQueryError() { return clientException("Invalid query", "The provided query in scopeFilter is invalid"); } - public static TiesPathException entityNameError(String entity) { + public static TeivPathException invalidTargetFilter(String topologyObject) { + return clientException("Invalid target filter, only relationship conditions can be provided", String.format( + "%s is not a valid relation", topologyObject)); + } + + public static TeivPathException entityNameError(String entity) { return clientException("Grammar Error", String.format("%s is not a valid entity", entity)); } - public static TiesPathException invalidTopologyObject(String topologyObject) { + public static TeivPathException invalidTopologyObject(String topologyObject) { return clientException("Invalid topology object", String.format( "%s did not match any topology objects in the given domain", topologyObject)); } - public static TiesPathException invalidInnerContainer(String innerContainer) { - return clientException("Invalid data in scopeFilter", String.format("Unable to resolve %s", innerContainer)); + public static TeivPathException invalidDataInScopeFilter(String data) { + return clientException("Invalid data in scopeFilter", String.format("Unable to resolve %s", data)); } - public static TiesPathException invalidTargetFilter(Set params) { + public static TeivPathException invalidTargetFilter(Set params) { return clientException("Invalid targetFilter content", String.format( "%s did not match any topology objects in the given domain", String.join(", ", params))); } - public static TiesPathException invalidTargetFilter() { + public static TeivPathException invalidTargetFilter() { return clientException("Invalid targetFilter content", "Given targetFilters could not be resolved"); } - public static TiesPathException invalidTargetFilterScopeFilterCombination() { + public static TeivPathException invalidTargetFilterScopeFilterCombination() { return clientException("Invalid targetFilter and scopeFilter content", "Given targetFilter and scopeFilter can not be combined"); } - public static TiesPathException invalidScopeFilter(String leaf) { + public static TeivPathException invalidScopeFilter(String leaf) { return clientException("Invalid scopeFilter content", String.format( "%s did not match any topology objects in the given domain", leaf)); } - public static TiesPathException invalidMetadaFilter(String leaf) { + public static TeivPathException invalidMetadaFilter(String leaf) { return clientException("Invalid metadata content", String.format("%s is not a valid metadata", leaf)); } - public static TiesPathException ambiguousTopologyObject(String topologyObject) { + public static TeivPathException ambiguousTopologyObject(String topologyObject) { return clientException("Invalid topology object", String.format( "%s is ambiguous, %s matches multiple topology object types", topologyObject, topologyObject)); } - public static TiesPathException invalidAssociation(String topologyObject, String associationName) { + public static TeivPathException invalidAssociation(String topologyObject, String associationName) { return clientException("Invalid association name", String.format( "%s is not a valid association name for topology object %s", associationName, topologyObject)); } - public static TiesPathException invalidParamsForAssociation(String associationName) { + public static TeivPathException invalidParamsForAssociation(String associationName) { return clientException("Invalid parameters for association", String.format( "Invalid parameters provided for association %s", associationName)); } - public static TiesPathException containerValidationWithUndefinedTopologyObjectType(String topologyObject) { + public static TeivPathException containerValidationWithUndefinedTopologyObjectType(String topologyObject) { return clientException("Container validation error", String.format( "Container validation is not possible for undefined %s", topologyObject)); } - public static TiesPathException notMatchingScopeAndTargetFilter() { + public static TeivPathException notMatchingScopeAndTargetFilter() { return clientException("Filter Error", "TopologyObjects given in scopeFilter and targetFilter are not matching"); } - public static TiesPathException invalidQueryCondition(String details) { + public static TeivPathException invalidQueryCondition(String details) { return clientException("Invalid query condition", details); } - private TiesPathException(final String message, final String details, final HttpStatus httpStatus, + public static TeivPathException invalidDataType() { + return clientException("Invalid data type", "Invalid data type provided for scopeFilter"); + } + + private TeivPathException(final String message, final String details, final HttpStatus httpStatus, final List response) { this.message = message; this.details = details; diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/schema/Geography.java b/teiv/src/main/java/org/oran/smo/teiv/utils/schema/Geography.java index 5d2a708..606d2c6 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/schema/Geography.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/schema/Geography.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,8 +51,8 @@ public class Geography { * A json that conforms to the "RFC 9179: A YANG Grouping for * Geographic Location" standard. * @throws IOException - * when the json doesn't contain both "latitude" and - * "longitude" fields. + * when the json doesn't contain both "latitude" and "longitude" fields + * or the range of latitude is not [-90,90] or the range of longitude is not [-180,180]. */ public Geography(final String json) throws IOException { JsonNode rootNode = objectMapper.readTree(json); @@ -60,7 +60,7 @@ public class Geography { JsonNode latitudeNode = findNode(rootNode, "latitude"); JsonNode longitudeNode = findNode(rootNode, "longitude"); - if (isValidNumber(latitudeNode) && isValidNumber(longitudeNode)) { + if (isValidLatitude(latitudeNode) && isValidLongitude(longitudeNode)) { latitude = latitudeNode.asDouble(); longitude = longitudeNode.asDouble(); JsonNode heightNode = findNode(rootNode, "height"); @@ -68,7 +68,8 @@ public class Geography { height = heightNode.asDouble(); } } else { - throw new IOException("Cannot find latitude, longitude fields in json: " + json); + throw new IOException( + "The range of latitude should be [-90,90] and the range of longitude should be [-180,180]: " + json); } } @@ -76,6 +77,14 @@ public class Geography { return node != null && node.isNumber(); } + private boolean isValidLatitude(JsonNode node) { + return isValidNumber(node) && node.asDouble() >= -90 && node.asDouble() <= 90; + } + + private boolean isValidLongitude(JsonNode node) { + return isValidNumber(node) && node.asDouble() >= -180 && node.asDouble() <= 180; + } + private JsonNode findNode(final JsonNode node, final String fieldName) { if (node.has(fieldName)) { return node.get(fieldName); diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java index 32f6119..dea6d90 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ */ package org.oran.smo.teiv.utils.yangparser; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.SEMICOLON_SEPARATION; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.SEMICOLON_SEPARATION; import java.util.ArrayList; import java.util.HashMap; @@ -41,7 +41,7 @@ import org.oran.smo.yangtools.parser.input.ByteArrayYangInput; import org.oran.smo.yangtools.parser.model.ConformanceType; import org.oran.smo.yangtools.parser.model.YangModel; import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangParsingException; import org.oran.smo.teiv.exception.YangSchemaException; @@ -102,7 +102,7 @@ public class ExposureYangParser extends YangModelLoader { .getChildren().get(0).getValue().equals(formattedName)).toList(); if (domElement.isEmpty()) { - throw TiesException.invalidSchema("Invalid classifier " + element.getValue()); + throw TeivException.invalidSchema("Invalid classifier " + element.getValue()); } else { classifier = element.getValue(); } @@ -110,7 +110,7 @@ public class ExposureYangParser extends YangModelLoader { classifier = element.getValue(); } if (result.contains(classifier)) { - throw TiesException.duplicateEntryForClassifiers(classifier); + throw TeivException.duplicateEntryForClassifiers(classifier); } else { result.add(classifier); } @@ -127,10 +127,10 @@ public class ExposureYangParser extends YangModelLoader { case "string" -> "TEXT"; case "boolean" -> "BOOLEAN"; case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT"; - default -> throw TiesException.invalidFileInput("Invalid data type"); + default -> throw TeivException.invalidFileInput("Invalid data type"); }; if (resultMap.putIfAbsent(key, value) != null) { - throw TiesException.duplicateEntryForDecorators(key); + throw TeivException.duplicateEntryForDecorators(key); } }); return resultMap; diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java index 14d02bd..4dfc9d2 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ */ package org.oran.smo.teiv.utils.yangparser; -import static org.oran.smo.teiv.utils.TiesConstants.INVALID_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.SCHEMA_ALREADY_EXISTS; +import static org.oran.smo.teiv.utils.TeivConstants.INVALID_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.SCHEMA_ALREADY_EXISTS; import java.util.HashSet; import java.util.Set; @@ -33,7 +33,7 @@ import org.oran.smo.yangtools.parser.findings.FindingSeverity; import org.oran.smo.yangtools.parser.findings.FindingSeverityCalculator; import org.oran.smo.yangtools.parser.findings.FindingsManager; import org.oran.smo.teiv.CustomMetrics; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangValidationException; @Slf4j @@ -92,11 +92,11 @@ class YangFindingsManager { for (Finding finding : findingsManager.getAllFindings()) { if (isErrorFinding(severityCalculator, finding)) { if (isInvalidSchemaFinding(finding)) { - throw TiesException.invalidFileInput(INVALID_SCHEMA); + throw TeivException.invalidFileInput(INVALID_SCHEMA); } else if (finding.getFindingType().contains("P044_SAME_MODULE_IMPLEMENTS_AND_IMPORTS")) { - throw TiesException.invalidFileInput(SCHEMA_ALREADY_EXISTS); + throw TeivException.invalidFileInput(SCHEMA_ALREADY_EXISTS); } else { - throw TiesException.invalidFileInput(finding.getMessage()); + throw TeivException.invalidFileInput(finding.getMessage()); } } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java index 1c02b76..e8ee177 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/main/resources/application.yaml b/teiv/src/main/resources/application.yaml index f16042a..eadd367 100644 --- a/teiv/src/main/resources/application.yaml +++ b/teiv/src/main/resources/application.yaml @@ -37,7 +37,7 @@ management: validate-group-membership: "false" group: readiness: - include: "readinessState,${HEALTH_CHECK_INDICATOR:tiesExposure}" + include: "readinessState,${HEALTH_CHECK_INDICATOR:teivExposure}" endpoints: web: exposure: diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-common-yang-types.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-common-yang-types.yang index 57a4a30..6e744cd 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-common-yang-types.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-common-yang-types.yang @@ -3,6 +3,8 @@ module o-ran-smo-teiv-common-yang-types { namespace "urn:o-ran:smo-teiv-common-yang-types"; prefix or-teiv-types; + import ietf-yang-types { prefix yang; } + import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; } import _3gpp-common-yang-types { prefix types3gpp; } @@ -32,6 +34,11 @@ module o-ran-smo-teiv-common-yang-types { SPDX-License-Identifier: Apache-2.0"; + revision "2025-01-17" { + description "Added firstDiscovered and lastModified to metadata container"; + or-teiv-yext:label 0.5.0; + } + revision "2024-10-04" { description "Added Origin_Entity_Mapping_Grp and Origin_Relationship_Mapping_Grp for sourceIds and reliabilityIndicator to metadata."; @@ -130,14 +137,15 @@ module o-ran-smo-teiv-common-yang-types { This must be attached to the Topology Entity or Topology Relation instance, outside of the declared Topology Entity or Topology Relationship's attributes. This is exposed to the consumers and can only be set by - the responsible adapter. This cannot be instantiated, and it MUST NOT be - augmented or deviated in any way, unless stated otherwise."; + Topology and Inventory Exposure Handling and Discovery and Reconciliation Adapter. + This cannot be instantiated, and it MUST NOT be augmented or deviated in any way, + unless stated otherwise."; leaf reliabilityIndicator { type enumeration { enum OK { description "The data is in alignment with the source of truth, - as far as Topology Exposure Handling is aware."; + as far as Topology and Inventory Exposure Handling is aware."; value 0; } enum RESTORED { @@ -146,12 +154,23 @@ module o-ran-smo-teiv-common-yang-types { value 1; } enum ADVISED { - description "Entity implicitly created by Topology Exposure Handling and - potentially not aligned with the source of truth."; + description "Entity implicitly created by Topology and Inventory Exposure + Handling and potentially not aligned with the source of truth."; value 2; } } } + leaf firstDiscovered { + type yang:date-and-time; + description "Timestamp indicating when an instance of Topology Entity or Relation + was first represented in Topology and Inventory Exposure Handling via discovery."; + } + + leaf lastModified { + type yang:date-and-time; + description "Timestamp indicating when an instance of Topology Entity or Relation + was last updated (excluding classifiers and decorators)."; + } } identity classifier { diff --git a/teiv/src/main/resources/v1/topology-exposure-inventory-openapi.yaml b/teiv/src/main/resources/v1/topology-exposure-inventory-openapi.yaml index 7a85343..edbec7c 100644 --- a/teiv/src/main/resources/v1/topology-exposure-inventory-openapi.yaml +++ b/teiv/src/main/resources/v1/topology-exposure-inventory-openapi.yaml @@ -48,6 +48,15 @@ info: Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships. + Metadata provides additional information about entities and relationships within the database. + The reliabilityIndicator is used to indicate the reliability status of the topology data within the network. + The firstDiscovered timestamp is set for an entity and relationship instance when the instances are created for + the first time in Topology & Inventory. + The lastModified timestamp is set for updates to entities or relationships in Topology & Inventory, + excluding updates to classifiers or decorators. + reliabilityIndicator, firstDiscovered, and lastModified are implemented as name-value pairs within the metadata. + They apply to every entity and relationship. + Topology groups provide the capability to create user-defined collections of topology entities and/or relationships of any type. Groups can be either static or dynamic based on how they are created. @@ -65,15 +74,16 @@ info: object(s), the query is not constructed. The RootObject still can be retrieved and filtered using the */attributes*. - | Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | - |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------| - | To return the ids for all instances of the entityTypeName used in the query. | RAN | GNBDUFunction | | | All ids of every GNBDUFunction | - | To return all attributes of every instance of the entityTypeName used in the query. | RAN | GNBDUFunction | /attributes | | All GNBDUFunctions with every attribute | - | To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | GNBDUFunction | /attributes(gNBId) | | All gNBIds of every GNBDUFunction | - | To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | GNBDUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every GNBDUFunction | - | To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where sourceIds contains *SubNetwork=Ireland* | - | To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*". | RAN | GNBDUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | - | To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | GNBDUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | + | Use case | domainName | entityTypeName | targetFilter | scopeFilter | Query result | + |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:---------------|:--------------------------------|:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + | To return the ids for all instances of the entityTypeName used in the query. | RAN | ODUFunction | | | All ids of every ODUFunction | + | To return all attributes of every instance of the entityTypeName used in the query. | RAN | ODUFunction | /attributes | | All ODUFunctions with every attribute | + | To return every instance of the entityTypeName used in the query, but only the attribute that was defined in the *targetFilter* parameter.
Note: The attribute must be a valid field of the object. | RAN | ODUFunction | /attributes(gNBId) | | All gNBIds of every ODUFunction | + | To return every instance of the entityTypeName used in the query, but only the attributes that were defined in the *targetFilter* parameter.
Note: The attributes must be separated by a comma "," when using parenthesis "()". | RAN | ODUFunction | /attributes(gNBId, gNBIdLength) | | All gNBIds and gNBIdLengths of every ODUFunction | + | To return the ids for all instances of the entityTypeName used in the query, that partially matches the given property in the *scopeFilter* parameter. | RAN | ODUFunction | | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where sourceIds contains *SubNetwork=Ireland* | + | To return the ids for all instances of the entityTypeName used in the query, that matches the given attributes in the *scopeFilter* parameter.
Note: The attributes must be separated by a *AND* or *OR*. | RAN | ODUFunction | | /attributes [@gNBIdLength=1 and @gNBId=9] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 1 and the gNBId equals 9 | + | To return the ids for all instances of the entityTypeName used in the query, that satisfies one of the conditions in the *scopeFilter* parameter. A condition is a complete unit of *scopeFilter* parameter surrounded by square brackets.
Note: Multiple conditions can be given in the scopeFilter separated by a semicolon ";" to represent AND, or a pipe symbol "|" to represent OR. | RAN | ODUFunction | | /attributes [@gNBIdLength=2] | /sourceIds[contains (@item, 'SubNetwork=Europe')] | Unique set of ids of ODUFunctions, where the gNBIdLength equals 2 or the sourceIds contains an item with "SubNetwork=Europe" | + | To return the metadata for all instances of the entityTypeName used in the query, that is *firstDiscovered* within the given timeframe in the *scopeFilter* parameter.
Note: The timestamps can be queried in any timezone. | RAN | ODUFunction | | /metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30'] | Unique set of ids of ODUFunctions, where metadata contains *firstDiscovered* timestamp within the range '2025-01-06T12:34:56.789+05:30' and '2025-01-09T16:10:36.461565+05:30' | ## Querying connected entities The *entityTypeName* is used as the root of the queries. @@ -82,8 +92,8 @@ info: |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | To return the ids for all instances of an entityTypeName related by an association. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement | All ENodeBFunction entities that are managed by any Managed Element. | | To return the ids for all instances of an entityTypeName related by an association to another entity specified by its *id*. | REL_OAM_RAN | ENodeBFunction | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All ENodeBFunction entities that are managed by the Managed Element *urn:3gpp:dn: ManagedElement=1*. | - | To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All EnodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. | - | To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All EnodeBFunction entities that provide an EuTranCell whose tac equals 1 | + | To return the attributes for all instances of an entityTypeName related by one or more associations to other entities specified by their *id*. | REL_OAM_RAN | ENodeBFunction | /attributes | /attributes [@enbId=1] ; /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=1'] | /managed-by-managedElement [@id='urn:3gpp:dn: ManagedElement=2'] ; /provided-euTranCell [@id='urn:3gpp:dn: ManagedElement=1, EUtranCell=2'] | All ENodeBFunction entities with enbId as *1*, managed by the Managed Element *urn:3gpp:dn: ManagedElement=1* or *urn:3gpp:dn: ManagedElement=2*, and provides EuTranCell *urn:3gpp:dn: ManagedElement=1, EUtranCell=2*. | + | To return the ids for all instances of an entityTypeName related by one or more associations to other entities whose attribute matches the given *scopeFilter* parameter. | RAN | ENodeBFunction | | /provided-euTranCell/attributes[@tac=1] | All ENodeBFunction entities that provide an EUTranCell whose tac equals 1 | ## Querying based on geographical location The *entityTypeName* is used as the root of the queries. Use the "Well-known text" (WKT) representation of geometry to specify geometry objects. @@ -100,9 +110,9 @@ info: | Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------|-------------|:---------------|------------------------------------------------|:----------------------------------------|:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | To return the relationships for a given entity specified by its id. | RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | | All relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. | - | To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | /MANAGEDELEMENT _MANAGES _GNBDUFUNCTION | | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1*. | - | To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | GNBDUFunction | urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _GNBDUFUNCTION* relations for the GNBDUFunction with id *urn:3gpp:dn: ManagedElement=1, GNBDUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. | + | To return the relationships for a given entity specified by its id. | RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | | All relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. | + | To return specific relationships for a given entity specified by its id. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | /MANAGEDELEMENT _MANAGES _ODUFUNCTION | | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1*. | + | To return specific relationships for an entity specified by its id to another entity using its id and association. | REL_OAM_RAN | ODUFunction | urn:3gpp:dn: ManagedElement=1, ODUFunction=1 | | /managed-by-managedElement [@id = 'urn:3gpp:dn: ManagedElement=1'] | All *MANAGEDELEMENT _MANAGES _ODUFUNCTION* relations for the ODUFunction with id *urn:3gpp:dn: ManagedElement=1, ODUFunction=1* where the managed element is *urn:3gpp:dn: ManagedElement=1*. | ## Querying on relationships Here, the *relationshipTypeName* is used as the root of the queries. @@ -117,32 +127,32 @@ info: | Use case | domainName | targetFilter | scopeFilter | Query result | |:--------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------------|:----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------| - | Return all related entity IDs that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'gnbdu-function-model:Indoor'] | All the entity IDs that are classified with "gnbdu-function-model:Indoor" in RAN domain. | - | Return all related entity IDs that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity IDs that are partially matched with "Ind" in RAN domain. | - | Return all related entity IDs that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@gnbdu-function-model:textdata = 'Stockholm'] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata = 'Stockholm'" in RAN domain. | - | Return all related entity IDs that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@gnbdu-function-model:textdata, '')] | All the entity IDs that are exactly matched with "gnbdu-function-model:textdata as key of the decorator in RAN domain. | + | Return all related entity ids that are exactly matched with the specified classifier with given domain name. | RAN | | /classifiers[@item = 'odu-function-model:Indoor'] | All the entity ids that are classified with "odu-function-model:Indoor" in RAN domain. | + | Return all related entity ids that are partially matched for the given classifier with given domain name. | RAN | | /classifiers[contains(@item, 'Ind')] | All the entity ids that are partially matched with "Ind" in RAN domain. | + | Return all related entity ids that are exactly matched with the key-value pair that specified decorators with given domain name. | RAN | | /decorators[@odu-function-model:textdata = 'Stockholm'] | All the entity ids that are exactly matched with "odu-function-model:textdata = 'Stockholm'" in RAN domain. | + | Return all related entity ids that are exactly matched with key parameter where the value of the decorator is unknown with given domain name. | RAN | | /decorators[contains(@odu-function-model:textdata, '')] | All the entity ids that are exactly matched with "odu-function-model:textdata as key of the decorator in RAN domain. | The *entityName* is used as the root of the queries. | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | Return all related entity IDs and classifiers. | NRCellDU | | /classifiers | | All NRCellDU IDs and classifiers. | - | Return all related entity IDs and decorators. | NRCellDU | | /decorators | | All NRCellDU IDs and decorators. | - | Return all related entity IDs that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All NRCellDU IDs where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "gnbdu-function-model:Indoor". | - | Return all related entity IDs and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU IDs and classifiers partially contains the text "Ind". | - | Return all related entity IDs and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | - | Return all related entity IDs, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stoc')] | All NRCellDU IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". | - + | Return all related entity ids and classifiers. | NRCellDU | | /classifiers | | All NRCellDU ids and classifiers. | + | Return all related entity ids and decorators. | NRCellDU | | /decorators | | All NRCellDU ids and decorators. | + | Return all related entity ids that are exact match for the given classifiers and decorators. | NRCellDU | | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All NRCellDU ids where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and where classifier exactly contains "odu-function-model:Indoor". | + | Return all related entity ids and classifiers that are partially matched for the given classifier. | NRCellDU | | /classifiers | /classifiers[contains(@item, 'Ind')] | All NRCellDU ids and classifiers partially contains the text "Ind". | + | Return all related entity ids and decorators where key is a exact match and value is partially match. | NRCellDU | | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc'. | + | Return all related entity ids, decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | NRCellDU | | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stoc')] | All NRCellDU ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stoc' and classifiers partially contains the text "Ind". | + The *relationshipTypeName* is used as the root of the queries. - + | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|:----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | Return all related relationships IDs and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and classifiers. | - | Return all related relationships IDs and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators. | - | Return all related relationship IDs that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'gnbdu-function-model:Indoor']; /decorators [@gnbdu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "gnbdu-function-model:Indoor". | - | Return all related relationships IDs and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | - | Return all related relationships IDs and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | - | Return all related relationships IDs,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@gnbdu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION IDs and decorators where key of the decorator is "gnbdu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". | + | Return all related relationship ids and classifiers. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and classifiers. | + | Return all related relationship ids and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators. | + | Return all related relationship ids that are exact match for the given classifier and decorators. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | | /classifiers[@item = 'odu-function-model:Indoor']; /decorators [@odu-function-model:textdata = 'Stockholm'] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator is 'Stockholm'" and classifiers exactly contains "odu-function-model:Indoor". | + | Return all related relationship ids and classifiers that are partially matched for the given classifier. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers | /classifiers[contains(@item, 'Ind')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and classifiers partially contains the text "Ind". | + | Return all related relationship ids and decorators where key is a exact match and value is partially match. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /decorators | /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION and where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock'. | + | Return all related relationship ids,decorators and classifiers where key of the decorator is a exact match and value partially matches, and classifiers partially contains from the given parameters. | | MANAGEDELEMENT _MANAGES _ENODEBFUNCTION | /classifiers; /decorators | /classifiers[contains(@item, 'Ind')]; /decorators[contains(@odu-function-model:textdata, 'Stock')] | All MANAGEDELEMENT _MANAGES _ENODEBFUNCTION ids and decorators where key of the decorator is "odu-function-model:textdata" and the value of the decorator partially contains 'Stock' and classifiers partially contains the text "Ind". | version: 0.11.0 title: Topology Exposure and Inventory API @@ -1635,8 +1645,8 @@ components: - module-y:Rural - module-z:Weekend entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ClassifierDeleteExample: @@ -1646,8 +1656,8 @@ components: - module-x:Outdoor - module-z:Weekend entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" @@ -1658,8 +1668,8 @@ components: module-x:location: Stockholm module-y:vendor: Ericsson entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" DecoratorDeleteExample: @@ -1668,15 +1678,15 @@ components: decorators: module-x:location: Stockholm entityIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" EntityResponseExample: value: o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" attributes: cellLocalId: 91 nCI: 91 @@ -1687,8 +1697,12 @@ components: classifiers: - Rural sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" EntitiesResponseExample: value: @@ -1701,6 +1715,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" - "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:GNBCUUPFunction: - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" attributes: @@ -1709,6 +1727,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" - "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:GNBCUUPFunction: - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" attributes: @@ -1717,6 +1739,10 @@ components: sourceIds: - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" - "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" self: href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" first: @@ -1733,23 +1759,41 @@ components: value: o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" RelationshipsResponseExample: value: items: - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78" - aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2" - sourceIds: [] + aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2" + metadata: + reliabilityIndicator: "OK" + firstDiscovered: "2025-01-07T12:20:12.24523200Z" + lastModified: "2025-01-08T10:40:36.46156500Z" self: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" first: @@ -1789,12 +1833,12 @@ components: RelationshipTypesResponseExample: value: items: - - name: "MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" + - name: "MANAGEDELEMENT_MANAGES_ODUFUNCTION" relationships: - href: "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_GNBDUFUNCTION/relationships" - - name: "GNBDUFUNCTION_PROVIDES_NRCELLDU" + href: "/domains/RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" + - name: "ODUFUNCTION_PROVIDES_NRCELLDU" relationships: - href: "/domains/RAN/relationship-types/GNBDUFUNCTION_PROVIDES_NRCELLDU/relationships" + href: "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" - name: "NRCELLDU_USES_NRSECTORCARRIER" relationships: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" @@ -1947,7 +1991,7 @@ components: or-teiv-yext:label 0.1.0; } or-teiv-yext:domain RAN; - list GNBDUFunction { + list ODUFunction { uses or-teiv-types:Top_Grp_Type; key id; container attributes { @@ -2012,15 +2056,15 @@ components: type: static providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 CreateDynamicGroupGetEntitiesByDomainPayloadExample: value: @@ -2064,15 +2108,15 @@ components: value: items: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 self: href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" first: @@ -2089,15 +2133,15 @@ components: value: items: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 - - o-ran-smo-teiv-ran:GNBDUFunction: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 + - o-ran-smo-teiv-ran:ODUFunction: + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1 - o-ran-smo-teiv-oam:ManagedElement: - id: urn:3gpp:dn:ManagedElement=1 - - o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU: - - id: urn:o-ran:smo:teiv:sha512:GNBDUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418 - - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION: - - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_GNBDUFUNCTION=9243B48F7D6A6C56 + - o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU: + - id: urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624 + - o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION: + - id: urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8 self: href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" first: @@ -2115,14 +2159,14 @@ components: operation: "merge" providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 RemoveProvidedMembersPayloadExample: value: operation: "remove" providedMembers: - o-ran-smo-teiv-ran:NRCellDU: - - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + - id: urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1 StaticGroupResponseExample: value: diff --git a/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java b/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java index abf03e8..daecc30 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.oran.smo.teiv.utils.TiesTestConstants.APPLICATION_JSON; +import static org.oran.smo.teiv.utils.TeivTestConstants.APPLICATION_JSON; import java.util.Objects; @@ -46,7 +46,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.oran.smo.teiv.startup.SchemaHandler; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @@ -69,41 +69,41 @@ class CoreApplicationTest { .andExpect(status().isOk()) .andReturn(); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_not_supported_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_parse_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_parse_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_parse_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_parse_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_parse_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_parse_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_persist_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_persist_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_persist_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_persist_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_persist_success_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_persist_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_parse_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_parse_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_parse_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_create_persist_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_merge_persist_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_ingestion_event_topology_delete_persist_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_not_supported_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_parse_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_parse_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_parse_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_parse_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_parse_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_parse_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_persist_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_persist_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_persist_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_persist_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_persist_success_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_persist_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_parse_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_parse_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_parse_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_create_persist_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_merge_persist_seconds")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_ingestion_event_topology_delete_persist_seconds")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_domain_types_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_entity_types_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_relationship_types_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_entity_by_id_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_entities_by_type_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_entities_by_domain_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_relationship_by_id_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_relationships_by_type_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_get_relationships_by_entity_id_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_domain_types_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_entity_types_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_relationship_types_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_entity_by_id_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_entities_by_type_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_entities_by_domain_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_relationship_by_id_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_relationships_by_type_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_get_relationships_by_entity_id_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_update_classifiers_fail_total")); - Assertions.assertTrue(result.getResponse().getContentAsString().contains("ties_exposure_http_update_decorators_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_update_classifiers_fail_total")); + Assertions.assertTrue(result.getResponse().getContentAsString().contains("teiv_exposure_http_update_decorators_fail_total")); // spotless:on } @@ -116,29 +116,29 @@ class CoreApplicationTest { "getTopologyEntityTypes:/domains/RAN_LOGICAL/entity-types", "getTopologyRelationshipTypes:/domains/RAN_LOGICAL/relationship-types" }, delimiter = ':') public void testPaginationRelatedEndpoints(String method, String url) throws Exception { - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("offset", "-1").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("offset", "-1").accept(APPLICATION_JSON)).andExpect( status().isBadRequest()).andExpect(result -> assertEquals(Objects.requireNonNull(result .getResolvedException()).getMessage(), method + ".offset: must be greater than or equal to 0")); - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("limit", "0").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("limit", "0").accept(APPLICATION_JSON)).andExpect( status().isBadRequest()).andExpect(result -> assertEquals(Objects.requireNonNull(result .getResolvedException()).getMessage(), method + ".limit: must be greater than or equal to 1")); - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("limit", "501").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("limit", "501").accept(APPLICATION_JSON)).andExpect( status().isBadRequest()).andExpect(result -> assertEquals(Objects.requireNonNull(result .getResolvedException()).getMessage(), method + ".limit: must be less than or equal to 500")); - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("offset", "0").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("offset", "0").accept(APPLICATION_JSON)).andExpect( result -> { if (result.getResponse().getStatus() != HttpStatus.OK.value()) assertNotEquals(ConstraintViolationException.class, Objects.requireNonNull(result .getResolvedException()).getClass()); }); - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("limit", "1").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("limit", "1").accept(APPLICATION_JSON)).andExpect( result -> { if (result.getResponse().getStatus() != HttpStatus.OK.value()) assertNotEquals(ConstraintViolationException.class, Objects.requireNonNull(result .getResolvedException()).getClass()); }); - mvc.perform(get(TiesConstants.REQUEST_MAPPING + url).param("limit", "500").accept(APPLICATION_JSON)).andExpect( + mvc.perform(get(TeivConstants.REQUEST_MAPPING + url).param("limit", "500").accept(APPLICATION_JSON)).andExpect( result -> { if (result.getResponse().getStatus() != HttpStatus.OK.value()) assertNotEquals(ConstraintViolationException.class, Objects.requireNonNull(result diff --git a/teiv/src/test/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafkaTest.java b/teiv/src/test/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafkaTest.java index 629e045..7fd7246 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafkaTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafkaTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,11 +49,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.oran.smo.teiv.utils.KafkaTestExecutionListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.kafka.test.EmbeddedKafkaBroker; @@ -67,17 +65,15 @@ import org.oran.smo.teiv.exception.UnsatisfiedExternalDependencyException; import org.oran.smo.teiv.service.kafka.KafkaFactory; import org.oran.smo.teiv.startup.SchemaHandler; import lombok.Getter; -import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @ActiveProfiles({ "test", "ingestion" }) @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@TestExecutionListeners(listeners = KafkaTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) @EmbeddedKafka @ExtendWith(OutputCaptureExtension.class) -public class DependentServiceAvailabilityKafkaTest { - +class DependentServiceAvailabilityKafkaTest { @Value("${spring.embedded.kafka.brokers}") @Getter private String embeddedKafkaServer; @@ -94,7 +90,7 @@ public class DependentServiceAvailabilityKafkaTest { @Autowired private DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka; - @MockBean + @MockitoBean private SchemaHandler schemaHandler; @BeforeEach @@ -135,10 +131,10 @@ public class DependentServiceAvailabilityKafkaTest { final NewTopic newTopic = new NewTopic("test_topic", 1, (short) 1); mockedAdminClient.createTopics(List.of(newTopic)); - ListTopicsResult topicListresult = Mockito.spy(mockedAdminClient.listTopics()); - KafkaFuture> kafkaFutures = Mockito.spy(topicListresult.names()); - doReturn(topicListresult).when(spiedAdminClient).listTopics(); - doReturn(kafkaFutures).when(topicListresult).names(); + ListTopicsResult topicListResult = Mockito.spy(mockedAdminClient.listTopics()); + KafkaFuture> kafkaFutures = Mockito.spy(topicListResult.names()); + doReturn(topicListResult).when(spiedAdminClient).listTopics(); + doReturn(kafkaFutures).when(topicListResult).names(); doThrow(InterruptedException.class).when(kafkaFutures).get(); MockedStatic mockedStaticAdminClient = Mockito.mockStatic(Admin.class); @@ -151,7 +147,9 @@ public class DependentServiceAvailabilityKafkaTest { assertThrows(UnsatisfiedExternalDependencyException.class, spiedDependentServiceAvailabilityKafka::isServiceAvailable); - Mockito.reset(spiedAdminClient, topicListresult, kafkaFutures, spiedDependentServiceAvailabilityKafka); + Mockito.reset(spiedAdminClient, topicListResult, kafkaFutures, spiedDependentServiceAvailabilityKafka); mockedStaticAdminClient.close(); + mockedAdminClient.close(); + spiedAdminClient.close(); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicatorTest.java similarity index 93% rename from teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicatorTest.java rename to teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicatorTest.java index c9ab411..f25b5c7 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesExposureHealthIndicatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivExposureHealthIndicatorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,12 +42,12 @@ import org.oran.smo.teiv.startup.SchemaHandler; @AutoConfigureMockMvc @SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", - "management.endpoint.health.group.readiness.include=readinessState,tiesExposure" }) + "management.endpoint.health.group.readiness.include=readinessState,teivExposure" }) @ActiveProfiles({ "test", "exposure" }) -class TiesExposureHealthIndicatorTest { +class TeivExposureHealthIndicatorTest { private final String readinessProbePath = "/actuator/health/readiness"; private final String livenessProbePath = "/actuator/health/liveness"; - private final String tiesExposureProbePath = "/actuator/health/tiesExposure"; + private final String teivExposureProbePath = "/actuator/health/teivExposure"; @Autowired private MockMvc mvc; @@ -76,7 +76,7 @@ class TiesExposureHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(livenessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( content().json("{'status' : 'UP'}")); - mvc.perform(get(tiesExposureProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) + mvc.perform(get(teivExposureProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) .andExpect(content().json(String.format("{'status':'UP','details':{'UP': '%s is UP and Healthy.'}}", SERVICE_NAME))); } @@ -93,7 +93,7 @@ class TiesExposureHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(readinessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()) .andExpect(content().json("{'status' : 'DOWN'}")); - mvc.perform(get(tiesExposureProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status() + mvc.perform(get(teivExposureProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status() .is5xxServerError()).andExpect(content().json(String.format( "{'status' : 'DOWN', 'details':{'Error':'%s is DOWN because:%s'}}", SERVICE_NAME, message))) .andReturn(); diff --git a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicatorTest.java similarity index 92% rename from teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicatorTest.java rename to teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicatorTest.java index 9ee4268..80b3640 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivGroupsHealthIndicatorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,12 +40,12 @@ import org.oran.smo.teiv.startup.SchemaHandler; @AutoConfigureMockMvc @SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", - "management.endpoint.health.group.readiness.include=readinessState,tiesGroups" }) + "management.endpoint.health.group.readiness.include=readinessState,teivGroups" }) @ActiveProfiles({ "test", "groups" }) -class TiesGroupsHealthIndicatorTest { +class TeivGroupsHealthIndicatorTest { private final String readinessProbePath = "/actuator/health/readiness"; private final String livenessProbePath = "/actuator/health/liveness"; - private final String tiesGroupsProbePath = "/actuator/health/tiesGroups"; + private final String teivGroupsProbePath = "/actuator/health/teivGroups"; @Autowired private MockMvc mvc; @@ -69,7 +69,7 @@ class TiesGroupsHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(livenessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( content().json("{'status' : 'UP'}")); - mvc.perform(get(tiesGroupsProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( + mvc.perform(get(teivGroupsProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( content().json(String.format("{'status':'UP','details':{'UP': '%s is UP and Healthy.'}}", SERVICE_NAME))); } @@ -84,7 +84,7 @@ class TiesGroupsHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(readinessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()) .andExpect(content().json("{'status' : 'DOWN'}")); - mvc.perform(get(tiesGroupsProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()) + mvc.perform(get(teivGroupsProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()) .andExpect(content().json(String.format("{'status' : 'DOWN', 'details':{'Error':'%s is DOWN because:%s'}}", SERVICE_NAME, message))).andReturn(); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicatorTest.java similarity index 93% rename from teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicatorTest.java rename to teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicatorTest.java index 7d48f3d..6e0ab85 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesIngestionHealthIndicatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TeivIngestionHealthIndicatorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,12 +46,12 @@ import org.oran.smo.teiv.startup.SchemaHandler; @AutoConfigureMockMvc @SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", - "management.endpoint.health.group.readiness.include=readinessState,tiesIngestion" }) + "management.endpoint.health.group.readiness.include=readinessState,teivIngestion" }) @ActiveProfiles({ "test", "ingestion" }) -class TiesIngestionHealthIndicatorTest { +class TeivIngestionHealthIndicatorTest { private final String readinessProbePath = "/actuator/health/readiness"; private final String livenessProbePath = "/actuator/health/liveness"; - private final String tiesIngestionProbePath = "/actuator/health/tiesIngestion"; + private final String teivIngestionProbePath = "/actuator/health/teivIngestion"; @Autowired private MockMvc mvc; @@ -85,7 +85,7 @@ class TiesIngestionHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(livenessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( content().json("{'status' : 'UP'}")); - mvc.perform(get(tiesIngestionProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) + mvc.perform(get(teivIngestionProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) .andExpect(content().json(String.format("{'status':'UP','details':{'UP': '%s is UP and Healthy.'}}", SERVICE_NAME))); } @@ -111,7 +111,7 @@ class TiesIngestionHealthIndicatorTest { content().json("{'status' : 'UP'}")); mvc.perform(get(readinessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()) .andExpect(content().json("{'status' : 'DOWN'}")); - mvc.perform(get(tiesIngestionProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status() + mvc.perform(get(teivIngestionProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status() .is5xxServerError()).andExpect(content().json(String.format( "{'status' : 'DOWN', 'details':{'Error':'%s is DOWN because:%s'}}", SERVICE_NAME, message))) .andReturn(); diff --git a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java b/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java index 42bd363..7e1be03 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java +++ b/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,11 +73,11 @@ public class TestPostgresqlContainer extends PostgreSQLContainer classifiersService.update(OranTeivClassifier.builder().classifiers(classifiersToMerge) .entityIds(List.of(ENTITY_ID)).relationshipIds(List.of(RELATIONSHIP_ID)).operation(OperationEnum.MERGE) - .build())).isInstanceOf(TiesException.class); + .build())).isInstanceOf(TeivException.class); } @Test @@ -237,7 +234,7 @@ class ClassifiersServiceContainerizedTest { assertThatThrownBy(() -> classifiersService.update(OranTeivClassifier.builder().classifiers(classifiersToDelete) .entityIds(List.of("WRONG_ID")).relationshipIds(Collections.emptyList()).operation(OperationEnum.DELETE) - .build())).isInstanceOf(TiesException.class); + .build())).isInstanceOf(TeivException.class); } @Test @@ -257,7 +254,7 @@ class ClassifiersServiceContainerizedTest { assertThatThrownBy(() -> classifiersService.update(OranTeivClassifier.builder().classifiers(classifiersToDelete) .entityIds(Collections.emptyList()).relationshipIds(List.of("WRONG_ID")).operation(OperationEnum.DELETE) - .build())).isInstanceOf(TiesException.class); + .build())).isInstanceOf(TeivException.class); } @Test diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/data/api/impl/ExposureMetricsTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/data/api/impl/ExposureMetricsTest.java index 2f809d7..1cd1cac 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/data/api/impl/ExposureMetricsTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/data/api/impl/ExposureMetricsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.oran.smo.teiv.utils.TiesTestConstants.APPLICATION_JSON; +import static org.oran.smo.teiv.utils.TeivTestConstants.APPLICATION_JSON; import java.util.Collections; import java.util.function.Supplier; @@ -41,7 +41,7 @@ import org.junit.jupiter.api.Test; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.api.model.OranTeivClassifier; import org.oran.smo.teiv.api.model.OranTeivDecorator; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.audit.LoggerHandler; import org.oran.smo.teiv.exposure.data.api.DataService; import org.oran.smo.teiv.exposure.data.rest.controller.DataController; @@ -89,14 +89,14 @@ class ExposureMetricsTest { @Test void testGetRelationshipsByEntityIdFailMetrics() { when(mockedDataService.getAllRelationshipsForObjectId(eq(DOMAIN_NAME), eq(ENTITY_NAME), eq(ENTITY_ID), anyString(), - anyString(), any(RequestDetails.class))).thenThrow(TiesException.class); + anyString(), any(RequestDetails.class))).thenThrow(TeivException.class); assertMetrics(() -> dataController.getAllRelationshipsForEntityId(APPLICATION_JSON, DOMAIN_NAME, ENTITY_NAME, ENTITY_ID, "", "", 0, 1), underTest.getNumUnsuccessfullyExposedRelationshipsByEntityId()::count); } @Test void testGetEntityByIdFailMetrics() { - when(mockedDataService.getEntityById(ENTITY_NAME, ENTITY_ID)).thenThrow(TiesException.class); + when(mockedDataService.getEntityById(ENTITY_NAME, ENTITY_ID)).thenThrow(TeivException.class); assertMetrics(() -> dataController.getTopologyById(APPLICATION_JSON, DOMAIN_NAME, ENTITY_NAME, ENTITY_ID), underTest .getNumUnsuccessfullyExposedEntityById()::count); } @@ -104,7 +104,7 @@ class ExposureMetricsTest { @Test void testGetEntitiesByTypeFailMetrics() { when(mockedDataService.getTopologyByType(anyString(), eq(ENTITY_NAME), anyString(), anyString(), any( - RequestDetails.class))).thenThrow(TiesException.class); + RequestDetails.class))).thenThrow(TeivException.class); assertMetrics(() -> dataController.getTopologyByEntityTypeName(APPLICATION_JSON, DOMAIN_NAME, ENTITY_NAME, "", "", 0, 1), underTest.getNumUnsuccessfullyExposedEntitiesByType()::count); } @@ -112,14 +112,14 @@ class ExposureMetricsTest { @Test void testGetEntitiesByDomainFailMetrics() { when(mockedDataService.getEntitiesByDomain(eq(DOMAIN_NAME), anyString(), anyString(), any(RequestDetails.class))) - .thenThrow(TiesException.class); + .thenThrow(TeivException.class); assertMetrics(() -> dataController.getEntitiesByDomain(APPLICATION_JSON, DOMAIN_NAME, "", "", 0, 1), underTest .getNumUnsuccessfullyExposedEntitiesByDomain()::count); } @Test void testGetRelationshipByIdFailMetrics() { - when(mockedDataService.getRelationshipById(RELATION_TYPE, ENTITY_ID)).thenThrow(TiesException.class); + when(mockedDataService.getRelationshipById(RELATION_TYPE, ENTITY_ID)).thenThrow(TeivException.class); assertMetrics(() -> dataController.getRelationshipById(APPLICATION_JSON, DOMAIN_NAME, RELATION_TYPE, ENTITY_ID), underTest.getNumUnsuccessfullyExposedRelationshipById()::count); } @@ -127,7 +127,7 @@ class ExposureMetricsTest { @Test void testGetRelationshipsByTypeFailMetrics() { when(mockedDataService.getRelationshipsByType(anyString(), eq(RELATION_TYPE), anyString(), anyString(), any( - RequestDetails.class))).thenThrow(TiesException.class); + RequestDetails.class))).thenThrow(TeivException.class); assertMetrics(() -> dataController.getRelationshipsByType(APPLICATION_JSON, DOMAIN_NAME, RELATION_TYPE, "", "", 0, 1), underTest.getNumUnsuccessfullyExposedRelationshipsByType()::count); } @@ -135,14 +135,14 @@ class ExposureMetricsTest { @Test void testGetRelationshipTypesFailMetrics() { when(mockedDataService.getTopologyRelationshipTypes(eq(DOMAIN_NAME), any(RequestDetails.class))).thenThrow( - TiesException.class); + TeivException.class); assertMetrics(() -> dataController.getTopologyRelationshipTypes(APPLICATION_JSON, DOMAIN_NAME, 0, 1), underTest .getNumUnsuccessfullyExposedRelationshipTypes()::count); } @Test void testGetDomainTypesFailMetrics() { - when(mockedDataService.getDomainTypes(any(RequestDetails.class))).thenThrow(TiesException.class); + when(mockedDataService.getDomainTypes(any(RequestDetails.class))).thenThrow(TeivException.class); assertMetrics(() -> dataController.getAllDomains(APPLICATION_JSON, 0, 1), underTest .getNumUnsuccessfullyExposedDomainTypes()::count); } @@ -150,14 +150,14 @@ class ExposureMetricsTest { @Test void testGetEntityTypesFailMetrics() { when(mockedDataService.getTopologyEntityTypes(eq(DOMAIN_NAME), any(RequestDetails.class))).thenThrow( - TiesException.class); + TeivException.class); assertMetrics(() -> dataController.getTopologyEntityTypes(APPLICATION_JSON, DOMAIN_NAME, 0, 1), underTest .getNumUnsuccessfullyExposedEntityTypes()::count); } @Test void testUpdateClassifiersFailMetrics() { - doThrow(TiesException.invalidClassifiersException(Collections.emptyList())).when(mockedClassifiersService).update( + doThrow(TeivException.invalidClassifiersException(Collections.emptyList())).when(mockedClassifiersService).update( any(OranTeivClassifier.class)); assertMetrics(() -> classifiersRestController.updateClassifier(APPLICATION_JSON, APPLICATION_JSON, OranTeivClassifier.builder().operation(OranTeivClassifier.OperationEnum.MERGE).build()), underTest @@ -166,7 +166,7 @@ class ExposureMetricsTest { @Test void testUpdateDecoratorsFailMetrics() { - doThrow(TiesException.invalidClassifiersException(Collections.emptyList())).when(mockedDecoratorsService).update( + doThrow(TeivException.invalidClassifiersException(Collections.emptyList())).when(mockedDecoratorsService).update( any(OranTeivDecorator.class)); assertMetrics(() -> decoratorsRestController.updateDecorator(APPLICATION_JSON, APPLICATION_JSON, OranTeivDecorator .builder().operation(OranTeivDecorator.OperationEnum.MERGE).build()), underTest @@ -174,7 +174,7 @@ class ExposureMetricsTest { } private void assertMetrics(Supplier controllerMethod, Supplier failerSupplier) { - Assertions.assertThrowsExactly(TiesException.class, controllerMethod::get); + Assertions.assertThrowsExactly(TeivException.class, controllerMethod::get); Assertions.assertEquals(1.0, failerSupplier.get()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/decorators/api/DecoratorsServiceContainerizedTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/decorators/api/DecoratorsServiceContainerizedTest.java index 04c81e6..13062a6 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/decorators/api/DecoratorsServiceContainerizedTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/decorators/api/DecoratorsServiceContainerizedTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,16 +24,16 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; -import static org.oran.smo.teiv.utils.TiesConstants.CONSUMER_DATA_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.REL_PREFIX; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesTestConstants.KAFKA_RETRY_INTERVAL_10_MS; -import static org.oran.smo.teiv.utils.TiesTestConstants.SPRING_BOOT_SERVER_HOST; -import static org.oran.smo.teiv.utils.TiesTestConstants.SPRING_BOOT_SERVER_PORT; +import static org.oran.smo.teiv.utils.TeivConstants.CONSUMER_DATA_PREFIX; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.REL_PREFIX; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivTestConstants.KAFKA_RETRY_INTERVAL_10_MS; +import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_HOST; +import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_PORT; import java.util.Collections; import java.util.List; @@ -61,8 +61,6 @@ import org.oran.smo.teiv.db.TestPostgresqlContainer; import org.oran.smo.teiv.startup.SchemaCleanUpHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -76,13 +74,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Getter; import org.oran.smo.teiv.api.model.OranTeivDecorator; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.startup.SchemaHandler; import org.oran.smo.teiv.utils.JooqTypeConverter; -@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) @EmbeddedKafka @ActiveProfiles({ "test", "exposure" }) @SpringBootTest(properties = { SPRING_BOOT_SERVER_HOST, SPRING_BOOT_SERVER_PORT, KAFKA_RETRY_INTERVAL_10_MS }) @@ -94,7 +91,7 @@ class DecoratorsServiceContainerizedTest { private KafkaConsumer testConsumer; - private static final String TABLE_NAME = String.format(TIES_DATA, "o-ran-smo-teiv-ran_ODUFunction"); + private static final String TABLE_NAME = String.format(TEIV_DATA, "o-ran-smo-teiv-ran_ODUFunction"); private static final String ENTITY_ID = "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16"; private static final String ENTITY_TYPE = "ODUFunction"; @@ -145,7 +142,7 @@ class DecoratorsServiceContainerizedTest { @BeforeEach public void setupEach() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA, TEIV_CONSUMER_DATA_SCHEMA), writeDataDslContext); TestPostgresqlContainer.loadSampleData(); Supplier brokers = this::getEmbeddedKafkaServer; testConsumer = createConsumerForTest(getEmbeddedKafkaServer()); @@ -213,7 +210,7 @@ class DecoratorsServiceContainerizedTest { assertThatThrownBy(() -> decoratorsService.update(OranTeivDecorator.builder().decorators(decoratorsToMerge) .entityIds(List.of(ENTITY_ID)).relationshipIds(List.of(RELATIONSHIP_ID)).operation( - OranTeivDecorator.OperationEnum.MERGE).build())).isInstanceOf(TiesException.class); + OranTeivDecorator.OperationEnum.MERGE).build())).isInstanceOf(TeivException.class); } @Test @@ -223,7 +220,7 @@ class DecoratorsServiceContainerizedTest { assertThatThrownBy(() -> decoratorsService.update(OranTeivDecorator.builder().decorators(decoratorsToMerge) .entityIds(List.of(ENTITY_ID)).relationshipIds(List.of(RELATIONSHIP_ID)).operation( - OranTeivDecorator.OperationEnum.MERGE).build())).isInstanceOf(TiesException.class); + OranTeivDecorator.OperationEnum.MERGE).build())).isInstanceOf(TeivException.class); } @Test @@ -293,7 +290,7 @@ class DecoratorsServiceContainerizedTest { assertThatThrownBy(() -> decoratorsService.update(OranTeivDecorator.builder().decorators(decoratorsToDelete) .entityIds(List.of("WRONG_ID")).relationshipIds(Collections.emptyList()).operation( - OranTeivDecorator.OperationEnum.DELETE).build())).isInstanceOf(TiesException.class); + OranTeivDecorator.OperationEnum.DELETE).build())).isInstanceOf(TeivException.class); } @Test @@ -314,7 +311,7 @@ class DecoratorsServiceContainerizedTest { assertThatThrownBy(() -> decoratorsService.update(OranTeivDecorator.builder().decorators(decoratorsToDelete) .entityIds(Collections.emptyList()).relationshipIds(List.of("WRONG_ID")).operation( - OranTeivDecorator.OperationEnum.DELETE).build())).isInstanceOf(TiesException.class); + OranTeivDecorator.OperationEnum.DELETE).build())).isInstanceOf(TeivException.class); } @Test diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImplGETRequestsContainerizedTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImplGETRequestsContainerizedTest.java index 68c46a3..bd65066 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImplGETRequestsContainerizedTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImplGETRequestsContainerizedTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,14 +20,14 @@ */ package org.oran.smo.teiv.exposure.spi.impl; -import static org.oran.smo.teiv.utils.TiesConstants.MODULE_REFERENCE; +import static org.oran.smo.teiv.utils.TeivConstants.MODULE_REFERENCE; import static org.assertj.core.api.Assertions.assertThat; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_MODEL; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL; import java.util.Collections; import java.util.List; @@ -46,6 +46,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.oran.smo.teiv.schema.EntityType; +import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.SchemaRegistryException; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Configuration; @@ -54,7 +56,7 @@ import org.oran.smo.teiv.db.TestPostgresqlContainer; import org.oran.smo.teiv.exposure.spi.ModelRepository; import org.oran.smo.teiv.exposure.spi.Module; import org.oran.smo.teiv.exposure.spi.ModuleStatus; -import org.oran.smo.teiv.exposure.tiespath.refiner.BasePathRefinement; +import org.oran.smo.teiv.exposure.teivpath.refiner.BasePathRefinement; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.schema.SchemaRegistry; @@ -83,7 +85,7 @@ class DataRepositoryImplGETRequestsContainerizedTest { @BeforeEach public void deleteAll() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA, TEIV_CONSUMER_DATA_SCHEMA), writeDataDslContext); TestPostgresqlContainer.loadSampleData(); } @@ -101,13 +103,13 @@ class DataRepositoryImplGETRequestsContainerizedTest { schemaByName = modelRepository.getConsumerModuleByName(moduleName); Assertions.assertTrue(schemaByName.isPresent()); - modelRepository.doesModuleExists(TIES_MODEL, moduleName); - modelRepository.doesModuleExists(TIES_CONSUMER_DATA, moduleName); + modelRepository.doesModuleExists(TEIV_MODEL, moduleName); + modelRepository.doesModuleExists(TEIV_CONSUMER_DATA, moduleName); modelRepository.updateModuleStatus(moduleName, ModuleStatus.DELETING); final @NotNull Record1 status = readDataDslContext.select(field("status")).from(table(String.format( - TIES_CONSUMER_DATA, MODULE_REFERENCE))).where(field("name").eq(moduleName)).fetchAny(); + TEIV_CONSUMER_DATA, MODULE_REFERENCE))).where(field("name").eq(moduleName)).fetchAny(); Assertions.assertEquals(ModuleStatus.DELETING.name(), status.get("status")); @@ -176,4 +178,40 @@ class DataRepositoryImplGETRequestsContainerizedTest { "o-ran-smo-teiv-ran", "NRSectorCarrier"), Set.of("ocucp-ocuup-model:Weekend"))); } + @Test + void isTopologyExist_entityTest() throws SchemaRegistryException { + EntityType entityType = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "NRCellDU").get(0); + String entityId = "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91"; + Assertions.assertTrue(underTest.isTopologyExist(entityType, entityId), + "That's strange, the result should have been true as this id in DB dataset: " + entityId); + String nonExistentEntityId = "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=911"; + Assertions.assertFalse(underTest.isTopologyExist(entityType, nonExistentEntityId), + "Result should have been false as the entity id is not in DB data set: " + nonExistentEntityId); + } + + @Test + void isTopologyExist_relationshipTest() throws SchemaRegistryException { + RelationType relationType = SchemaRegistry.getRelationTypeByDomainAndName("RAN", + "NRSECTORCARRIER_USES_ANTENNACAPABILITY").get(0); + String aSideRelationshipId = "urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=11EDFC31E2BE240D3CB15DB1A3FA3B78C828524BC8FCA3365A615129A61A627C21DA8EBF6DD788CDBDEC668344D1F79A371749083D6AE04DDDD57CB4FA8C3ECB"; + Assertions.assertTrue(underTest.isTopologyExist(relationType, aSideRelationshipId), + "That's strange, the result should have been true as this id in DB dataset: " + aSideRelationshipId); + + relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION") + .get(0); + String bSideRelationshipId = "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A"; + Assertions.assertTrue(underTest.isTopologyExist(relationType, bSideRelationshipId), + "That's strange, the result should have been true as this id in DB dataset: " + bSideRelationshipId); + + relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_EQUIPMENT_RAN", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").get(0); + String manyToManyRelationshipId = "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65"; + Assertions.assertTrue(underTest.isTopologyExist(relationType, manyToManyRelationshipId), + "That's strange, the result should have been true as this id in DB dataset: " + manyToManyRelationshipId); + + String nonExistentRelationshipId = "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A"; + Assertions.assertFalse(underTest.isTopologyExist(relationType, nonExistentRelationshipId), + "Result should have been false as the relationship id is not in DB data set: " + nonExistentRelationshipId); + } + } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/mapper/RelationshipMapperTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/mapper/RelationshipMapperTest.java index 9e1ea94..7e62a28 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/mapper/RelationshipMapperTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/spi/mapper/RelationshipMapperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,10 +60,10 @@ class RelationshipMapperTest { @Test void testCreateProperties() { Record record = DSL.using(SQLDialect.POSTGRES).newRecord(field( - "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU\""), field( - "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-gnbduFunction\""), field( - "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"id\""), field( - "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU\"")) + "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU\""), field( + "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-gnbduFunction\""), field( + "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"id\""), field( + "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU\"")) .values("urn:base64:R05CRFVGdW5jdGlvbjo2QTBENUFBMjhGNzcwQzk5NDFCNzRFQkU1NzYxMUFFMTpQUk9WSURFUzpOUkNlbGxEVTowMDAxNjFCMDE0QzMyMDEwNkE5RDZCMTQxN0Y4RUIwQQ==", "6A0D5AA28F770C9941B74EBE57611AE1", "000161B014C320106A9D6B1417F8EB0A", List.of("sid1", "sid2")); diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/DtoToJooqTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/DtoToJooqTest.java similarity index 77% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/DtoToJooqTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/DtoToJooqTest.java index 7d06ab3..66f397e 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/DtoToJooqTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/DtoToJooqTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,9 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; -import static org.oran.smo.teiv.utils.TiesConstants.ITEM; +import static org.oran.smo.teiv.utils.TeivConstants.ITEM; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.field; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -30,8 +30,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; -import org.oran.smo.teiv.exposure.tiespath.resolver.ResolverDataType; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.exposure.teivpath.resolver.ResolverDataType; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.jooq.Condition; @@ -45,7 +45,6 @@ import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; class DtoToJooqTest { - private static final String OCUCP_FUNCTION = "OCUCPFunction"; private static final String ODU_FUNCTION = "ODUFunction"; private static final String ANTENNA_CAPABILITY = "AntennaCapability"; @@ -74,8 +73,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION\" is not null\n" + - " or ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION\" is not null\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION\" is not null\n") .toString(), olb1.getCondition().toString()); // spotless:on } @@ -102,8 +101,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" = 'ABC789'\n" + - " or ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" like (('%' || replace(\n" + + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" = 'ABC789'\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" like (('%' || replace(\n" + " replace(\n" + " replace('ABC789', '!', '!!'),\n" + " '%',\n" + @@ -112,7 +111,7 @@ class DtoToJooqTest { " '_',\n" + " '!_'\n" + " )) || '%') escape '!'\n" + - " or ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" is not null\n") + " or teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @@ -133,8 +132,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"gNBId\" = 1\n" + - " or ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"gNBId\" = 2\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"gNBId\" = 1\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"gNBId\" = 2\n") .toString(), actualCondition.toString()); // spotless:on } @@ -155,8 +154,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"decimalColumn\" = 2.5\n" + - " or ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"decimalColumn\" = 15.25\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"decimalColumn\" = 2.5\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"decimalColumn\" = 15.25\n") .toString(), actualCondition.toString()); // spotless:on } @@ -194,18 +193,18 @@ class DtoToJooqTest { .container(ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( "POINT(39.4019881 67.9419888").dataType(DataType.GEOGRAPHIC).build(); // spotless:off - assertEquals(condition("ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('point(39.4019881 67.9419888)')") + assertEquals(condition("teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('point(39.4019881 67.9419888)')") .toString(), new ScopeLogicalBlock(valid1).getCondition().toString()); - assertEquals(condition("ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('POINT(39.4019881 67.9419888)')") + assertEquals(condition("teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('POINT(39.4019881 67.9419888)')") .toString(), new ScopeLogicalBlock(valid2).getCondition().toString()); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidContains)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidCoordinate0)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidCoordinate1)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidCoordinate2)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidCoordinate3)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat1)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat2)::getCondition); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat3)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidContains)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidCoordinate0)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidCoordinate1)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidCoordinate2)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidCoordinate3)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidFormat1)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidFormat2)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidFormat3)::getCondition); // spotless:on } @@ -228,10 +227,10 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mnc' = '\"789\"'\n" + - " or ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" ->> 'mcc' like '%456%'\n") + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mnc' = '\"789\"'\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" ->> 'mcc' like '%456%'\n") .toString(), actualCondition.toString()); - assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidQueryFunction)::getCondition); + assertThrows(TeivPathException.class, new ScopeLogicalBlock(invalidQueryFunction)::getCondition); // spotless:on } @@ -257,9 +256,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' -> 'mcca' = '\"789\"'\n" + - " or ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' -> 'mccb' = '789'\n" + - " or ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' ->> 'mcca' like '%789%'\n") + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' -> 'mcca' = '\"789\"'\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' -> 'mccb' = '789'\n" + + " or teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"dUpLMNId\" -> 'mcc' ->> 'mcca' like '%789%'\n") .toString(), actualCondition.toString()); // spotless:on } @@ -281,7 +280,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "'POINT (12.3426 45.24568))', 500").resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.WITHIN_METERS).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -290,7 +289,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "'POINT (12.3426 45.24568 345.6)', 500").resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.WITHIN_METERS).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -299,7 +298,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "'POINT (12.3426 45.)', 500").resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.WITHIN_METERS).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -308,7 +307,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "'POINT (12.3426)', 500").resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.WITHIN_METERS).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -317,7 +316,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "'(12.3426 345.533)', 500").resolverDataType(ResolverDataType.STRING).queryFunction( QueryFunction.WITHIN_METERS).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -372,7 +371,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "POLYGON((12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568,))") .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -381,7 +380,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "POLYGON(12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.)").resolverDataType( ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -390,7 +389,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "POLYGON(12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568 34.63)") .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -399,7 +398,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "POLYGON(12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568))") .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -408,7 +407,7 @@ class DtoToJooqTest { .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( "(12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568)").resolverDataType( ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -417,7 +416,7 @@ class DtoToJooqTest { .leaf("mcca").dataType(DataType.PRIMITIVE).topologyObjectType(TopologyObjectType.ENTITY).parameter( "POLYGON (12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568)") .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); - assertThrows(TiesPathException.class, () -> scopeObject.getCondition()); + assertThrows(TeivPathException.class, () -> scopeObject.getCondition()); } @Test @@ -442,9 +441,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\" @> '\"789\"')\n" + - " or (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\" @> '789')\n" + - " or (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\"::text like '%456%')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\" @> '\"789\"')\n" + + " or (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\" @> '789')\n" + + " or (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"eUtranFqBands\"::text like '%456%')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -474,9 +473,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' -> 'levelTwoField' @> '\"456\"')\n" + - " or (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' -> 'levelTwoField' @> '456')\n" + - " or (ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' ->> 'levelTwoField'::text like '%456%')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' -> 'levelTwoField' @> '\"456\"')\n" + + " or (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' -> 'levelTwoField' @> '456')\n" + + " or (teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"jsonbColumn\" -> 'levelOneField' ->> 'levelTwoField'::text like '%456%')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -509,9 +508,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBId\" = 1\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"decimalId\" = 2.5\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" like (('%' || replace(\n" + + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBId\" = 1\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"decimalId\" = 2.5\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" like (('%' || replace(\n" + " replace(\n" + " replace('ABC789', '!', '!!'),\n" + " '%',\n" + @@ -520,7 +519,7 @@ class DtoToJooqTest { " '_',\n" + " '!_'\n" + " )) || '%') escape '!'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"pLMNId\" -> 'mnc' = '\"789\"'\n") + " and teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"pLMNId\" -> 'mnc' = '\"789\"'\n") .toString(), actualCondition.toString()); // spotless:on } @@ -541,8 +540,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"rel_column1\" = 1\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"rel_column2\" = 'ABC789'\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"rel_column1\" = 1\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"rel_column2\" = 'ABC789'\n") .toString(), actualCondition.toString()); // spotless:on } @@ -553,7 +552,7 @@ class DtoToJooqTest { TopologyObjectType.UNDEFINED).container(ContainerType.ATTRIBUTES).leaf("rel_column1").queryFunction( QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); - assertThrows(TiesPathException.class, slb1::getCondition); + assertThrows(TeivPathException.class, slb1::getCondition); } @Test @@ -579,9 +578,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" = 'urn:base64:TWFuYWdlZEV'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" = 'urn:base64:TWFuYWdlZEW'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" = 'urn:base64:TWFuYWdlZEZ'\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" = 'urn:base64:TWFuYWdlZEV'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" = 'urn:base64:TWFuYWdlZEW'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" = 'urn:base64:TWFuYWdlZEZ'\n") .toString(), actualCondition.toString()); // spotless:on } @@ -601,9 +600,9 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - assertThrows(TiesPathException.class, slb1::getCondition); - assertThrows(TiesPathException.class, slb2::getCondition); - assertThrows(TiesPathException.class, slb3::getCondition); + assertThrows(TeivPathException.class, slb1::getCondition); + assertThrows(TeivPathException.class, slb2::getCondition); + assertThrows(TeivPathException.class, slb3::getCondition); } @Test @@ -622,8 +621,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'ABC123'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"id\" like (('%' || replace(\n" + + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'ABC123'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"id\" like (('%' || replace(\n" + " replace(\n" + " replace('DEF456', '!', '!!'),\n" + " '%',\n" + @@ -652,8 +651,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" = 'urn:base64:TWFuYWdlZEV'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" like (('%' || replace(\n" + + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" = 'urn:base64:TWFuYWdlZEV'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" like (('%' || replace(\n" + " replace(\n" + " replace('urn:base64:TWFuYWdlZEW', '!', '!!'),\n" + " '%',\n" + @@ -682,8 +681,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" is not null\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" is not null\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @@ -696,48 +695,49 @@ class DtoToJooqTest { ScopeLogicalBlock invalidTopologyObjectType = new ScopeLogicalBlock(ScopeObject.builder("ODUFunction") .topologyObjectType(TopologyObjectType.UNDEFINED).container(ContainerType.ID).queryFunction( QueryFunction.NOT_NULL).parameter("urn:base64:TWFuYWdlZEV").dataType(DataType.PRIMITIVE).build()); - assertThrows(TiesPathException.class, undefinedTOType::getCondition); - assertThrows(TiesPathException.class, invalidTopologyObjectType::getCondition); + assertThrows(TeivPathException.class, undefinedTOType::getCondition); + assertThrows(TeivPathException.class, invalidTopologyObjectType::getCondition); } @Test void testConditions_entityAssociation_oneToMany1() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction/managed-by-managedElement") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of( "managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-by-managedElement")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + ODU_FUNCTION + "/managed-by-managedElement").topologyObjectType(TopologyObjectType.ASSOCIATION).container( + ContainerType.NOT_NULL).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.NOT_NULL) + .parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" = 'me1'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" = 'me1'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_entityAssociation_oneToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(MANAGED_ELEMENT).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-oduFunction")).leaf("id").queryFunction(QueryFunction.EQ).parameter("odu1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(MANAGED_ELEMENT).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-ocucpFunction")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(MANAGED_ELEMENT + "/managed-oduFunction") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) + .leaf("id").queryFunction(QueryFunction.EQ).parameter("odu1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + MANAGED_ELEMENT + "/managed-ocucpFunction").topologyObjectType(TopologyObjectType.ASSOCIATION).container( + ContainerType.NOT_NULL).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.NOT_NULL) + .parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'odu1'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'odu1'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @@ -745,33 +745,32 @@ class DtoToJooqTest { @Test void testConditions_entityAssociation_manyToOne1() { //antennamodule/entites?scopeFilter=/installed-at-site[@id=site'] - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("installed-at-site")) + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE + "/installed-at-site") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) .leaf("id").queryFunction(QueryFunction.EQ).parameter("site1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("installed-at-site")) - .leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE + "/installed-at-site") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List + .of()).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new OrLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" = 'site1'\n" + - " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" = 'site1'\n" + + " or teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_entityAssociation_manyToOne2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "installed-antennaModule")).leaf("id").queryFunction(QueryFunction.EQ).parameter("am1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "installed-antennaModule")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site/installed-antennaModule") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) + .leaf("id").queryFunction(QueryFunction.EQ).parameter("am1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("Site/installed-antennaModule") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List + .of()).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new OrLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); @@ -779,26 +778,25 @@ class DtoToJooqTest { assertEquals(condition( "\n" + " (\n" + - " ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + - " and ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" + + " teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + + " and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" + " )\n" + - " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") + " or teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_entityAssociation_manyToOne1Contains() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "installed-antennaModule")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("am1") - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site/installed-antennaModule") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).dataType(DataType.PRIMITIVE) + .innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("am1").build()); Condition actualCondition = scopeObject1.getCondition(); // spotless:off assertEquals(condition( "\n" + - "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + - "and ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" like (" + + "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + + "and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" like (" + "('%' || replace(" + "\n"+ "replace(" + "\n"+ "replace('am1', '!', '!!')," + "\n"+ @@ -814,13 +812,13 @@ class DtoToJooqTest { @Test void testConditions_entityAssociation_manyToMany1Contains() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serviced-antennaCapability")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("ac1") - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + ANTENNA_MODULE + "/serviced-antennaCapability").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.ID).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.CONTAINS) + .parameter("ac1").build()); Condition actualCondition = scopeObject1.getCondition(); // spotless:off - assertEquals(("ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" + + assertEquals(("teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" + ".\"bSide_AntennaCapability\"like(('%'||replace(" + "\n"+ "replace(" + "\n"+ "replace('ac1','!','!!')," + "\n"+ @@ -836,14 +834,13 @@ class DtoToJooqTest { @Test void testConditions_entityAssociation_oneToMany1Contains() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("me1") - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction/managed-by-managedElement") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) + .leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("me1").build()); Condition actualCondition = scopeObject1.getCondition(); // spotless:off assertEquals( - ("ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\"like(('%'||replace(" + "\n" + + ("teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\"like(('%'||replace(" + "\n" + "replace(" +"\n"+ "replace('me1','!','!!')," + "\n" + "'%'," + "\n" + @@ -858,119 +855,125 @@ class DtoToJooqTest { @Test void testConditions_entityAssociation_manyToMany1() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serviced-antennaCapability")).leaf("id").queryFunction(QueryFunction.EQ).parameter("ac1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serviced-antennaCapability")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + ANTENNA_MODULE + "/serviced-antennaCapability").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.ID).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter( + "ac1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + ANTENNA_MODULE + "/serviced-antennaCapability").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf(null).queryFunction( + QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + - " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") + " teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + + " and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_entityAssociation_manyToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serving-antennaModule")).leaf("id").queryFunction(QueryFunction.EQ).parameter("am1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serving-antennaModule")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + ANTENNA_CAPABILITY + "/serving-antennaModule").topologyObjectType(TopologyObjectType.ASSOCIATION).container( + ContainerType.ID).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter( + "am1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + ANTENNA_CAPABILITY + "/serving-antennaModule").topologyObjectType(TopologyObjectType.ASSOCIATION).container( + ContainerType.NOT_NULL).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.NOT_NULL) + .parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + - " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") + " teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + + " and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_oneToMany1() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ORUFUNCTION") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1") - .build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("managed-by-managedElement")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ORUFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf("id") + .queryFunction(QueryFunction.EQ).parameter("me1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ODUFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) + .queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" = 'me1'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" = 'me1'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_oneToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ORUFUNCTION") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("managed-oruFunction")).leaf("id").queryFunction(QueryFunction.EQ).parameter("oruf1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("managed-by-managedElement")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ORUFUNCTION/managed-oruFunction").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.ID).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter( + "oruf1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ODUFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf( + null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"id\" = 'oruf1'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"id\" = 'oruf1'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_manyToOne1() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_INSTALLED_AT_SITE") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("installed-at-site")).leaf("id").queryFunction(QueryFunction.EQ).parameter("site1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_INSTALLED_AT_SITE") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("installed-at-site")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_INSTALLED_AT_SITE/installed-at-site").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.ID).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter( + "site1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_INSTALLED_AT_SITE/installed-at-site").topologyObjectType(TopologyObjectType.ASSOCIATION) + .container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf(null).queryFunction( + QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new OrLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" = 'site1'\n" + - " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") + " teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" = 'site1'\n" + + " or teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_manyToOne2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_INSTALLED_AT_SITE") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("installed-antennaModule")).leaf("id").queryFunction(QueryFunction.EQ).parameter("am1") - .build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_INSTALLED_AT_SITE") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("installed-antennaModule")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_INSTALLED_AT_SITE/installed-antennaModule").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf("id") + .queryFunction(QueryFunction.EQ).parameter("am1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_INSTALLED_AT_SITE/installed-antennaModule").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf( + null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new OrLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); @@ -978,63 +981,64 @@ class DtoToJooqTest { assertEquals(condition( "\n" + " (\n" + - " ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + - " and ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" + + " teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" + + " and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" + " )\n" + - " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") + " or teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_manyToMany1() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_SERVES_ANTENNACAPABILITY") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("serviced-antennaCapability")).leaf("id").queryFunction(QueryFunction.EQ).parameter("ac1") - .build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_SERVES_ANTENNACAPABILITY") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("serviced-antennaCapability")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY/serviced-antennaCapability").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf("id") + .queryFunction(QueryFunction.EQ).parameter("ac1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY/serviced-antennaCapability").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf( + null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + - " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") + " teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + + " and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_relationAssociation_manyToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_SERVES_ANTENNACAPABILITY") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("serving-antennaModule")).leaf("id").queryFunction(QueryFunction.EQ).parameter("am1").build()); - ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_SERVES_ANTENNACAPABILITY") - .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List - .of("serving-antennaModule")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null) - .build()); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY/serving-antennaModule").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf("id") + .queryFunction(QueryFunction.EQ).parameter("am1").build()); + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY/serving-antennaModule").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).innerContainer(List.of()).leaf( + null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); AndOrLogicalBlock alb = new AndLogicalBlock(); alb.setChildren(List.of(scopeObject1, scopeObject2)); Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + - " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") + " teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + + " and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testConditions_entityAssociation_throws() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("CloudNativeApplication").container( - ContainerType.ASSOCIATION).innerContainer(List.of("realised-oduFunction")).leaf("id").queryFunction( - QueryFunction.CONTAINS).parameter("odu1").build()); - assertThrows(TiesPathException.class, scopeObject1::getCondition); + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder( + "CloudNativeApplication/realised-oduFunction").container(ContainerType.ID).innerContainer(List.of()).leaf( + "id").queryFunction(QueryFunction.CONTAINS).parameter("odu1").build()); + assertThrows(TeivPathException.class, scopeObject1::getCondition); } @Test @@ -1053,8 +1057,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_classifiers\"::text like '%odu-function-model:Ru%')\n" + - " and (ties_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_classifiers\" @> '\"ocucp-function-model:Weekend\"')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_classifiers\"::text like '%odu-function-model:Ru%')\n" + + " and (teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_classifiers\" @> '\"ocucp-function-model:Weekend\"')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -1075,8 +1079,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU\"::text like '%odu-function-model:Ru%')\n" + - " and (ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" @> '\"ocucp-function-model:Weekend\"')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU\"::text like '%odu-function-model:Ru%')\n" + + " and (teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" @> '\"ocucp-function-model:Weekend\"')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -1098,8 +1102,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_sourceIds\"::text like '%urn:cmHandle:%')\n" + - " and (ties_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_sourceIds\" @> '\"urn:3gpp:dn:/SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=16\"')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_sourceIds\"::text like '%urn:cmHandle:%')\n" + + " and (teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_sourceIds\" @> '\"urn:3gpp:dn:/SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=16\"')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -1122,8 +1126,8 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU\"::text like '%urn:cmHandle:%')\n" + - " and (ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" @> '\"urn:3gpp:dn:/SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=16\"')\n") + " (teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU\"::text like '%urn:cmHandle:%')\n" + + " and (teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" @> '\"urn:3gpp:dn:/SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=16\"')\n") .toString(), actualCondition.toString()); // spotless:on } @@ -1150,9 +1154,9 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_decorators\" ->> 'odu-function-model:location' like '%Stock%'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_decorators\" -> 'odu-function-model:stringdata' = '\"ASD\"'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_decorators\" -> 'odu-function-model:intdata' = '2'\n") + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_decorators\" ->> 'odu-function-model:location' like '%Stock%'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_decorators\" -> 'odu-function-model:stringdata' = '\"ASD\"'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"CD_decorators\" -> 'odu-function-model:intdata' = '2'\n") .toString(), actualCondition.toString()); // spotless:on } @@ -1168,7 +1172,38 @@ class DtoToJooqTest { alb1.setChildren(List.of(slb1)); Condition actualCondition = slb1.getCondition(); // spotless:off - assertEquals(condition("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"metadata\" -> 'reliabilityIndicator' = '\"OK\"'").toString() + assertEquals(condition("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"metadata\" -> 'reliabilityIndicator' = '\"OK\"'").toString() + , actualCondition.toString()); + // spotless:on + } + + @Test + void testConditions_entityMetadata_lastModified() { + ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) + .container(ContainerType.METADATA).leaf("lastModified").queryFunction(QueryFunction.LESS_THAN).parameter( + "2025-01-21T11:12:48.628172460Z").dataType(DataType.TIMESTAMPTZ).build(); + LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); + AndOrLogicalBlock alb1 = new AndLogicalBlock(); + AndOrLogicalBlock alb2 = new AndLogicalBlock(); + alb1.setChildren(List.of(slb1)); + Condition actualCondition = slb1.getCondition(); + // spotless:off + assertEquals(condition("(teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"metadata\" ->> 'lastModified')::timestamptz < timestamp with time zone '2025-01-21 11:12:48.62817246+00:00'").toString() + , actualCondition.toString()); + // spotless:on + } + + @Test + void testConditions_entityMetadata_firstDiscovered() { + ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) + .container(ContainerType.METADATA).leaf("firstDiscovered").queryFunction(QueryFunction.GREATER_THAN) + .parameter("2025-01-21T11:12:48.628172460Z").dataType(DataType.TIMESTAMPTZ).build(); + LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); + AndOrLogicalBlock alb1 = new AndLogicalBlock(); + alb1.setChildren(List.of(slb1)); + Condition actualCondition = slb1.getCondition(); + // spotless:off + assertEquals(condition("(teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"metadata\" ->> 'firstDiscovered')::timestamptz > timestamp with time zone '2025-01-21 11:12:48.62817246+00:00'").toString() , actualCondition.toString()); // spotless:on } @@ -1195,29 +1230,28 @@ class DtoToJooqTest { // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU\" ->> 'odu-function-model:location' like '%Stock%'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" -> 'odu-function-model:stringdata' = '\"ASD\"'\n" + - " and ties_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" -> 'odu-function-model:intdata' = '2'\n") + " teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU\" ->> 'odu-function-model:location' like '%Stock%'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" -> 'odu-function-model:stringdata' = '\"ASD\"'\n" + + " and teiv_data.\"o-ran-smo-teiv-ran_NRSectorCarrier\".\"REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER\" -> 'odu-function-model:intdata' = '2'\n") .toString(), actualCondition.toString()); // spotless:on } @Test void testGetJoinCondition() { - LogicalBlock slb1 = new ScopeLogicalBlock(ScopeObject.builder("ODUFunction").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("provided-nrCellDu")) - .build()); + LogicalBlock slb1 = new ScopeLogicalBlock(ScopeObject.builder("ODUFunction/provided-nrCellDu").topologyObjectType( + TopologyObjectType.ASSOCIATION).innerContainer(List.of()).build()); InnerFilterCriteria innerFilterCriteria1 = InnerFilterCriteria.builder().scope(slb1).build(); - Pair pair1 = new ImmutablePair<>("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"", field( - "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-oduFunction\"" + "=" + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"")); + Pair pair1 = new ImmutablePair<>("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"", field( + "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-oduFunction\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"")); Assertions.assertEquals(new HashSet(Arrays.asList(pair1)), innerFilterCriteria1.builder().scope(slb1).build() .getJoinCondition()); - LogicalBlock slb2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability").topologyObjectType( - TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serving-antennaModule")).build()); + LogicalBlock slb2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability/serving-antennaModule") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()) + .build()); InnerFilterCriteria innerFilterCriteria2 = InnerFilterCriteria.builder().scope(slb2).build(); - Pair pair2 = new ImmutablePair<>("ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", field( - "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"" + "=" + "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\"")); + Pair pair2 = new ImmutablePair<>("teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", field( + "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\"")); Assertions.assertEquals(new HashSet(Arrays.asList(pair2)), innerFilterCriteria2.builder().scope(slb2).build() .getJoinCondition()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteriaTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteriaTest.java similarity index 86% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteriaTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteriaTest.java index 2eaf40b..f05e6a8 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/FilterCriteriaTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/FilterCriteriaTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.field; @@ -36,11 +36,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataValidator; -import org.oran.smo.teiv.exposure.tiespath.refiner.BasePathRefinement; -import org.oran.smo.teiv.exposure.tiespath.resolver.ScopeResolver; -import org.oran.smo.teiv.exposure.tiespath.resolver.TargetResolver; +import org.oran.smo.teiv.exposure.teivpath.refiner.BasePathRefinement; +import org.oran.smo.teiv.exposure.teivpath.resolver.ScopeResolver; +import org.oran.smo.teiv.exposure.teivpath.resolver.TargetResolver; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; @@ -88,7 +88,7 @@ class FilterCriteriaTest { filterCriteria)).build()); Set

result = new HashSet<>(); - result.add(table("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); + result.add(table("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); Assertions.assertEquals(result, filterCriteria.getTables()); @@ -102,7 +102,7 @@ class FilterCriteriaTest { result.clear(); - result.add(table("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); + result.add(table("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); Assertions.assertEquals(result, filterCriteria2.getTables()); @@ -112,7 +112,7 @@ class FilterCriteriaTest { LogicalBlock logicalBlock3 = scopeResolver.resolve("ODUFunction", "/attributes[@gNBIdLength=1 or @gNBId=8]"); filterCriteria3.setScope(logicalBlock3); - Assertions.assertThrows(TiesException.class, filterCriteria3::getTables); + Assertions.assertThrows(TeivException.class, filterCriteria3::getTables); } @@ -123,16 +123,16 @@ class FilterCriteriaTest { targetObjects.get(0).setTopologyObjectType(TopologyObjectType.ENTITY); filterCriteria.setTargets(targetObjects); Map> expected = new HashMap<>(); - expected.put(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + expected.put(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), new HashMap<>()); - expected.get(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) - .put(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBId\"").as( + expected.get(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) + .put(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBId\"").as( "o-ran-smo-teiv-ran:ODUFunction.attr.gNBId"), DataType.BIGINT); - expected.get(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) - .put(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + expected.get(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) + .put(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), DataType.PRIMITIVE); - expected.get(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) - .put(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBIdLength\"").as( + expected.get(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id")) + .put(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBIdLength\"").as( "o-ran-smo-teiv-ran:ODUFunction.attr.gNBIdLength"), DataType.INTEGER); Assertions.assertEquals(expected, filterCriteria.getSelects()); } @@ -147,7 +147,7 @@ class FilterCriteriaTest { filterCriteria)).build()); basePathRefinement.validateScopeParametersDataType(FilterCriteria.builder("RAN").filterCriteriaList(List.of( filterCriteria)).build()); - Assertions.assertEquals(condition(field("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBIdLength\"").eq(1)) + Assertions.assertEquals(condition(field("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBIdLength\"").eq(1)) .toString(), filterCriteria.getCondition().toString()); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObjectTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObjectTest.java similarity index 91% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObjectTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObjectTest.java index a5e87cb..5c195a8 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/PathObjectTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/PathObjectTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlockTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlockTest.java similarity index 71% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlockTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlockTest.java index 6231a38..3b279b4 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/ScopeLogicalBlockTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlockTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; import static org.jooq.impl.DSL.table; import static org.junit.Assert.assertThrows; @@ -33,14 +33,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; class ScopeLogicalBlockTest { - @BeforeAll static void setUp() throws SchemaLoaderException { SchemaLoader mockedSchemaLoader = new MockSchemaLoader(); @@ -49,51 +48,38 @@ class ScopeLogicalBlockTest { @Test void testGetTables() { - Set
resultTables = new HashSet<>(); - - ScopeObject scopeObject = ScopeObject.builder("ODUFunction").container(ContainerType.ASSOCIATION).leaf("id") - .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); - scopeObject.setInnerContainer(Arrays.asList("provided-nrCellDu")); - scopeObject.setTopologyObjectType(TopologyObjectType.ENTITY); - + ScopeObject scopeObject = ScopeObject.builder("ODUFunction/provided-nrCellDu").container(ContainerType.ID).leaf( + "id").queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); + scopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); ScopeObject scopeObject1 = ScopeObject.builder("ODUFunction").container(ContainerType.ATTRIBUTES).leaf( "gNBIdLength").queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.INTEGER).build(); scopeObject1.setTopologyObjectType(TopologyObjectType.ENTITY); - ScopeObject scopeObject2 = ScopeObject.builder("ODUFunction").container(ContainerType.ATTRIBUTES).leaf("gNBId") .queryFunction(QueryFunction.EQ).parameter("8").dataType(DataType.BIGINT).build(); scopeObject2.setTopologyObjectType(TopologyObjectType.ENTITY); - ScopeObject scopeObject3 = ScopeObject.builder("ODUFunction").container(ContainerType.ATTRIBUTES).leaf("gNBId") .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); scopeObject3.setTopologyObjectType(TopologyObjectType.UNDEFINED); - ScopeObject scopeObject4 = ScopeObject.builder("ODUFUNCTION_PROVIDES_NRCELLDU").container(ContainerType.ID) .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.PRIMITIVE).build(); scopeObject4.setTopologyObjectType(TopologyObjectType.RELATION); - - ScopeObject scopeObject5 = ScopeObject.builder("ODUFunction").container(ContainerType.ASSOCIATION).leaf("id") - .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); - scopeObject5.setInnerContainer(Arrays.asList("managed-by-managedElement")); - scopeObject5.setTopologyObjectType(TopologyObjectType.ENTITY); - - ScopeObject scopeObject6 = ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION").container( - ContainerType.ASSOCIATION).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").dataType( - DataType.PRIMITIVE).build(); + ScopeObject scopeObject5 = ScopeObject.builder("ODUFunction/managed-by-managedElement").container(ContainerType.ID) + .leaf("id").queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); + scopeObject5.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + ScopeObject scopeObject6 = ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION").container(ContainerType.ID) + .leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").dataType(DataType.PRIMITIVE).build(); scopeObject6.setInnerContainer(Arrays.asList("managed-by-managedElement")); scopeObject6.setTopologyObjectType(TopologyObjectType.RELATION); - - ScopeObject scopeObject7 = ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION").container( - ContainerType.ASSOCIATION).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").dataType( + ScopeObject scopeObject7 = ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION/provided-by-oduFunction") + .container(ContainerType.ID).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").dataType( DataType.PRIMITIVE).build(); scopeObject7.setInnerContainer(Arrays.asList("provided-by-oduFunction")); - scopeObject7.setTopologyObjectType(TopologyObjectType.RELATION); - - ScopeObject scopeObject8 = ScopeObject.builder("NRCellDU").topologyObjectType(TopologyObjectType.ENTITY).container( - ContainerType.ASSOCIATION).innerContainer(List.of("grouped-by-sector")).leaf("geoColumn").queryFunction( - QueryFunction.EQ).parameter("point(39.4019881 67.9419888)").dataType(DataType.GEOGRAPHIC).build(); - + scopeObject7.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + ScopeObject scopeObject8 = ScopeObject.builder("NRCellDU/grouped-by-sector").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ATTRIBUTES).innerContainer(List.of()).leaf( + "geoColumn").queryFunction(QueryFunction.EQ).parameter("point(39.4019881 67.9419888)").dataType( + DataType.GEOGRAPHIC).build(); ScopeLogicalBlock scopeLogicalBlock = new ScopeLogicalBlock(scopeObject); ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(scopeObject1); ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(scopeObject2); @@ -103,38 +89,28 @@ class ScopeLogicalBlockTest { ScopeLogicalBlock scopeLogicalBlock6 = new ScopeLogicalBlock(scopeObject6); ScopeLogicalBlock scopeLogicalBlock7 = new ScopeLogicalBlock(scopeObject7); ScopeLogicalBlock scopeLogicalBlock8 = new ScopeLogicalBlock(scopeObject8); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock.getTables()); resultTables.clear(); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock1.getTables()); resultTables.clear(); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock2.getTables()); resultTables.clear(); - - assertThrows(TiesException.class, scopeLogicalBlock3::getTables); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); + assertThrows(TeivException.class, scopeLogicalBlock3::getTables); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock4.getTables()); resultTables.clear(); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock5.getTables()); resultTables.clear(); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock6.getTables()); resultTables.clear(); - - resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); + resultTables.add(table("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock8.getTables()); resultTables.clear(); - - Assertions.assertThrows(TiesException.class, () -> scopeLogicalBlock7.getTables()); + Assertions.assertThrows(TeivException.class, () -> scopeLogicalBlock7.getTables()); } - } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/SelectBlockTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/SelectBlockTest.java similarity index 75% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/SelectBlockTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/SelectBlockTest.java index 0bd3046..4273f20 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/innerlanguage/SelectBlockTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/SelectBlockTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,9 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.innerlanguage; +package org.oran.smo.teiv.exposure.teivpath.innerlanguage; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.schema.DataType.*; import static org.jooq.impl.DSL.field; @@ -32,7 +32,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; @@ -51,8 +51,8 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.ID).topologyObjectType( TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE)), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE)), filterCriteria.getSelects()); } @@ -64,11 +64,11 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of("gNBDUId", "dUpLMNId")).container( ContainerType.ATTRIBUTES).topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( - "ties_data.\"ODUFunction\".\"gNBDUId\"").as("o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId"), - CONTAINER, field("ties_data.\"ODUFunction\".\"gNBDUId\"").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), BIGINT)), filterCriteria.getSelects()); + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"gNBDUId\"").as("o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), BIGINT, + field("teiv_data.\"ODUFunction\".\"dUpLMNId\"").as("o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId"), + CONTAINER)), filterCriteria.getSelects()); } @Test @@ -79,15 +79,15 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.ATTRIBUTES) .topologyObjectType(TopologyObjectType.ENTITY).isAllParamQueried(true).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"gNBDUId\"").as("o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), - BIGINT, field("ties_data.\"ODUFunction\".\"gNBDUId\"").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId"), CONTAINER, field( - "ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - PRIMITIVE, field("ties_data.\"ODUFunction\".\"gNBId\"").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBId"), BIGINT, field( - "ties_data.\"ODUFunction\".\"gNBIdLength\"").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBIdLength"), INTEGER)), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"gNBId\"").as("o-ran-smo-teiv-ran:ODUFunction.attr.gNBId"), BIGINT, + field("teiv_data.\"ODUFunction\".\"gNBIdLength\"").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.gNBIdLength"), INTEGER, field( + "teiv_data.\"ODUFunction\".\"dUpLMNId\"").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId"), CONTAINER, field( + "teiv_data.\"ODUFunction\".\"gNBDUId\"").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), BIGINT)), filterCriteria.getSelects()); } @@ -99,9 +99,9 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.DECORATORS) .topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( - "ties_data.\"ODUFunction\".\"CD_decorators\"").as("o-ran-smo-teiv-ran:ODUFunction.decorators"), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"CD_decorators\"").as("o-ran-smo-teiv-ran:ODUFunction.decorators"), CONTAINER)), filterCriteria.getSelects()); } @@ -113,9 +113,9 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.METADATA) .topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( - "ties_data.\"ODUFunction\".\"CD_decorators\"").as("o-ran-smo-teiv-ran:ODUFunction.metadata"), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"CD_decorators\"").as("o-ran-smo-teiv-ran:ODUFunction.metadata"), CONTAINER)), filterCriteria.getSelects()); } @@ -127,9 +127,9 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.CLASSIFIERS) .topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( - "ties_data.\"ODUFunction\".\"CD_classifiers\"").as("o-ran-smo-teiv-ran:ODUFunction.classifiers"), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"CD_classifiers\"").as("o-ran-smo-teiv-ran:ODUFunction.classifiers"), CONTAINER)), filterCriteria.getSelects()); } @@ -141,9 +141,9 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.SOURCE_IDS) .topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), - Map.of(field("ties_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( - "ties_data.\"ODUFunction\".\"CD_sourceIds\"").as("o-ran-smo-teiv-ran:ODUFunction.sourceIds"), + Assertions.assertEquals(Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), + Map.of(field("teiv_data.\"ODUFunction\".\"id\"").as("o-ran-smo-teiv-ran:ODUFunction.id"), PRIMITIVE, field( + "teiv_data.\"ODUFunction\".\"CD_sourceIds\"").as("o-ran-smo-teiv-ran:ODUFunction.sourceIds"), CONTAINER)), filterCriteria.getSelects()); } @@ -155,13 +155,13 @@ public class SelectBlockTest { targets.add(TargetObject.builder("SECTOR_GROUPS_ANTENNAMODULE").params(List.of()).container(ContainerType.ID) .topologyObjectType(TopologyObjectType.RELATION).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( + Assertions.assertEquals(Map.of(field("teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias("o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), Map.of(field( - "ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.aSide")), - PRIMITIVE, field("ties_data.\"AntennaModule\".\"id\"").as(hashAlias( + PRIMITIVE, field("teiv_data.\"AntennaModule\".\"id\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.bSide")), PRIMITIVE)), filterCriteria.getSelects()); } @@ -174,16 +174,16 @@ public class SelectBlockTest { targets.add(TargetObject.builder("SECTOR_GROUPS_ANTENNAMODULE").params(List.of()).container( ContainerType.DECORATORS).topologyObjectType(TopologyObjectType.RELATION).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( + Assertions.assertEquals(Map.of(field("teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias("o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), Map.of(field( - "ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE\"").as( + "teiv_data.\"AntennaModule\".\"REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.decorators")), - CONTAINER, field("ties_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( + CONTAINER, field("teiv_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.aSide")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"id\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"id\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.bSide")), PRIMITIVE)), filterCriteria.getSelects()); } @@ -196,16 +196,16 @@ public class SelectBlockTest { targets.add(TargetObject.builder("SECTOR_GROUPS_ANTENNAMODULE").params(List.of()).container( ContainerType.CLASSIFIERS).topologyObjectType(TopologyObjectType.RELATION).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( + Assertions.assertEquals(Map.of(field("teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias("o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), Map.of(field( - "ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE\"") + "teiv_data.\"AntennaModule\".\"REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE\"") .as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.classifiers")), - CONTAINER, field("ties_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( + CONTAINER, field("teiv_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.aSide")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"id\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"id\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.bSide")), PRIMITIVE)), filterCriteria.getSelects()); } @@ -218,16 +218,16 @@ public class SelectBlockTest { targets.add(TargetObject.builder("SECTOR_GROUPS_ANTENNAMODULE").params(List.of()).container( ContainerType.SOURCE_IDS).topologyObjectType(TopologyObjectType.RELATION).build()); - Assertions.assertEquals(Map.of(field("ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( + Assertions.assertEquals(Map.of(field("teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias("o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), Map.of(field( - "ties_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"REL_ID_SECTOR_GROUPS_ANTENNAMODULE\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.id")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE\"").as( + "teiv_data.\"AntennaModule\".\"REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE\"").as( hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.sourceIds")), - CONTAINER, field("ties_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( + CONTAINER, field("teiv_data.\"AntennaModule\".\"REL_FK_grouped-by-sector\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.aSide")), PRIMITIVE, field( - "ties_data.\"AntennaModule\".\"id\"").as(hashAlias( + "teiv_data.\"AntennaModule\".\"id\"").as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE.bSide")), PRIMITIVE)), filterCriteria.getSelects()); } @@ -240,7 +240,7 @@ public class SelectBlockTest { targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.CLASSIFIERS) .topologyObjectType(TopologyObjectType.UNDEFINED).build()); - Assertions.assertThrowsExactly(TiesException.class, filterCriteria::getSelects); + Assertions.assertThrowsExactly(TeivException.class, filterCriteria::getSelects); } @Test @@ -248,9 +248,9 @@ public class SelectBlockTest { List targets = new ArrayList<>(); InnerFilterCriteria filterCriteria = new InnerFilterCriteria(targets, null); - targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.ASSOCIATION) + targets.add(TargetObject.builder("ODUFunction").params(List.of()).container(ContainerType.RELATION) .topologyObjectType(TopologyObjectType.ENTITY).build()); - Assertions.assertThrowsExactly(TiesException.class, filterCriteria::getSelects); + Assertions.assertThrowsExactly(TeivException.class, filterCriteria::getSelects); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapperTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapperTest.java similarity index 93% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapperTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapperTest.java index d83c1c7..40d5218 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/AliasMapperTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/AliasMapperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinementTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java similarity index 71% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinementTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java index ef8e81f..fd6731d 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/BasePathRefinementTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; -import static org.oran.smo.teiv.utils.TiesConstants.ID_COLUMN_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.ITEM; -import static org.oran.smo.teiv.utils.TiesConstants.WILDCARD; +import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME; +import static org.oran.smo.teiv.utils.TeivConstants.ITEM; +import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD; import static org.mockito.Mockito.mock; import java.util.ArrayList; @@ -32,8 +32,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.EmptyLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.InnerFilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.EmptyLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.InnerFilterCriteria; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -41,29 +41,28 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataValidator; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndOrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.LogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeObject; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TopologyObjectType; -import org.oran.smo.teiv.exposure.tiespath.resolver.ResolverDataType; -import org.oran.smo.teiv.exposure.tiespath.resolver.ScopeResolver; -import org.oran.smo.teiv.exposure.tiespath.resolver.TargetResolver; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndOrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.LogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType; +import org.oran.smo.teiv.exposure.teivpath.resolver.ResolverDataType; +import org.oran.smo.teiv.exposure.teivpath.resolver.ScopeResolver; +import org.oran.smo.teiv.exposure.teivpath.resolver.TargetResolver; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; class BasePathRefinementTest { - private static final ConsumerDataValidator consumerDataValidator = mock(ConsumerDataValidator.class); private static BasePathRefinement basePathRefinement; private final TargetResolver targetResolver = new TargetResolver(); @@ -85,15 +84,12 @@ class BasePathRefinementTest { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria .builder().targets(targets).scope(logicalBlock).build())).resolvingTopologyObjectType( FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); - basePathRefinement.refine(filterCriteria); - LogicalBlock expectedLogicalBlock = scopeResolver.process(null, "/attributes[@gNBCUName='someCUCPName']"); List expectedTargets = targetResolver.resolve(null, "/OCUCPFunction/attributes"); FilterCriteria expectedFilterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria .builder().targets(expectedTargets).scope(expectedLogicalBlock).build())).resolvingTopologyObjectType( FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); - ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); expectedScopeObject.setTopologyObject("OCUCPFunction"); expectedScopeObject.setTopologyObjectType(TopologyObjectType.ENTITY); @@ -102,10 +98,8 @@ class BasePathRefinementTest { expectedScopeObject.setQueryFunction(QueryFunction.EQ); expectedScopeObject.setParameter("someCUCPName"); expectedScopeObject.setDataType(DataType.PRIMITIVE); - expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY); expectedTargets.get(0).setAllParamQueried(true); - Assertions.assertEquals(expectedFilterCriteria, filterCriteria); } @@ -116,15 +110,12 @@ class BasePathRefinementTest { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria .builder().targets(targets).scope(logicalBlock).build())).resolvingTopologyObjectType( FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); - basePathRefinement.refine(filterCriteria); - LogicalBlock expectedLogicalBlock = scopeResolver.process(null, "/metadata[@reliabilityIndicator='OK']"); List expectedTargets = targetResolver.resolve(null, "/OCUCPFunction/sourceIds"); FilterCriteria expectedFilterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria .builder().targets(expectedTargets).scope(expectedLogicalBlock).build())).resolvingTopologyObjectType( FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); - ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); expectedScopeObject.setTopologyObject("OCUCPFunction"); expectedScopeObject.setTopologyObjectType(TopologyObjectType.ENTITY); @@ -133,10 +124,8 @@ class BasePathRefinementTest { expectedScopeObject.setQueryFunction(QueryFunction.EQ); expectedScopeObject.setParameter("OK"); expectedScopeObject.setDataType(DataType.PRIMITIVE); - expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY); expectedTargets.get(0).setAllParamQueried(false); - Assertions.assertEquals(expectedFilterCriteria, filterCriteria); } @@ -145,93 +134,58 @@ class BasePathRefinementTest { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").build(); LogicalBlock logicalBlock1 = scopeResolver.process(null, "/managed-by-managedElement[@id='me1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock1).build())); - basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); - - ScopeObject scopeObjectResult1 = ScopeObject.builder(WILDCARD).container(ContainerType.ASSOCIATION).innerContainer( - List.of("managed-by-managedElement")).resolverDataType(ResolverDataType.STRING).queryFunction( - QueryFunction.EQ).leaf(ID_COLUMN_NAME).parameter("me1").build(); + ScopeObject scopeObjectResult1 = ScopeObject.builder(WILDCARD + "/managed-by-managedElement").container( + ContainerType.ID).innerContainer(List.of()).resolverDataType(ResolverDataType.STRING).queryFunction( + QueryFunction.EQ).leaf(null).parameter("me1").build(); Assertions.assertEquals(scopeObjectResult1, ((ScopeLogicalBlock) logicalBlock1).getScopeObject()); - LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/managed-by-managedElement"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build())); - + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) logicalBlock2, "RAN"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); - - ScopeObject scopeObjectResult2 = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ASSOCIATION) - .innerContainer(List.of("managed-by-managedElement")).resolverDataType(ResolverDataType.NOT_NULL) - .queryFunction(QueryFunction.NOT_NULL).build(); + ScopeObject scopeObjectResult2 = ScopeObject.builder(ODU_FUNCTION + "/managed-by-managedElement") + .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).resolverDataType( + ResolverDataType.NOT_NULL).queryFunction(QueryFunction.NOT_NULL).build(); Assertions.assertEquals(scopeObjectResult2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); - LogicalBlock logicalBlock3 = scopeResolver.process(null, "/ODUFUNCTION_PROVIDES_NRCELLDU"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock3).build())); - - basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); - - ScopeObject scopeObjectResult3 = ScopeObject.builder(WILDCARD).container(ContainerType.RELATION).innerContainer(List - .of("ODUFUNCTION_PROVIDES_NRCELLDU")).resolverDataType(ResolverDataType.NOT_NULL).queryFunction( - QueryFunction.NOT_NULL).build(); - Assertions.assertEquals(scopeObjectResult3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject()); - - LogicalBlock logicalBlock4 = scopeResolver.process(null, "/ODUFunction[@id='gnbdu1']"); + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement + .processTopologyObjectsWithContainerTypeNull(filterCriteria)); + LogicalBlock logicalBlock4 = scopeResolver.process(null, "/ODUFunction[@id='odu1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock4).build())); - basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); - - ScopeObject scopeObjectResult4 = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ID).resolverDataType( - ResolverDataType.STRING).queryFunction(QueryFunction.EQ).parameter("gnbdu1").build(); + ScopeObject scopeObjectResult4 = ScopeObject.builder(WILDCARD + "/" + ODU_FUNCTION).container(ContainerType.ID) + .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.EQ).parameter("odu1").build(); Assertions.assertEquals(scopeObjectResult4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); - - LogicalBlock logicalBlock5 = scopeResolver.process("NRCellDU", "/ODUFunction[@id='ODU_1']"); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock5).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement - .processTopologyObjectsWithContainerTypeNull(filterCriteria)); - - ScopeObject scopeObject = ScopeObject.builder(WILDCARD).container(null).build(); - LogicalBlock logicalBlock6 = new ScopeLogicalBlock(scopeObject); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock6).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement - .processTopologyObjectsWithContainerTypeNull(filterCriteria)); - try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList( "RelationAndEntity")); utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "RelationAndEntity")); - LogicalBlock logicalBlock7 = scopeResolver.process(null, "/RelationAndEntity[@id='relAndEnt1']"); + LogicalBlock logicalBlock7 = scopeResolver.process(null, "/RelationAndEntity[@leaf='relAndEnt1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock7).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement .processTopologyObjectsWithContainerTypeNull(filterCriteria)); utilities.when(() -> SchemaRegistry.getAssociationNamesByEntityName(ODU_FUNCTION)).thenReturn(Arrays.asList( "RelationAndAssociation")); utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "RelationAndAssociation")); - LogicalBlock logicalBlock8 = scopeResolver.process(null, "/RelationAndAssociation[@id='relAndAssoc1']"); + LogicalBlock logicalBlock8 = scopeResolver.process(null, "/RelationAndAssociation[@leaf='relAndAssoc1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock8).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement .processTopologyObjectsWithContainerTypeNull(filterCriteria)); } - LogicalBlock logicalBlock9 = scopeResolver.process(null, "/NRCellDU/attributes[@nCI=12]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock9).build())); - basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria); - - ScopeObject scopeObjectResult9 = ScopeObject.builder("NRCellDU").container(ContainerType.ATTRIBUTES) + ScopeObject scopeObjectResult9 = ScopeObject.builder("*/NRCellDU").container(ContainerType.ATTRIBUTES) .resolverDataType(ResolverDataType.INTEGER).queryFunction(QueryFunction.EQ).leaf("nCI").parameter("12") .build(); Assertions.assertEquals(scopeObjectResult9, ((ScopeLogicalBlock) logicalBlock9).getScopeObject()); - LogicalBlock logicalBlock10 = scopeResolver.process(null, "/NRCellDU[@nCI=12]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock10).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement .processTopologyObjectsWithContainerTypeNull(filterCriteria)); - } @Test @@ -239,8 +193,7 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().targets(targetResolver.resolve(null, "/ODUFunction/attributes(gNBDUId); /ODUFunction/attributes(gNBId); /attributes(name)")).scope( EmptyLogicalBlock.getInstance()).build(); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY)); } @@ -253,19 +206,15 @@ class BasePathRefinementTest { filterCriteria.setTargets(targetResolver.resolve(null, "/ODUFunction/attributes(dUpLMNId); /ODUFunction/attributes(gNBId)")); filterCriteria.setScope(scopeResolver.resolve(null, "/ODUFunction/attributes[@gNBIdLength=2]")); - ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).leaf("gNBIdLength") .queryFunction(QueryFunction.EQ).parameter("2").resolverDataType(ResolverDataType.INTEGER).build(); LogicalBlock scopeResult1 = new ScopeLogicalBlock(scopeObject1); - TargetObject targetObjectResult = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).params( new ArrayList<>(Arrays.asList("dUpLMNId", "gNBId"))).build(); List resultTargetObjects = new ArrayList<>(); resultTargetObjects.add(targetObjectResult); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects, filterCriteria.getTargets()); Assertions.assertEquals(scopeResult1, filterCriteria.getScope()); } @@ -278,15 +227,13 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes;/attributes(cellLocalId,nCI)")); filterCriteria.setScope(scopeResolver.resolve(null, "/NRCellDU/attributes[@nCI=12]")); - TargetObject targetObjectResult3_1 = TargetObject.builder("NRCellDU").container(ContainerType.ATTRIBUTES).params( new ArrayList<>(Arrays.asList("nCI", "cellLocalId"))).isAllParamQueried(true).build(); List resultTargetObjects3_1 = new ArrayList<>(); resultTargetObjects3_1.add(targetObjectResult3_1); - + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria.getScope(), "RAN"); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects3_1, filterCriteria.getTargets()); } @@ -298,7 +245,6 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes;/attributes(cellLocalId)")); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@nCI=12]")); - TargetObject targetObjectResult4_1 = TargetObject.builder("NRCellDU").container(ContainerType.ATTRIBUTES).params( List.of("cellLocalId")).isAllParamQueried(true).build(); TargetObject targetObjectResult4_2 = TargetObject.builder("NRCellCU").container(ContainerType.ATTRIBUTES).params( @@ -306,10 +252,8 @@ class BasePathRefinementTest { List resultTargetObjects4_1 = new ArrayList<>(); resultTargetObjects4_1.add(targetObjectResult4_1); resultTargetObjects4_1.add(targetObjectResult4_2); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects4_1, filterCriteria.getTargets()); } @@ -321,7 +265,6 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, null)); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@gNBId = 6 and @gNBIdLength = 1]")); - ScopeLogicalBlock OCUUPFunctionPgNBId = new ScopeLogicalBlock(ScopeObject.builder("OCUUPFunction").container( ContainerType.ATTRIBUTES).leaf("gNBId").queryFunction(QueryFunction.EQ).parameter("6").resolverDataType( ResolverDataType.INTEGER).build()); @@ -340,26 +283,21 @@ class BasePathRefinementTest { ScopeLogicalBlock OCUCPFunctionPgNBIdLength = new ScopeLogicalBlock(ScopeObject.builder("OCUCPFunction").container( ContainerType.ATTRIBUTES).leaf("gNBIdLength").queryFunction(QueryFunction.EQ).parameter("1") .resolverDataType(ResolverDataType.INTEGER).build()); - AndLogicalBlock OCUUPFunction = new AndLogicalBlock(); AndLogicalBlock ODUFunction = new AndLogicalBlock(); AndLogicalBlock OCUCPFunction = new AndLogicalBlock(); - OCUCPFunction.getChildren().add(OCUCPFunctionPgNBId); OCUCPFunction.getChildren().add(OCUCPFunctionPgNBIdLength); OCUUPFunction.getChildren().add(OCUUPFunctionPgNBId); OCUUPFunction.getChildren().add(OCUUPFunctionPgNBIdLength); ODUFunction.getChildren().add(ODUFunctionPgNBId); ODUFunction.getChildren().add(ODUFunctionPgNBIdLength); - OrLogicalBlock or1 = new OrLogicalBlock(); OrLogicalBlock or2 = new OrLogicalBlock(); - or1.getChildren().add(or2); or1.getChildren().add(ODUFunction); or2.getChildren().add(OCUCPFunction); or2.getChildren().add(OCUUPFunction); - TargetObject targetObjectResult5_1 = TargetObject.builder("OCUUPFunction").container(ContainerType.ID).build(); TargetObject targetObjectResult5_2 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ID).build(); TargetObject targetObjectResult5_3 = TargetObject.builder("OCUCPFunction").container(ContainerType.ID).build(); @@ -367,7 +305,6 @@ class BasePathRefinementTest { resultTargetObjects5_1.add(targetObjectResult5_3); resultTargetObjects5_1.add(targetObjectResult5_1); resultTargetObjects5_1.add(targetObjectResult5_2); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); Assertions.assertEquals(resultTargetObjects5_1, filterCriteria.getTargets()); @@ -382,19 +319,15 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/NRCellDU")); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@cellLocalId = 156]")); - TargetObject targetObjectResult6_1 = TargetObject.builder("NRCellDU").container(ContainerType.ID).build(); List resultTargetObjects6_1 = new ArrayList<>(); resultTargetObjects6_1.add(targetObjectResult6_1); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - ScopeObject scopeObjectResult6_1 = ScopeObject.builder("NRCellDU").container(ContainerType.ATTRIBUTES).leaf( "cellLocalId").queryFunction(QueryFunction.EQ).parameter("156").resolverDataType(ResolverDataType.INTEGER) .build(); LogicalBlock logicalBlockResult6_1 = new ScopeLogicalBlock(scopeObjectResult6_1); - Assertions.assertEquals(resultTargetObjects6_1, filterCriteria.getTargets()); Assertions.assertEquals(logicalBlockResult6_1, filterCriteria.getScope()); } @@ -408,8 +341,7 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes(gNBId);/attributes(nCI)")); filterCriteria.setScope(scopeResolver.resolve(null, null)); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY)); } @@ -422,8 +354,7 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes(nCI)")); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@gNBId = 6]")); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY)); } @@ -435,7 +366,6 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes")); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@cellLocalId = 178]; /attributes[@nCI = 12]")); - ScopeLogicalBlock NRCellDUCellLocalId = new ScopeLogicalBlock(ScopeObject.builder("NRCellDU").container( ContainerType.ATTRIBUTES).leaf("cellLocalId").queryFunction(QueryFunction.EQ).parameter("178") .resolverDataType(ResolverDataType.INTEGER).build()); @@ -448,31 +378,24 @@ class BasePathRefinementTest { ScopeLogicalBlock NRCellCUnCI = new ScopeLogicalBlock(ScopeObject.builder("NRCellCU").container( ContainerType.ATTRIBUTES).leaf("nCI").queryFunction(QueryFunction.EQ).parameter("12").resolverDataType( ResolverDataType.INTEGER).build()); - AndLogicalBlock NRCellDU = new AndLogicalBlock(); NRCellDU.getChildren().add(NRCellDUnCI); NRCellDU.getChildren().add(NRCellDUCellLocalId); - AndLogicalBlock NRCellCU = new AndLogicalBlock(); NRCellCU.getChildren().add(NRCellCUnCI); NRCellCU.getChildren().add(NRCellCUCellLocalId); - OrLogicalBlock or = new OrLogicalBlock(); or.getChildren().add(NRCellCU); or.getChildren().add(NRCellDU); - TargetObject targetObjectResult9_1 = TargetObject.builder("NRCellDU").container(ContainerType.ATTRIBUTES) .isAllParamQueried(true).isAllParamQueried(true).build(); TargetObject targetObjectResult9_2 = TargetObject.builder("NRCellCU").container(ContainerType.ATTRIBUTES) .isAllParamQueried(true).isAllParamQueried(true).build(); - List resultTargetObjects9_1 = new ArrayList<>(); resultTargetObjects9_1.add(targetObjectResult9_1); resultTargetObjects9_1.add(targetObjectResult9_2); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); Assertions.assertEquals(or, filterCriteria.getScope()); } @@ -486,8 +409,7 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes")); filterCriteria.setScope(scopeResolver.resolve(null, "/attributes[@nCI = 12]; /attributes[@gNBId = 6]")); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY)); } @@ -499,7 +421,6 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/attributes; /id")); filterCriteria.setScope(scopeResolver.resolve(null, "/id[@id = \"testId\"]; /attributes[@gNBId = 6]")); - ScopeLogicalBlock OCUUPFunctionPgNBId = new ScopeLogicalBlock(ScopeObject.builder("OCUUPFunction").container( ContainerType.ATTRIBUTES).leaf("gNBId").queryFunction(QueryFunction.EQ).parameter("6").resolverDataType( ResolverDataType.INTEGER).build()); @@ -518,47 +439,39 @@ class BasePathRefinementTest { ScopeLogicalBlock OCUCPFunctionPid = new ScopeLogicalBlock(ScopeObject.builder("OCUCPFunction").container( ContainerType.ID).queryFunction(QueryFunction.EQ).parameter("testId").resolverDataType( ResolverDataType.STRING).build()); - AndLogicalBlock OCUUPFunction = new AndLogicalBlock(); OCUUPFunction.getChildren().add(OCUUPFunctionPgNBId); OCUUPFunction.getChildren().add(OCUUPFunctionPid); - AndLogicalBlock ODUFunction = new AndLogicalBlock(); ODUFunction.getChildren().add(ODUFunctionPgNBId); ODUFunction.getChildren().add(ODUFunctionPid); - AndLogicalBlock OCUCPFunction = new AndLogicalBlock(); OCUCPFunction.getChildren().add(OCUCPFunctionPgNBId); OCUCPFunction.getChildren().add(OCUCPFunctionPid); - OrLogicalBlock or1 = new OrLogicalBlock(); OrLogicalBlock or2 = new OrLogicalBlock(); - or1.getChildren().add(or2); or1.getChildren().add(ODUFunction); or2.getChildren().add(OCUCPFunction); or2.getChildren().add(OCUUPFunction); - TargetObject targetObjectResult11_1 = TargetObject.builder("OCUUPFunction").container(ContainerType.ID).build(); TargetObject targetObjectResult11_2 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ID).build(); - TargetObject targetObjectResult11_3 = TargetObject.builder("OCUCPFunction").container(ContainerType.ATTRIBUTES) - .isAllParamQueried(true).build(); + TargetObject targetObjectResult11_3 = TargetObject.builder("OCUCPFunction").container(ContainerType.ID).build(); TargetObject targetObjectResult11_4 = TargetObject.builder("OCUUPFunction").container(ContainerType.ATTRIBUTES) .isAllParamQueried(true).build(); TargetObject targetObjectResult11_5 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES) .isAllParamQueried(true).build(); - TargetObject targetObjectResult11_6 = TargetObject.builder("OCUCPFunction").container(ContainerType.ID).build(); + TargetObject targetObjectResult11_6 = TargetObject.builder("OCUCPFunction").container(ContainerType.ATTRIBUTES) + .isAllParamQueried(true).build(); List resultTargetObjects11_1 = new ArrayList<>(); - resultTargetObjects11_1.add(targetObjectResult11_3); + resultTargetObjects11_1.add(targetObjectResult11_6); resultTargetObjects11_1.add(targetObjectResult11_4); resultTargetObjects11_1.add(targetObjectResult11_5); - resultTargetObjects11_1.add(targetObjectResult11_6); + resultTargetObjects11_1.add(targetObjectResult11_3); resultTargetObjects11_1.add(targetObjectResult11_1); resultTargetObjects11_1.add(targetObjectResult11_2); - basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects11_1, filterCriteria.getTargets()); Assertions.assertEquals(or1, filterCriteria.getScope()); } @@ -571,10 +484,10 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria2 = InnerFilterCriteria.builder().build(); filterCriteria2.setTargets(targetResolver.resolve(null, "/attributes")); filterCriteria2.setScope(scopeResolver.resolve(null, "/managed-by-managedElement[@id = \"me1\"]")); - + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria2.getScope(), "OAM"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("OAM").filterCriteriaList(List .of(filterCriteria2)).build()); - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveWildCardObjectsInScopeAndTarget( filterCriteria2, "OAM", FilterCriteria.ResolvingTopologyObjectType.ENTITY)); } @@ -586,7 +499,6 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria2 = InnerFilterCriteria.builder().build(); filterCriteria2.setTargets(targetResolver.resolve(null, "/attributes")); filterCriteria2.setScope(scopeResolver.resolve(null, "/managed-by-managedElement[@id = \"me1\"]")); - TargetObject targetObjectResult13_1 = TargetObject.builder("OCUUPFunction").container(ContainerType.ATTRIBUTES) .isAllParamQueried(true).build(); TargetObject targetObjectResult13_2 = TargetObject.builder("ORUFunction").container(ContainerType.ATTRIBUTES) @@ -604,21 +516,27 @@ class BasePathRefinementTest { resultTargetObjectsResult13_1.add(targetObjectResult13_1); resultTargetObjectsResult13_1.add(targetObjectResult13_4); - ScopeLogicalBlock NearRTRICFunction = new ScopeLogicalBlock(ScopeObject.builder("NearRTRICFunction").container( - ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id").queryFunction( - QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock ORUFunction = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction").container( - ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id").queryFunction( - QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder("OCUUPFunction").container( - ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id").queryFunction( - QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock ODUFunction = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).container( - ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id").queryFunction( - QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder("OCUCPFunction").container( - ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id").queryFunction( - QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); + ScopeLogicalBlock NearRTRICFunction = new ScopeLogicalBlock(ScopeObject.builder( + "NearRTRICFunction/managed-by-managedElement").container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ASSOCIATION).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.EQ) + .parameter("me1").resolverDataType(ResolverDataType.STRING).build()); + + ScopeLogicalBlock ORUFunction = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction/managed-by-managedElement") + .container(ContainerType.ID).topologyObjectType(TopologyObjectType.ASSOCIATION).innerContainer(List.of()) + .leaf(null).queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING) + .build()); + ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "OCUUPFunction/managed-by-managedElement").container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ASSOCIATION).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.EQ) + .parameter("me1").resolverDataType(ResolverDataType.STRING).build()); + ScopeLogicalBlock ODUFunction = new ScopeLogicalBlock(ScopeObject.builder("ODUFunction/managed-by-managedElement") + .container(ContainerType.ID).topologyObjectType(TopologyObjectType.ASSOCIATION).innerContainer(List.of()) + .leaf(null).queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING) + .build()); + ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "OCUCPFunction/managed-by-managedElement").container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ASSOCIATION).innerContainer(List.of()).leaf(null).queryFunction(QueryFunction.EQ) + .parameter("me1").resolverDataType(ResolverDataType.STRING).build()); AndOrLogicalBlock or1 = new OrLogicalBlock(); AndOrLogicalBlock or2 = new OrLogicalBlock(); @@ -633,7 +551,7 @@ class BasePathRefinementTest { or2.getChildren().add(ODUFunction); or1.getChildren().add(or2); or1.getChildren().add(ORUFunction); - + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria2.getScope(), "RAN"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("RAN").filterCriteriaList(List .of(filterCriteria2)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN", @@ -648,17 +566,15 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, null)); filterCriteria.setScope(scopeResolver.resolve(null, "/ODUFunction[@id = \"testId\"]")); - TargetObject targetObjectResult9_1 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ID) .isAllParamQueried(false).build(); - List resultTargetObjects9_1 = new ArrayList<>(); resultTargetObjects9_1.add(targetObjectResult9_1); + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria.getScope(), "RAN"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("RAN").filterCriteriaList(List .of(filterCriteria)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.ENTITY); - Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets()); } @@ -667,15 +583,12 @@ class BasePathRefinementTest { InnerFilterCriteria filterCriteria = InnerFilterCriteria.builder().build(); filterCriteria.setTargets(targetResolver.resolve(null, "/ODUFUNCTION_PROVIDES_NRCELLDU")); filterCriteria.setScope(scopeResolver.resolve(null, "/id[text() = \"testId\"]")); - ScopeObject scopeObject = ScopeObject.builder("ODUFUNCTION_PROVIDES_NRCELLDU").container(ContainerType.ID) .parameter("testId").queryFunction(QueryFunction.EQ).resolverDataType(ResolverDataType.STRING).build(); - basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("RAN").filterCriteriaList(List .of(filterCriteria)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN", FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP); - Assertions.assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope()); } @@ -697,11 +610,13 @@ class BasePathRefinementTest { resultTargetObjectsResult13_1.add(targetObjectResult13_2); resultTargetObjectsResult13_1.add(targetObjectResult13_1); - ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_OCUUPFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); AndOrLogicalBlock or1 = new OrLogicalBlock(); @@ -709,6 +624,7 @@ class BasePathRefinementTest { or1.getChildren().add(OCUUPFunction); or1.getChildren().add(OCUCPFunction); + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria2.getScope(), "RAN"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("RAN").filterCriteriaList(List .of(filterCriteria2)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN", @@ -744,21 +660,25 @@ class BasePathRefinementTest { resultTargetObjectsResult13_1.add(targetObjectResult13_1); resultTargetObjectsResult13_1.add(targetObjectResult13_2); - ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_OCUUPFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + ScopeLogicalBlock OCUUPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); ScopeLogicalBlock NearRTRICFunction = new ScopeLogicalBlock(ScopeObject.builder( - "MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION").container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1") - .resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock ODUFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ODUFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + "MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) + .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); + ScopeLogicalBlock ODUFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ODUFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + ScopeLogicalBlock OCUCPFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); - ScopeLogicalBlock ORUFunction = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ORUFUNCTION") - .container(ContainerType.ASSOCIATION).innerContainer(List.of("managed-by-managedElement")).leaf("id") + ScopeLogicalBlock ORUFunction = new ScopeLogicalBlock(ScopeObject.builder( + "MANAGEDELEMENT_MANAGES_ORUFUNCTION/managed-by-managedElement").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of()).leaf(null) .queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType(ResolverDataType.STRING).build()); AndOrLogicalBlock or1 = new OrLogicalBlock(); @@ -775,6 +695,7 @@ class BasePathRefinementTest { or1.getChildren().add(or2); or1.getChildren().add(ORUFunction); + basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria2.getScope(), "REL_OAM_RAN"); basePathRefinement.processTopologyObjectsWithContainerTypeNull(FilterCriteria.builder("REL_OAM_RAN") .filterCriteriaList(List.of(filterCriteria2)).build()); basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "REL_OAM_RAN", @@ -793,25 +714,19 @@ class BasePathRefinementTest { LogicalBlock scope = new ScopeLogicalBlock(scopeObject); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject))).scope(scope).build())); - try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList(ODU_FUNCTION, "NRCellDU")); utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "ODUFUNCTION_PROVIDES_NRCELLDU")); - basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets() .get(0).getTopologyObjectType()); Assertions.assertEquals(TopologyObjectType.ENTITY, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList() .get(0).getScope()).getScopeObject().getTopologyObjectType()); - filterCriteria.getFilterCriteriaList().get(0).setScope(EmptyLogicalBlock.getInstance()); targetObject.setTopologyObjectType(TopologyObjectType.UNDEFINED); - basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets() .get(0).getTopologyObjectType()); } @@ -826,15 +741,12 @@ class BasePathRefinementTest { LogicalBlock scope = new ScopeLogicalBlock(scopeObject); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject))).scope(scope).build())); - try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList(ODU_FUNCTION, "NRCellDU")); utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "ODUFUNCTION_PROVIDES_NRCELLDU")); - basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria); - Assertions.assertEquals(TopologyObjectType.RELATION, filterCriteria.getFilterCriteriaList().get(0).getTargets() .get(0).getTopologyObjectType()); Assertions.assertEquals(TopologyObjectType.RELATION, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList() @@ -851,33 +763,26 @@ class BasePathRefinementTest { LogicalBlock scope = new ScopeLogicalBlock(scopeObject); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject))).scope(scope).build())); - try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList(ODU_FUNCTION, "NRCellDU", "EntityAndRelation")); utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList( "ODUFUNCTION_PROVIDES_NRCELLDU", "EntityAndRelation")); // Error thrown because of invalid topology object in targetFilter - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( filterCriteria)); - targetObject.setTopologyObject(ODU_FUNCTION); - // Error thrown because of invalid topology object in scopeFilter - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( filterCriteria)); - scopeObject.setTopologyObject("EntityAndRelation"); - // Error thrown because of topology object type is ambiguous - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( filterCriteria)); - targetObject.setTopologyObjectType(TopologyObjectType.UNDEFINED); targetObject.setTopologyObject("EntityAndRelation"); - // Error thrown because of topology object type is ambiguous - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.resolveUndefinedTopologyObjectTypes( filterCriteria)); } } @@ -885,79 +790,59 @@ class BasePathRefinementTest { @Test void testValidateContainers() { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").build(); - TargetObject targetObject0 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ID).params(new ArrayList<>( Arrays.asList("gNBId"))).build(); targetObject0.setTopologyObjectType(TopologyObjectType.ENTITY); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject0))).build())); - // Reason: container:ID, params is not empty - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); TargetObject targetObject1 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).params( new ArrayList<>(Arrays.asList("gNBId", "gNBIdLength", "notValidAttribute1", "notValidAttribute2"))).build(); targetObject1.setTopologyObjectType(TopologyObjectType.ENTITY); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(List.of(targetObject1)) .build())); - ScopeObject scopeObject = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).leaf("gNBId") .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); - scopeObject.setTopologyObjectType(TopologyObjectType.ENTITY); LogicalBlock scopeLogicalBlock = new ScopeLogicalBlock(scopeObject); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1))).scope(scopeLogicalBlock).build())); - // Reason: invalid attributes in ENTITY type targetObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); TargetObject targetObject2 = TargetObject.builder("ODUFUNCTION_PROVIDES_NRCELLDU").container( ContainerType.ATTRIBUTES).topologyObjectType(TopologyObjectType.RELATION).params(new ArrayList<>(Arrays .asList("notValidAttribute1", "notValidAttribute2"))).build(); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject2))).scope(scopeLogicalBlock).build())); - // Reason: invalid attributes in RELATION type targetObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); scopeObject.setLeaf("notValidAttribute"); - TargetObject targetObject3 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES) .topologyObjectType(TopologyObjectType.ENTITY).params(new ArrayList<>(Arrays.asList("gNBId", "gNBIdLength"))).build(); targetObject3.setTopologyObjectType(TopologyObjectType.ENTITY); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject3))).scope(scopeLogicalBlock).build())); - // Reason: invalid attributes in ENTITY type scopeObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); scopeObject.setLeaf("gNBId"); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); - TargetObject targetObject4 = TargetObject.builder(ODU_FUNCTION).container(ContainerType.SOURCE_IDS) .topologyObjectType(TopologyObjectType.ENTITY).params(new ArrayList<>(Arrays.asList("gNBId"))).build(); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject4))).scope(scopeLogicalBlock).build())); - // Reason: invalid source id param for ENTITY type targetObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); targetObject4.setParams(Collections.emptyList()); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); - TargetObject targetObject5 = TargetObject.builder("ODUFUNCTION_PROVIDES_NRCELLDU").container( ContainerType.SOURCE_IDS).topologyObjectType(TopologyObjectType.RELATION).params(new ArrayList<>(Arrays .asList("InvalidSourceIdParam"))).build(); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject5))).scope(scopeLogicalBlock).build())); - // Reason: invalid source id param for RELATION type targetObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); targetObject5.setParams(new ArrayList<>(Arrays.asList(ITEM))); Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); } @@ -965,52 +850,38 @@ class BasePathRefinementTest { @Test void testValidateContainers_Associations() { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").build(); - ScopeObject scopeObject = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ASSOCIATION).leaf("nCI") - .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); - scopeObject.setInnerContainer(Arrays.asList("provided-nrCellDu")); - scopeObject.setTopologyObjectType(TopologyObjectType.ENTITY); + ScopeObject scopeObject = ScopeObject.builder(ODU_FUNCTION + "/provided-nrCellDu").topologyObjectType( + TopologyObjectType.ASSOCIATION).container(ContainerType.ATTRIBUTES).leaf("nCI").queryFunction( + QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); + // scopeObject.setInnerContainer(Arrays.asList("provided-nrCellDu")); + scopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); LogicalBlock scopeLogicalBlock = new ScopeLogicalBlock(scopeObject); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(List.of()).scope( scopeLogicalBlock).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); - scopeObject.setLeaf(null); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); - scopeObject.setLeaf("invalid"); - // Reason: invalid leaf for scopeObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); scopeObject.setLeaf("nCI"); scopeObject.setInnerContainer(Arrays.asList("invalid-association")); - // Reason: invalid association added in innerContainer list for ENTITY type scopeObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); + scopeObject.setInnerContainer(Arrays.asList("invalid-innerContainer")); + // Reason: in case of association there are no innerContainer elements + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); + scopeObject.setTopologyObject("ODUFUNCTION_PROVIDES_NRCELLDU/provided-nrCellDu"); + scopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); scopeObject.setInnerContainer(Collections.emptyList()); - - // Reason: no association name added in innerContainer list for scopeObject in case of association containerType - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - - scopeObject.setTopologyObject("ODUFUNCTION_PROVIDES_NRCELLDU"); - scopeObject.setTopologyObjectType(TopologyObjectType.RELATION); - scopeObject.setInnerContainer(Arrays.asList("provided-nrCellDu")); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateContainers(filterCriteria)); - scopeObject.setTopologyObjectType(TopologyObjectType.UNDEFINED); - // Reason: cannot validate container for UNDEFINED type topologyObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); - - scopeObject.setTopologyObjectType(TopologyObjectType.RELATION); + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); + scopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); scopeObject.setInnerContainer(Arrays.asList("invalid-association")); - // Reason: invalid association added in innerContainer list for RELATION type scopeObject - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateContainers(filterCriteria)); } @Test @@ -1019,130 +890,100 @@ class BasePathRefinementTest { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").build(); LogicalBlock logicalBlock1 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId=21]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock1).build())); - basePathRefinement.validateScopeParametersDataType(filterCriteria); Assertions.assertEquals(DataType.BIGINT, ((ScopeLogicalBlock) logicalBlock1).getScopeObject().getDataType()); - // error reason: for gNBId attribute string value is not accepted LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId='abc']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // error reason: id value should be entered as string (' ') LogicalBlock logicalBlock3 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id=1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock3).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // scopeFilter: /managed-by-managedElement[@id='me1'] -> dataType is set to PRIMITIVE ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).innerContainer( - new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ASSOCIATION) - .topologyObjectType(TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf(ID_COLUMN_NAME) - .parameter("me1").resolverDataType(ResolverDataType.STRING).build()); + new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf(ID_COLUMN_NAME).parameter("me1") + .resolverDataType(ResolverDataType.STRING).build()); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(scopeLogicalBlock1).build())); - basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); - // error reason: scopeFilter: /managed-by-managedElement[@id=1] -> ResolverDataType is INTEGER, but in case of id it should be STRING ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).innerContainer( - new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ASSOCIATION) - .topologyObjectType(TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf(ID_COLUMN_NAME) - .parameter("1").resolverDataType(ResolverDataType.INTEGER).build()); + new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf(ID_COLUMN_NAME).parameter("1") + .resolverDataType(ResolverDataType.INTEGER).build()); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(scopeLogicalBlock2).build())); - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); // error reason: scopeFilter: /provided-nrCellDu[@cellLocalId=1] -> only id can be queried for associations ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).innerContainer( - new ArrayList<>(Arrays.asList("provided-nrCellDu"))).container(ContainerType.ASSOCIATION) - .topologyObjectType(TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf("cellLocalId") - .parameter("1").resolverDataType(ResolverDataType.INTEGER).build()); + new ArrayList<>(Arrays.asList("provided-nrCellDu"))).container(ContainerType.ID).topologyObjectType( + TopologyObjectType.ENTITY).queryFunction(QueryFunction.EQ).leaf("cellLocalId").parameter("1") + .resolverDataType(ResolverDataType.INTEGER).build()); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(scopeLogicalBlock3).build())); - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // for id the PRIMITIVE dataType is set LogicalBlock logicalBlock4 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id='odu1']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock4).build())); - basePathRefinement.validateScopeParametersDataType(filterCriteria); Assertions.assertEquals(DataType.PRIMITIVE, ((ScopeLogicalBlock) logicalBlock4).getScopeObject().getDataType()); - // error reason: for id INTEGER ResolverDataType is not accepted LogicalBlock logicalBlock5 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id=1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock5).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // error reason: for gNBCUName attribute INTEGER ResolverDataType is not accepted LogicalBlock logicalBlock6 = scopeResolver.process("OCUCPFunction", "/attributes[@gNBCUName=1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock6).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // for sourceIds container PRIMITIVE dataType is set LogicalBlock logicalBlock7 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 'someSourceId']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock7).build())); - basePathRefinement.validateScopeParametersDataType(filterCriteria); - Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType()); - // error reason: for sourceIds container INTEGER dataType is not accepted LogicalBlock logicalBlock8 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 1]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock8).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - // for decorators container PRIMITIVE dataType is accepted - LogicalBlock logicalBlock9 = scopeResolver.process(ODU_FUNCTION, "/decorators[@module-x:stringdata = 'ORAN']"); + LogicalBlock logicalBlock9 = scopeResolver.process(ODU_FUNCTION, "/decorators[@module-x:stringdata = 'Ericsson']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock9).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); - // for decorators container INTEGER dataType is accepted LogicalBlock logicalBlock10 = scopeResolver.process(ODU_FUNCTION, "/decorators[@module-x:intdata = 2]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock10).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); - LogicalBlock logicalBlock11 = scopeResolver.process(ODU_FUNCTION, - "/decorators[contains(@gnbdu-function-model:location, 'Stock')]"); + "/decorators[contains(@odu-function-model:location, 'Stock')]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock11).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); - //For classifiers container PRIMITIVE dataType is accepted LogicalBlock logicalBlock12 = scopeResolver.process(ODU_FUNCTION, - "/classifiers[@item = 'gnbdu-function-model:Rural']"); + "/classifiers[@item = 'odu-function-model:Rural']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock12).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); - //For classifiers container INTEGER dataType is NOT accepted LogicalBlock logicalBlock13 = scopeResolver.process(ODU_FUNCTION, "/classifiers[@item = 23 ]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock13).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateScopeParametersDataType( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateScopeParametersDataType( filterCriteria)); - //for complex attribute INTEGER is accepted LogicalBlock logicalBlock14 = scopeResolver.process(ODU_FUNCTION, "/attributes/dUpLMNId[@mnc = 2]"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock14).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); - //for complex attribute PRIMITIVE is accepted LogicalBlock logicalBlock15 = scopeResolver.process(ODU_FUNCTION, "/attributes/dUpLMNId[@mnc = 'some value']"); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock15).build())); - + Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); + //for metadata container + LogicalBlock logicalBlock16 = scopeResolver.process(ODU_FUNCTION, "/metadata[@reliabilityIndicator = 'OK']"); + filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock16).build())); Assertions.assertDoesNotThrow(() -> basePathRefinement.validateScopeParametersDataType(filterCriteria)); } @@ -1155,51 +996,37 @@ class BasePathRefinementTest { "nCI")).build(); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1, targetObject2))).build())); - OrLogicalBlock orLogicalBlock1 = new OrLogicalBlock(); - ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).leaf("gNBIdLength") .queryFunction(QueryFunction.EQ).parameter("1").dataType(DataType.BIGINT).build(); ScopeObject scopeObject2 = ScopeObject.builder(ODU_FUNCTION).container(ContainerType.ATTRIBUTES).leaf("gNBId") .queryFunction(QueryFunction.EQ).parameter("8").dataType(DataType.BIGINT).build(); - ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(scopeObject1); ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(scopeObject2); orLogicalBlock1.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock1, scopeLogicalBlock2))); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1, targetObject2))).scope(orLogicalBlock1).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.checkIfTargetMatchesWithScope( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.checkIfTargetMatchesWithScope( filterCriteria.getFilterCriteriaList().get(0), filterCriteria.getDomain())); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1))).scope(orLogicalBlock1).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.checkIfTargetMatchesWithScope(filterCriteria .getFilterCriteriaList().get(0), filterCriteria.getDomain())); - ScopeObject scopeObject3 = ScopeObject.builder("NRSectorCarrier").container(ContainerType.ATTRIBUTES).leaf( "arfcnUL").queryFunction(QueryFunction.EQ).parameter("8").dataType(DataType.BIGINT).build(); - ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(scopeObject3); filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1))).scope(scopeLogicalBlock3).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.checkIfTargetMatchesWithScope( + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.checkIfTargetMatchesWithScope( filterCriteria.getFilterCriteriaList().get(0), filterCriteria.getDomain())); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(Collections.emptyList()).scope( scopeLogicalBlock3).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.checkIfTargetMatchesWithScope(filterCriteria .getFilterCriteriaList().get(0), filterCriteria.getDomain())); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(Collections.emptyList()).scope( EmptyLogicalBlock.getInstance()).build())); - Assertions.assertDoesNotThrow(() -> basePathRefinement.checkIfTargetMatchesWithScope(filterCriteria .getFilterCriteriaList().get(0), filterCriteria.getDomain())); - } @Test @@ -1213,20 +1040,17 @@ class BasePathRefinementTest { "nRPCI")).build(); TargetObject targetObject4 = TargetObject.builder("EUtranCell").container(ContainerType.ATTRIBUTES).params(List.of( "earFcn", "fdn")).isAllParamQueried(true).build(); - ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION).leaf("leaf1").build(); ScopeObject scopeObject2 = ScopeObject.builder("NRCellDU").leaf("leaf1").build(); ScopeObject scopeObject3 = ScopeObject.builder("EUtranCell").leaf("leaf1").build(); ScopeObject scopeObject4 = ScopeObject.builder(ODU_FUNCTION).leaf("leaf2").build(); ScopeObject scopeObject5 = ScopeObject.builder("NRCellDU").leaf("leaf2").build(); ScopeObject scopeObject6 = ScopeObject.builder("EUtranCell").leaf("leaf2").build(); - OrLogicalBlock or1 = new OrLogicalBlock(); AndLogicalBlock and1 = new AndLogicalBlock(); AndLogicalBlock and2 = new AndLogicalBlock(); OrLogicalBlock or2 = new OrLogicalBlock(); OrLogicalBlock or3 = new OrLogicalBlock(); - or1.getChildren().add(or2); or1.getChildren().add(and1); and1.getChildren().add(and2); @@ -1237,33 +1061,24 @@ class BasePathRefinementTest { and2.getChildren().add(new ScopeLogicalBlock(scopeObject4)); or3.getChildren().add(new ScopeLogicalBlock(scopeObject5)); or3.getChildren().add(new ScopeLogicalBlock(scopeObject6)); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().targets(new ArrayList<>(Arrays.asList( targetObject1, targetObject2, targetObject3, targetObject4))).scope(or1).build())); - basePathRefinement.splitFilterCriteria(filterCriteria); - OrLogicalBlock fc1or1 = new OrLogicalBlock(); - fc1or1.getChildren().add(new ScopeLogicalBlock(scopeObject1)); fc1or1.getChildren().add(new ScopeLogicalBlock(scopeObject4)); - OrLogicalBlock fc2or1 = new OrLogicalBlock(); - fc2or1.getChildren().add(new ScopeLogicalBlock(scopeObject2)); fc2or1.getChildren().add(new ScopeLogicalBlock(scopeObject5)); - AndLogicalBlock fc3and1 = new AndLogicalBlock(); fc3and1.getChildren().add(new ScopeLogicalBlock(scopeObject6)); fc3and1.getChildren().add(new ScopeLogicalBlock(scopeObject3)); - InnerFilterCriteria innerFilterCriteria1 = InnerFilterCriteria.builder().targets(List.of(targetObject1)).scope( fc1or1).build(); InnerFilterCriteria innerFilterCriteria2 = InnerFilterCriteria.builder().targets(List.of(targetObject2, targetObject3)).scope(fc2or1).build(); InnerFilterCriteria innerFilterCriteria3 = InnerFilterCriteria.builder().targets(List.of(targetObject4)).scope( fc3and1).build(); - Assertions.assertEquals(Set.of(innerFilterCriteria1, innerFilterCriteria2, innerFilterCriteria3), new HashSet<>( filterCriteria.getFilterCriteriaList())); } @@ -1282,47 +1097,32 @@ class BasePathRefinementTest { AndOrLogicalBlock orLogicalBlock3 = new OrLogicalBlock(); AndOrLogicalBlock andLogicalBlock1 = new AndLogicalBlock(); AndOrLogicalBlock andLogicalBlock2 = new AndLogicalBlock(); - orLogicalBlock1.setChildren(new ArrayList<>(Arrays.asList(orLogicalBlock2, andLogicalBlock1))); orLogicalBlock2.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock1, andLogicalBlock2))); andLogicalBlock2.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock2, scopeLogicalBlock3))); andLogicalBlock1.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock4, orLogicalBlock3))); orLogicalBlock3.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock5, scopeLogicalBlock6))); - scopeLogicalBlock1.setValid(false); scopeLogicalBlock4.setValid(false); scopeLogicalBlock6.setValid(false); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(orLogicalBlock1).build())); - basePathRefinement.validateQuery(filterCriteria); - Assertions.assertEquals(andLogicalBlock2, filterCriteria.getFilterCriteriaList().get(0).getScope()); - ScopeLogicalBlock scopeLogicalBlock2_1 = new ScopeLogicalBlock(null); ScopeLogicalBlock scopeLogicalBlock2_2 = new ScopeLogicalBlock(null); AndOrLogicalBlock andLogicalBlock2_1 = new AndLogicalBlock(); - scopeLogicalBlock2_1.setValid(false); - andLogicalBlock2_1.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock2_1, scopeLogicalBlock2_2))); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(andLogicalBlock2_1).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateQuery(filterCriteria)); - + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateQuery(filterCriteria)); ScopeLogicalBlock scopeLogicalBlock3_1 = new ScopeLogicalBlock(null); ScopeLogicalBlock scopeLogicalBlock3_2 = new ScopeLogicalBlock(null); AndOrLogicalBlock orLogicalBlock3_1 = new OrLogicalBlock(); - scopeLogicalBlock3_2.setValid(false); scopeLogicalBlock3_1.setValid(false); - orLogicalBlock3_1.setChildren(new ArrayList<>(Arrays.asList(scopeLogicalBlock3_1, scopeLogicalBlock3_2))); - filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(orLogicalBlock3_1).build())); - - Assertions.assertThrows(TiesPathException.class, () -> basePathRefinement.validateQuery(filterCriteria)); + Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.validateQuery(filterCriteria)); } @Test @@ -1332,7 +1132,6 @@ class BasePathRefinementTest { filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(orLogicalBlock).build())); OrLogicalBlock orLogicalBlockChild1 = new OrLogicalBlock(); OrLogicalBlock orLogicalBlockChild2 = new OrLogicalBlock(); - LogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).container( ContainerType.ATTRIBUTES).leaf("gNBIdLength").queryFunction(QueryFunction.EQ).parameter("1").dataType( DataType.BIGINT).build()); @@ -1345,17 +1144,306 @@ class BasePathRefinementTest { LogicalBlock scopeLogicalBlock4 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).container( ContainerType.ATTRIBUTES).leaf("gNBIdLength").queryFunction(QueryFunction.EQ).parameter("4").dataType( DataType.BIGINT).build()); - orLogicalBlockChild1.setChildren(Arrays.asList(scopeLogicalBlock1, scopeLogicalBlock2)); orLogicalBlockChild2.setChildren(Arrays.asList(scopeLogicalBlock3, scopeLogicalBlock4)); orLogicalBlock.setChildren(Arrays.asList(orLogicalBlockChild1, orLogicalBlockChild2)); - basePathRefinement.runOnTree(orLogicalBlock, filterCriteria.getDomain(), (ScopeLogicalBlock lb, String domain) -> lb .getScopeObject().setParameter("0")); - Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock1).getScopeObject().getParameter()); Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock2).getScopeObject().getParameter()); Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock3).getScopeObject().getParameter()); Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock4).getScopeObject().getParameter()); } + + @Test + void testAssociationAttributesOnRelation() { + LogicalBlock logicalBlock = scopeResolver.resolve(null, + "/serving-antennaModule/attributes[@antennaModelNumber='5']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP).build(); + + TeivPathException thrown = Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.refine( + filterCriteria)); + Assertions.assertEquals("Querying any thing other than id is not supported in case of association of relation", + thrown.getDetails()); + + } + + @Test + void testAssociationShouldFailDifferentRoot() { + Assertions.assertThrows(TeivPathException.class, () -> scopeResolver.resolve("NRCellDU", + "/ManagedElement/serving-antennaModule/attributes[@antennaModelNumber='5']")); + } + + @Test + void testAssociationOnAttributes() { + + LogicalBlock logicalBlock = scopeResolver.resolve(null, + "/NRCellDU/serving-antennaModule/attributes[@antennaModelNumber='5']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock = scopeResolver.process(null, + "/NRCellDU/serving-antennaModule/attributes[@antennaModelNumber='5']"); + + ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); + expectedScopeObject.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject.setContainer(ContainerType.ATTRIBUTES); + expectedScopeObject.setLeaf("antennaModelNumber"); + expectedScopeObject.setQueryFunction(QueryFunction.EQ); + expectedScopeObject.setParameter("5"); + expectedScopeObject.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria); + + Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + + LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]"); + final FilterCriteria filterCriteria2 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock2).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock2 = scopeResolver.process("NRCellDU", + "/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]"); + + ScopeObject expectedScopeObject2 = ((ScopeLogicalBlock) expectedLogicalBlock2).getScopeObject(); + expectedScopeObject2.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject2.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject2.setContainer(ContainerType.ATTRIBUTES); + expectedScopeObject2.setLeaf("geo-location"); + expectedScopeObject2.setQueryFunction(QueryFunction.COVERED_BY); + expectedScopeObject2.setParameter("POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))"); + expectedScopeObject2.setDataType(DataType.GEOGRAPHIC); + + basePathRefinement.refine(filterCriteria2); + + Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + + LogicalBlock logicalBlock3 = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]"); + final FilterCriteria filterCriteria3 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock3).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock3 = scopeResolver.process("NRCellDU", + "/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]"); + + ScopeObject expectedScopeObject3 = ((ScopeLogicalBlock) expectedLogicalBlock3).getScopeObject(); + expectedScopeObject3.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject3.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject3.setContainer(ContainerType.ATTRIBUTES); + expectedScopeObject3.setLeaf("geo-location"); + expectedScopeObject3.setQueryFunction(QueryFunction.WITHIN_METERS); + expectedScopeObject3.setParameter("'POINT(49.40199 68.94199)', 500"); + expectedScopeObject3.setDataType(DataType.GEOGRAPHIC); + + basePathRefinement.refine(filterCriteria3); + + Assertions.assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject()); + + LogicalBlock logicalBlock4 = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/attributes[@antennaModelNumber='5']"); + final FilterCriteria filterCriteria4 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock4).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock4 = scopeResolver.process("NRCellDU", + "/serving-antennaModule/attributes[@antennaModelNumber='5']"); + + ScopeObject expectedScopeObject4 = ((ScopeLogicalBlock) expectedLogicalBlock4).getScopeObject(); + expectedScopeObject4.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject4.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject4.setContainer(ContainerType.ATTRIBUTES); + expectedScopeObject4.setLeaf("antennaModelNumber"); + expectedScopeObject4.setQueryFunction(QueryFunction.EQ); + expectedScopeObject4.setParameter("5"); + expectedScopeObject4.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria4); + + Assertions.assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject()); + + LogicalBlock logicalBlock5 = scopeResolver.resolve(null, + "/serving-antennaModule/attributes[@antennaModelNumber='5']"); + final FilterCriteria filterCriteria5 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock5).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock5 = scopeResolver.process(null, + "/serving-antennaModule/attributes[@antennaModelNumber='5']"); + + ScopeObject expectedScopeObject5 = ((ScopeLogicalBlock) expectedLogicalBlock5).getScopeObject(); + expectedScopeObject5.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject5.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject5.setContainer(ContainerType.ATTRIBUTES); + expectedScopeObject5.setLeaf("antennaModelNumber"); + expectedScopeObject5.setQueryFunction(QueryFunction.EQ); + expectedScopeObject5.setParameter("5"); + expectedScopeObject5.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria5); + Assertions.assertEquals(new ScopeLogicalBlock(expectedScopeObject5), filterCriteria5.getFilterCriteriaList().get(0) + .getScope()); + + } + + @Test + void testAssociationOnSourceIds() { + LogicalBlock logicalBlock = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock = scopeResolver.process("NRCellDU", + "/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']"); + + ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); + expectedScopeObject.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject.setContainer(ContainerType.SOURCE_IDS); + expectedScopeObject.setLeaf("item"); + expectedScopeObject.setQueryFunction(QueryFunction.EQ); + expectedScopeObject.setParameter( + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1"); + expectedScopeObject.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria); + + Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + + LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/sourceIds[contains(@item,'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1')]"); + final FilterCriteria filterCriteria2 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock2).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock2 = scopeResolver.process("NRCellDU", + "/serving-antennaModule/sourceIds[contains(@item,'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1')]"); + + ScopeObject expectedScopeObject2 = ((ScopeLogicalBlock) expectedLogicalBlock2).getScopeObject(); + expectedScopeObject2.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject2.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject2.setContainer(ContainerType.SOURCE_IDS); + expectedScopeObject2.setLeaf("item"); + expectedScopeObject2.setQueryFunction(QueryFunction.CONTAINS); + expectedScopeObject2.setParameter( + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1"); + expectedScopeObject2.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria2); + + Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + + } + + @Test + void testAssociationWrongSyntax() { + Assertions.assertThrows(TeivPathException.class, () -> scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/attributes/sourceIds[@item = 'sourceIds']")); + Assertions.assertThrows(TeivPathException.class, () -> scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/sourceIds/attributes[@item = 'sourceIds']")); + } + + @Test + void testAssociationOnClassifiers() { + LogicalBlock logicalBlock = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/classifiers[@item='app-module:Rural']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock = scopeResolver.process("NRCellDU", + "/serving-antennaModule/classifiers[@item='app-module:Rural']"); + + ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); + expectedScopeObject.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject.setContainer(ContainerType.CLASSIFIERS); + expectedScopeObject.setLeaf("item"); + expectedScopeObject.setQueryFunction(QueryFunction.EQ); + expectedScopeObject.setParameter("app-module:Rural"); + expectedScopeObject.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria); + + Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + + LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/classifiers[contains(@item,'app-module:Rural')]"); + final FilterCriteria filterCriteria2 = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock2).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock2 = scopeResolver.process("NRCellDU", + "/serving-antennaModule/classifiers[contains(@item,'app-module:Rural')]"); + + ScopeObject expectedScopeObject2 = ((ScopeLogicalBlock) expectedLogicalBlock2).getScopeObject(); + expectedScopeObject2.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject2.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject2.setContainer(ContainerType.CLASSIFIERS); + expectedScopeObject2.setLeaf("item"); + expectedScopeObject2.setQueryFunction(QueryFunction.CONTAINS); + expectedScopeObject2.setParameter("app-module:Rural"); + expectedScopeObject2.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria2); + + Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject()); + } + + @Test + void testAssociationOnDecorators() { + LogicalBlock logicalBlock = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/decorators[@test-app-module:textdata='Ericsson']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock = scopeResolver.process("NRCellDU", + "/serving-antennaModule/decorators[@test-app-module:textdata='Ericsson']"); + + ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); + expectedScopeObject.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject.setContainer(ContainerType.DECORATORS); + expectedScopeObject.setLeaf("test-app-module:textdata"); + expectedScopeObject.setQueryFunction(QueryFunction.EQ); + expectedScopeObject.setParameter("Ericsson"); + expectedScopeObject.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria); + + Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + + } + + @Test + void testAssociationOnMetadata() { + LogicalBlock logicalBlock = scopeResolver.resolve("NRCellDU", + "/serving-antennaModule/metadata[@reliabilityIndicator='OK']"); + final FilterCriteria filterCriteria = FilterCriteria.builder("RAN").filterCriteriaList(List.of(InnerFilterCriteria + .builder().targets(targetResolver.resolve(null, null)).scope(logicalBlock).build())) + .resolvingTopologyObjectType(FilterCriteria.ResolvingTopologyObjectType.ENTITY).build(); + + LogicalBlock expectedLogicalBlock = scopeResolver.process("NRCellDU", + "/serving-antennaModule/metadata[@reliabilityIndicator='OK']"); + + ScopeObject expectedScopeObject = ((ScopeLogicalBlock) expectedLogicalBlock).getScopeObject(); + expectedScopeObject.setTopologyObject("NRCellDU/serving-antennaModule"); + expectedScopeObject.setTopologyObjectType(TopologyObjectType.ASSOCIATION); + expectedScopeObject.setContainer(ContainerType.METADATA); + expectedScopeObject.setLeaf("reliabilityIndicator"); + expectedScopeObject.setQueryFunction(QueryFunction.EQ); + expectedScopeObject.setParameter("OK"); + expectedScopeObject.setDataType(DataType.PRIMITIVE); + + basePathRefinement.refine(filterCriteria); + + Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject()); + } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinementTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinementTest.java similarity index 74% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinementTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinementTest.java index d4e8185..876055d 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/refiner/PathToJooqRefinementTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinementTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,21 +18,21 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.refiner; +package org.oran.smo.teiv.exposure.teivpath.refiner; import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.FilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.InnerFilterCriteria; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeObject; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TopologyObjectType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.FilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.InnerFilterCriteria; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; @@ -63,11 +63,11 @@ class PathToJooqRefinementTest { " (\n" + " select count(*)\n" + " from (\n" + - " select ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" \"o-ran-smo-teiv-ran:ODUFunction.id\"\n" + " select teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" \"o-ran-smo-teiv-ran:ODUFunction.id\"\n" + - " from ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"\n" + - " where ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = '123'\n" + - " ) \"alias_101460301\"\n" + + " from teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"\n" + + " where teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = '123'\n" + + " ) \"alias_10602194\"\n" + " ) \"count\"\n" + ")\n" + "union all (\n" + @@ -77,13 +77,13 @@ class PathToJooqRefinementTest { " null \"count\"\n" + " from (\n" + " select\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBDUId\" \"o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId\",\n" + - " ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" \"o-ran-smo-teiv-ran:ODUFunction.id\"\n" + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"gNBDUId\" \"o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId\",\n" + + " teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" \"o-ran-smo-teiv-ran:ODUFunction.id\"\n" + - " from ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"\n" + - " where ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = '123'\n" + + " from teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"\n" + + " where teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = '123'\n" + " order by \"o-ran-smo-teiv-ran:ODUFunction.id\" asc\n" + - " ) \"alias_47405590\"\n" + + " ) \"alias_8925548\"\n" + " limit 100\n" + " offset 0\n" + ")", PathToJooqRefinement.toJooq(filterCriteria, 0, 100).toString()); diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolverTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolverTest.java similarity index 84% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolverTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolverTest.java index 3216063..adf18e7 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/ScopeResolverTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/ScopeResolverTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -28,16 +28,16 @@ import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.AndOrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.EmptyLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.LogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.OrLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.QueryFunction; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeLogicalBlock; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ScopeObject; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.AndOrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.EmptyLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.LogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.OrLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.QueryFunction; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeLogicalBlock; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ScopeObject; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; class ScopeResolverTest { @@ -52,13 +52,13 @@ class ScopeResolverTest { @Test void resolveScopeWithMultipleTokensWithSameContainer() { - ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("gnBId").queryFunction(QueryFunction.EQ).parameter("1").resolverDataType( ResolverDataType.INTEGER).build()); - ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("date").queryFunction(QueryFunction.EQ).parameter("2").resolverDataType( ResolverDataType.STRING).build()); - ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("refs").queryFunction(QueryFunction.EQ).parameter("12341").resolverDataType( ResolverDataType.INTEGER).build()); ScopeLogicalBlock scopeLogicalBlock4 = new ScopeLogicalBlock(ScopeObject.builder("*").container( @@ -125,43 +125,43 @@ class ScopeResolverTest { @Test void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidNumber() { - assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)', 50asd0)]")); } @Test void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar1() { - assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)' 500)]")); } @Test void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar2() { - assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/attributes[withinMeters(@geo-location, ,'POINT (12.3426 45.24568)', 500)]")); } @Test void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar3() { - assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/attributes[withinMeters('POINT (12.3426 45.24568)', 500)]")); } @Test void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar4() { - assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/attributes[withinMeters('POINT (12.3426 45.24568)', )]")); } @Test void resolveScopeWithMultipleTokensWithDifferentContainers() { - ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("gnBId").queryFunction(QueryFunction.EQ).parameter("1").resolverDataType( ResolverDataType.INTEGER).build()); - ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("date").queryFunction(QueryFunction.EQ).parameter("2").resolverDataType( ResolverDataType.STRING).build()); - ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( + ScopeLogicalBlock scopeLogicalBlock3 = new ScopeLogicalBlock(ScopeObject.builder("*/GNBDUFunction").container( ContainerType.ATTRIBUTES).leaf("refs").queryFunction(QueryFunction.EQ).parameter("12341").resolverDataType( ResolverDataType.INTEGER).build()); ScopeLogicalBlock scopeLogicalBlock4 = new ScopeLogicalBlock(ScopeObject.builder("*").container( @@ -197,8 +197,8 @@ class ScopeResolverTest { @Test void testRelationshipInScope() { - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ManagedElement").container(null) - .innerContainer(List.of("MANAGEDELEMENT_MANAGES_GNBDUFUNCTION")).leaf(null).queryFunction( + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder( + "ManagedElement/MANAGEDELEMENT_MANAGES_GNBDUFUNCTION").container(null).leaf(null).queryFunction( QueryFunction.NOT_NULL).parameter(null).resolverDataType(ResolverDataType.NOT_NULL).build()); final LogicalBlock logicalBlock = scopeResolver.resolve("ManagedElement", "/MANAGEDELEMENT_MANAGES_GNBDUFUNCTION"); Assertions.assertEquals(expected, logicalBlock); @@ -206,12 +206,12 @@ class ScopeResolverTest { @Test void testNoLeavesInScope() { - ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("ENodeBFunction").container(null) - .innerContainer(List.of("managed-by-managedObject")).leaf(null).queryFunction(QueryFunction.NOT_NULL) + ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder( + "ENodeBFunction/managed-by-managedObject").container(null).leaf(null).queryFunction(QueryFunction.NOT_NULL) .parameter(null).resolverDataType(ResolverDataType.NOT_NULL).build()); - ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder(null).container(null) - .innerContainer(List.of("managed-by-managedObject")).leaf("id").queryFunction(QueryFunction.EQ).parameter( - "me1").resolverDataType(ResolverDataType.STRING).build()); + ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder("*/managed-by-managedObject") + .container(null).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1") + .resolverDataType(ResolverDataType.STRING).build()); AndOrLogicalBlock logicalBlock = new AndLogicalBlock(); logicalBlock.addChild(scopeLogicalBlock1); logicalBlock.addChild(scopeLogicalBlock2); @@ -222,8 +222,8 @@ class ScopeResolverTest { @Test void testResolveAssociationWithoutRootObjectInScopeFilter() { - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder(null).container(null).innerContainer(List.of( - "managed-by-managedObject")).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType( + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*/managed-by-managedObject").container(null) + .innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").resolverDataType( ResolverDataType.STRING).build()); final LogicalBlock resolvedScope = scopeResolver.resolve(null, "/managed-by-managedObject[@id='me1']"); Assertions.assertEquals(expected, resolvedScope); @@ -247,28 +247,27 @@ class ScopeResolverTest { @Test void testExceptionWhenTextConditionUsedOnOtherThanID() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> scopeResolver.resolve(null, "/ManagedElement[text()='me1']")); assertEquals("text() is supported for ID only", thrown.getDetails()); } @Test void testResolveWithRootObjectAndAssociationInScopeFilter() { - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ENodeBFunction").container(null) - .innerContainer(List.of("managed-by-managedObject")).leaf("id").queryFunction(QueryFunction.EQ).parameter( - "me1").resolverDataType(ResolverDataType.STRING).build()); + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ENodeBFunction/managed-by-managedObject") + .container(null).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1") + .resolverDataType(ResolverDataType.STRING).build()); final LogicalBlock resolvedScope = scopeResolver.resolve("ENodeBFunction", "/managed-by-managedObject[@id='me1']"); Assertions.assertEquals(expected, resolvedScope); } @Test void testResolveWithRootObjectAndEntityInScopeFilter() { - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ManagedElement").container(null) - .innerContainer(List.of("GNBDUFunction")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("me1") + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ManagedElement/GNBDUFunction").container( + null).innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("me1") .resolverDataType(ResolverDataType.STRING).build()); final LogicalBlock resolvedScope = scopeResolver.resolve("ManagedElement", "/GNBDUFunction[contains(@id,'me1')]"); Assertions.assertEquals(expected, resolvedScope); - } @Test @@ -282,7 +281,7 @@ class ScopeResolverTest { @Test void testResolveComplexAttributeInScopeFilter() { //Without root object & Entity type provided in the container - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("GNBCUCPFunction").container( + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*/GNBCUCPFunction").container( ContainerType.ATTRIBUTES).innerContainer(List.of("pLMNId")).leaf("mcc").queryFunction(QueryFunction.EQ) .parameter("01").resolverDataType(ResolverDataType.STRING).build()); final LogicalBlock resolvedScope = scopeResolver.resolve(null, "/GNBCUCPFunction/attributes/pLMNId[@mcc='01']"); @@ -309,24 +308,18 @@ class ScopeResolverTest { .parameter("01").resolverDataType(ResolverDataType.STRING).build()); final LogicalBlock resolvedScope3 = scopeResolver.resolve("GNBCUCPFunction", "/attributes/pLMNId[@mcc='01']"); Assertions.assertEquals(expected3, resolvedScope3); - - //With root object & wrong Entity type not provided - final TiesPathException exception = assertThrows(TiesPathException.class, () -> scopeResolver.resolve( - "GNBCUCPFunction", "/GNBDUFunction/attributes/pLMNId[@mcc='01']")); - Assertions.assertEquals("Target/Scope filter can only contain Root Object types mentioned in the path parameter", - exception.getDetails()); } @Test void testExceptionWithTopologyObjectInScopeFilterWhichDoesNotHaveValidContainerTypeInLeaf() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> scopeResolver.resolve("ManagedElement", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> scopeResolver.resolve("ManagedElement", "/ManagedElement[@id1='me1']")); assertEquals("id1 is not a valid leaf for topology object: ManagedElement", thrown.getDetails()); } @Test void testExceptionWithScopeFilterLeafButNoCondition() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> scopeResolver.resolve("ManagedElement", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> scopeResolver.resolve("ManagedElement", "/GNBDUFunction(fdn))")); assertEquals("Parameter without any condition is not supported in scope filter", thrown.getDetails()); } @@ -341,16 +334,16 @@ class ScopeResolverTest { @Test void testWithNoRootObjectAndNonMatchingContainerTypeInScopeFilter() { - ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ManagedElement").container(null) + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("ManagedElement/attr").container(null) .queryFunction(QueryFunction.CONTAINS).parameter("me1").resolverDataType(ResolverDataType.STRING) - .innerContainer(List.of("attr")).leaf("id").build()); + .innerContainer(List.of()).leaf("id").build()); final LogicalBlock resolvedScope = scopeResolver.resolve(null, "/ManagedElement/attr[contains(@id,'me1')]"); Assertions.assertEquals(expected, resolvedScope); } @Test void testWithNonMatchingRootObjectInScopeFilter() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> scopeResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> scopeResolver.resolve("GNBDUFunction", "/ManagedElement/attr[contains(@id,'me1')]")); assertEquals("Target/Scope filter can only contain Root Object types mentioned in the path parameter", thrown .getDetails()); diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolverTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolverTest.java similarity index 88% rename from teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolverTest.java rename to teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolverTest.java index 5e3d4b6..2cde84c 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/tiespath/resolver/TargetResolverTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/resolver/TargetResolverTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ -package org.oran.smo.teiv.exposure.tiespath.resolver; +package org.oran.smo.teiv.exposure.teivpath.resolver; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -28,9 +28,9 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.ContainerType; -import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; -import org.oran.smo.teiv.utils.query.exception.TiesPathException; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.ContainerType; +import org.oran.smo.teiv.exposure.teivpath.innerlanguage.TargetObject; +import org.oran.smo.teiv.utils.query.exception.TeivPathException; class TargetResolverTest { @@ -57,7 +57,7 @@ class TargetResolverTest { @Test void testExceptionNonMatchingContainerType() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve("GNBDUFunction", "/bla")); assertEquals("Invalid Container name or Root Object name does not match to the path parameter", thrown .getDetails()); @@ -65,7 +65,7 @@ class TargetResolverTest { @Test void testExceptionWhenTopologyObjectInTargetWithParamButNoMatchingContainer() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction(fdn, enbId)")); assertEquals("Attributes cannot be associated at this level", thrown.getDetails()); } @@ -100,7 +100,7 @@ class TargetResolverTest { @Test void testAttributesOnSourceIds() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction/sourceIds(fdn, enbId)")); assertEquals("Parameters are not supported for sourceIds in target filter", thrown.getDetails()); } @@ -125,42 +125,42 @@ class TargetResolverTest { @Test void testExceptionWithParamOnDecorators() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction/attributes(fdn, enbId); /GNBDUFunction/decorators(module-x:location,module-y:vendor)")); assertEquals("Parameters are not supported for decorators in target filter", thrown.getDetails()); } @Test void testExceptionWithMoreThanTwoLevel() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction/NRCellDU/attributes")); assertEquals("More than two level deep path is not allowed", thrown.getDetails()); } @Test void testExceptionWithPipeInTargetFilter() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction/attributes(fdn, enbId)|/GNBDUFunction/classifiers")); assertEquals("OR (|) is not supported for target filter", thrown.getDetails()); } @Test void testExceptionWithScopeFilterInTargetFilter() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve("GNBDUFunction", "/GNBDUFunction/attributes[@gNBIdLength=3 or @abc=5 ]")); assertEquals("Parameter condition is not supported in target filter", thrown.getDetails()); } @Test void testTargetWithoutSlash() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve("GNBDUFunction", "attributes")); assertEquals("no viable alternative at input 'attributes' at line 1:0", thrown.getDetails()); } @Test void testDifferentTopologyObjectInTargetFilterAndRootObjectType() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve("GNBDUFunction", "/ENodeBFunction")); assertEquals("Invalid Container name or Root Object name does not match to the path parameter", thrown .getDetails()); @@ -168,7 +168,7 @@ class TargetResolverTest { @Test void testDifferentTopologyObjectInTargetFilterWithAttributesAndRootObjectType() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve("GNBDUFunction", + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve("GNBDUFunction", "/ENodeBFunction/attributes")); assertEquals("Target/Scope filter can only contain Root Object types mentioned in the path parameter", thrown .getDetails()); @@ -176,7 +176,7 @@ class TargetResolverTest { @Test void testEmptyRootObjectTypeWithOneOfTheWrongTargetToken() { - TiesPathException thrown = assertThrows(TiesPathException.class, () -> targetResolver.resolve(null, + TeivPathException thrown = assertThrows(TeivPathException.class, () -> targetResolver.resolve(null, "/GNBDUFunction/attributes(fdn, enbId);/GNBDUFunction/NRCellDU/attributes")); assertEquals("More than two level deep path is not allowed", thrown.getDetails()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/PaginationUtilTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/PaginationUtilTest.java index f014237..e070cfd 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/PaginationUtilTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/PaginationUtilTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import org.oran.smo.teiv.api.model.OranTeivHref; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; class PaginationUtilTest { private static final RequestDetails requestDetails = RequestDetails.builder().basePath("/test").queryParam("q1", "val2") @@ -46,7 +46,7 @@ class PaginationUtilTest { assertEquals(0, limit3); //offset is greater than totalCount - TiesException exception = assertThrows(TiesException.class, () -> PaginationUtil.getViableLimit(15, 5, 10)); + TeivException exception = assertThrows(TeivException.class, () -> PaginationUtil.getViableLimit(15, 5, 10)); assertEquals("Offset cannot be larger than 9", exception.getDetails()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/RequestValidatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/RequestValidatorTest.java index 1e9e04e..4ba5fb0 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/RequestValidatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/utils/RequestValidatorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.schema.MockSchemaLoader; @@ -42,26 +42,26 @@ class RequestValidatorTest { @Test void testValidateDomain() { Assertions.assertDoesNotThrow(() -> requestValidator.validateDomain("RAN")); - Assertions.assertThrowsExactly(TiesException.class, () -> requestValidator.validateDomain("RAN_WRONG")); + Assertions.assertThrowsExactly(TeivException.class, () -> requestValidator.validateDomain("RAN_WRONG")); } @Test void testValidateEntityType() { Assertions.assertDoesNotThrow(() -> requestValidator.validateEntityType("ODUFunction")); - Assertions.assertThrowsExactly(TiesException.class, () -> requestValidator.validateEntityType("InvalidEntity")); + Assertions.assertThrowsExactly(TeivException.class, () -> requestValidator.validateEntityType("InvalidEntity")); } @Test void testValidateEntityTypeInDomain() { Assertions.assertDoesNotThrow(() -> requestValidator.validateEntityTypeInDomain("OCUUPFunction", "RAN")); - Assertions.assertThrowsExactly(TiesException.class, () -> requestValidator.validateEntityTypeInDomain( + Assertions.assertThrowsExactly(TeivException.class, () -> requestValidator.validateEntityTypeInDomain( "ODU_FUNCTION", "EQUIPMENT")); } @Test void testValidateRelationshipType() { Assertions.assertDoesNotThrow(() -> requestValidator.validateRelationshipType("ANTENNAMODULE_INSTALLED_AT_SITE")); - Assertions.assertThrowsExactly(TiesException.class, () -> requestValidator.validateRelationshipType( + Assertions.assertThrowsExactly(TeivException.class, () -> requestValidator.validateRelationshipType( "ANTENNAMODULE_INSTALLED_ON_SITE")); } @@ -69,7 +69,7 @@ class RequestValidatorTest { void testValidateRelationshipTypeInDomain() { Assertions.assertDoesNotThrow(() -> requestValidator.validateRelationshipTypeInDomain( "ANTENNAMODULE_INSTALLED_AT_SITE", "EQUIPMENT")); - Assertions.assertThrowsExactly(TiesException.class, () -> requestValidator.validateRelationshipTypeInDomain( + Assertions.assertThrowsExactly(TeivException.class, () -> requestValidator.validateRelationshipTypeInDomain( "ANTENNAMODULE_INSTALLED_AT_SITE", "RAN")); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java b/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java index 3c934d0..d29dd26 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java +++ b/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,21 +20,28 @@ */ package org.oran.smo.teiv.groups; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_MODEL_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL_SCHEMA; import java.util.List; import javax.sql.DataSource; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.springframework.context.ApplicationContext; import org.jooq.DSLContext; import org.jooq.SQLDialect; import org.jooq.impl.DSL; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.oran.smo.teiv.exposure.audit.LoggerHandler; +import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; import com.fasterxml.jackson.databind.ObjectMapper; @@ -43,23 +50,42 @@ import org.oran.smo.teiv.db.TestPostgresqlContainer; import org.oran.smo.teiv.TopologyApiBase; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; @AutoConfigureMockMvc @SpringBootTest @ActiveProfiles({ "test", "groups" }) public abstract class TopologyGroupsApiBase extends TopologyApiBase { - public static final String TIES_GROUPS = "ties_groups"; + public static final String TEIV_GROUPS = "teiv_groups"; + + @Autowired + private ApplicationContext context; + @Autowired + private MockMvc mockMvc; + @MockBean + private LoggerHandler loggerHandler; @BeforeAll public static void beforeAll() throws UnsupportedOperationException, SchemaLoaderException { String url = postgresSQLContainer.getJdbcUrl(); DataSource ds = DataSourceBuilder.create().url(url).username("test").password("test").build(); DSLContext dslContext = DSL.using(ds, SQLDialect.POSTGRES); - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA, TIES_MODEL_SCHEMA, - TIES_GROUPS), dslContext); + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA, TEIV_CONSUMER_DATA_SCHEMA, TEIV_MODEL_SCHEMA, + TEIV_GROUPS), dslContext); TestPostgresqlContainer.loadModels(); TestPostgresqlContainer.loadSampleGroupsData(); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); } + + @BeforeEach + public void setup() { + GroupCreationRequestFilter groupCreationRequestFilter = new GroupCreationRequestFilter(loggerHandler); + mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilter(groupCreationRequestFilter, + "/topology-inventory/v1alpha11/groups").build(); + + RestAssuredMockMvc.mockMvc(mockMvc); + } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java index e684279..5c4c40e 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.ingestion.validation; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; import static org.jooq.impl.DSL.table; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -65,7 +65,7 @@ import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.RelationshipDataLocation; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; import org.oran.smo.teiv.service.cloudevent.data.Relationship; @@ -81,7 +81,7 @@ class IngestionOperationValidatorTest { private static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); @Autowired - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @SpyBean private IngestionOperationValidatorFactory validatorFactory; @@ -103,7 +103,7 @@ class IngestionOperationValidatorTest { registry.add("spring.datasource.write.password", () -> postgresqlContainer.getPassword()); } - private TiesDbServiceForValidation spiedDbServiceForValidation; + private TeivDbServiceForValidation spiedDbServiceForValidation; @BeforeAll static void beforeAll() { @@ -116,14 +116,14 @@ class IngestionOperationValidatorTest { PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(writeDataDslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); when(validatorFactory.createValidator(any())).thenAnswer(i -> { - spiedDbServiceForValidation = spy(new TiesDbServiceForValidation((DSLContext) i.getArguments()[0])); + spiedDbServiceForValidation = spy(new TeivDbServiceForValidation((DSLContext) i.getArguments()[0])); return new IngestionOperationValidator(spiedDbServiceForValidation); }); } @BeforeEach public void deleteAll() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), writeDataDslContext); if (spiedDbServiceForValidation != null) { reset(spiedDbServiceForValidation); } @@ -142,24 +142,24 @@ class IngestionOperationValidatorTest { .of())); ParsedCloudEventData parsedCloudEventData = new ParsedCloudEventData(entities, relationships); //It's expected to fail, because the NRCellDU_1 entity would be connected to 2 ManagedElement instances - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); //The whole transaction is rolled back. Neither the entities nor the relationships are persisted. - assertEmptyTable("ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); - assertEmptyTable("ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); + assertEmptyTable("teiv_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); + assertEmptyTable("teiv_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); //Remove the extra relationship that caused the cardinality violation. Successfully insert the others. Relationship redundantRelationship = relationships.remove(1); ParsedCloudEventData parsedCloudEventData2 = new ParsedCloudEventData(entities, relationships); - assertEquals(entities.size() + relationships.size(), tiesDbOperations.executeEntityAndRelationshipMergeOperations( + assertEquals(entities.size() + relationships.size(), teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation).acquireEntityInstanceExclusiveLock( - "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"", "NRCellDU_1"); + "teiv_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"", "NRCellDU_1"); //Try to insert an extra relationship. It's expected to fail, because the NRCellDU_1 entity already has the maximum number of relationships. ParsedCloudEventData parsedCloudEventData3 = new ParsedCloudEventData(List.of(), List.of(redundantRelationship)); - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3, "testSource")); } @@ -176,31 +176,31 @@ class IngestionOperationValidatorTest { "TestEntityB_3", List.of())); ParsedCloudEventData parsedCloudEventData = new ParsedCloudEventData(entities, relationships); //It's expected to fail, because the TestEntityA_1 entity would be connected to 3 TestEntityB instances - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); //The whole transaction is rolled back. Neither the entities nor the relationships are persisted. - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\""); //Remove the extra relationship that caused the cardinality violation. Successfully insert the others. Relationship redundantRelationship = relationships.remove(2); ParsedCloudEventData parsedCloudEventData2 = new ParsedCloudEventData(entities, relationships); - assertEquals(entities.size() + relationships.size(), tiesDbOperations.executeEntityAndRelationshipMergeOperations( + assertEquals(entities.size() + relationships.size(), teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation, times(2)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); verify(spiedDbServiceForValidation, times(2)).executeValidationQuery(any(), any(), any(), any(Long.class)); verifyNoMoreInteractions(spiedDbServiceForValidation); //Try to insert an extra relationship. It's expected to fail, because the CloudNativeSystem_1 entity already has the maximum number of relationships. ParsedCloudEventData parsedCloudEventData3 = new ParsedCloudEventData(List.of(), List.of(redundantRelationship)); - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); } @Test @@ -218,17 +218,17 @@ class IngestionOperationValidatorTest { "TestEntityA_1", "TestEntityB_4", List.of())); ParsedCloudEventData parsedCloudEventData = new ParsedCloudEventData(entities, relationships); //It's expected to fail, because the TestEntityA_1 entity would be connected to 4 TestEntityB instances - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); //The whole transaction is rolled back. Neither the entities nor the relationships are persisted. - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityB\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB\""); //Test the other side's cardinality as well relationships = new ArrayList<>(); @@ -241,13 +241,13 @@ class IngestionOperationValidatorTest { ParsedCloudEventData parsedCloudEventData2 = new ParsedCloudEventData(entities, relationships); //It's expected to fail, because the TestEntityB_1 entity would be connected to 3 TestEntityA instances - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData2, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityB\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB\""); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB\""); } @Test @@ -263,15 +263,15 @@ class IngestionOperationValidatorTest { "TestEntityB_1", List.of())); ParsedCloudEventData parsedCloudEventData = new ParsedCloudEventData(entities, relationships); //It's expected to fail, because the TestEntityB_1 entity would be connected to 3 TestEntityB instances - assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations + assertThrows(MaximumCardinalityViolationException.class, () -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); //The whole transaction is rolled back. Neither the entities nor the relationships are persisted. - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityB\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityA\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\""); + assertEmptyTable("teiv_data.\"o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB\""); //Test the other side's cardinality entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_2", Map.of(), List.of())); @@ -284,14 +284,14 @@ class IngestionOperationValidatorTest { relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_3", "TestEntityA_1", "TestEntityB_3", List.of())); ParsedCloudEventData parsedCloudEventData2 = new ParsedCloudEventData(entities, relationships); - assertEquals(entities.size() + relationships.size(), tiesDbOperations.executeEntityAndRelationshipMergeOperations( + assertEquals(entities.size() + relationships.size(), teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_2"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_2"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_3"); + "teiv_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_3"); verify(spiedDbServiceForValidation, times(3)).executeValidationQuery(any(), any(), any(), any(Long.class)); verifyNoMoreInteractions(spiedDbServiceForValidation); } @@ -334,7 +334,7 @@ class IngestionOperationValidatorTest { @Test void testMaxCardinalityIsLong() { - assertFalse(new TiesDbServiceForValidation(null).executeValidationQuery("", "", "", Long.MAX_VALUE)); + assertFalse(new TeivDbServiceForValidation(null).executeValidationQuery("", "", "", Long.MAX_VALUE)); } void assertEmptyTable(String tableName) { diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java index 214dfab..cf39d3e 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ import org.oran.smo.teiv.ingestion.validation.IngestionOperationValidatorFactory import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; import org.oran.smo.teiv.service.RelationshipMergeValidator; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import io.cloudevents.CloudEvent; @@ -56,7 +56,8 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbService; +import org.oran.smo.teiv.service.TeivMetadataResolver; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; @@ -74,12 +75,12 @@ class CreateTopologyProcessorTest { private CustomMetrics metrics; @Mock - private TiesDbService tiesDbService; + private TeivDbService teivDbService; @Mock private IngestionAuditLogger auditLogger; - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @BeforeAll static void setUpAll() throws SchemaLoaderException { @@ -90,9 +91,9 @@ class CreateTopologyProcessorTest { @BeforeEach void setUp() { - tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), - new RelationshipMergeValidator()); - createTopologyProcessor = new CreateTopologyProcessor(cloudEventParser, metrics, tiesDbOperations, auditLogger); + teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator(), new TeivMetadataResolver()); + createTopologyProcessor = new CreateTopologyProcessor(cloudEventParser, metrics, teivDbOperations, auditLogger); } @Test @@ -105,10 +106,10 @@ class CreateTopologyProcessorTest { ParsedCloudEventData parsedData = new ParsedCloudEventData(List.of(entity), List.of()); when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); - doThrow(new RuntimeException("test error")).when(tiesDbService).execute(anyList()); + doThrow(new RuntimeException("test error")).when(teivDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> createTopologyProcessor.process(event, anyString())); - verify(tiesDbService, times(1)).execute(anyList()); + verify(teivDbService, times(1)).execute(anyList()); verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), anyString()); @@ -125,7 +126,7 @@ class CreateTopologyProcessorTest { when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); createTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumSuccessfullyParsedCreateCloudEvents(); verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedCreateCloudEvents(); @@ -148,7 +149,7 @@ class CreateTopologyProcessorTest { when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); createTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumSuccessfullyParsedCreateCloudEvents(); verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedCreateCloudEvents(); @@ -166,7 +167,7 @@ class CreateTopologyProcessorTest { when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); createTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumUnsuccessfullyParsedCreateCloudEvents(); verifyNoMoreInteractions(metrics); diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java index 5890773..ce781a4 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,14 +48,15 @@ import org.oran.smo.teiv.ingestion.validation.IngestionOperationValidatorFactory import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; import org.oran.smo.teiv.service.RelationshipMergeValidator; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import io.cloudevents.CloudEvent; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbService; +import org.oran.smo.teiv.service.TeivMetadataResolver; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; @@ -73,12 +74,12 @@ class DeleteTopologyProcessorTest { private CustomMetrics metrics; @Mock - private TiesDbService tiesDbService; + private TeivDbService teivDbService; @Mock private IngestionAuditLogger auditLogger; - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @BeforeAll static void setUpAll() throws SchemaLoaderException { @@ -89,9 +90,9 @@ class DeleteTopologyProcessorTest { @BeforeEach void setUp() { - tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), - new RelationshipMergeValidator()); - deleteTopologyProcessor = new DeleteTopologyProcessor(cloudEventParser, tiesDbService, tiesDbOperations, metrics, + teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator(), new TeivMetadataResolver()); + deleteTopologyProcessor = new DeleteTopologyProcessor(cloudEventParser, teivDbService, teivDbOperations, metrics, auditLogger); } @@ -105,10 +106,10 @@ class DeleteTopologyProcessorTest { ParsedCloudEventData parsedData = new ParsedCloudEventData(List.of(entity), List.of()); when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); - doThrow(new RuntimeException("Discard event by expected test behavior")).when(tiesDbService).execute(anyList()); + doThrow(new RuntimeException("Discard event by expected test behavior")).when(teivDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> deleteTopologyProcessor.process(event, anyString())); - verify(tiesDbService, times(1)).execute(anyList()); + verify(teivDbService, times(1)).execute(anyList()); verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), anyString()); @@ -120,7 +121,7 @@ class DeleteTopologyProcessorTest { when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); deleteTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumUnsuccessfullyParsedDeleteCloudEvents(); verifyNoMoreInteractions(metrics); diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java index 283e835..3b7e322 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ import org.oran.smo.teiv.ingestion.validation.IngestionOperationValidatorFactory import org.oran.smo.teiv.listener.audit.ExecutionStatus; import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; import org.oran.smo.teiv.service.RelationshipMergeValidator; -import org.oran.smo.teiv.service.TiesDbOperations; +import org.oran.smo.teiv.service.TeivDbOperations; import io.cloudevents.CloudEvent; @@ -56,7 +56,8 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbService; +import org.oran.smo.teiv.service.TeivMetadataResolver; import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.Entity; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; @@ -74,12 +75,12 @@ class MergeTopologyProcessorTest { private CustomMetrics metrics; @Mock - private TiesDbService tiesDbService; + private TeivDbService teivDbService; @Mock private IngestionAuditLogger auditLogger; - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @BeforeAll static void setUpAll() throws SchemaLoaderException { @@ -90,9 +91,9 @@ class MergeTopologyProcessorTest { @BeforeEach void setUp() { - tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), - new RelationshipMergeValidator()); - mergeTopologyProcessor = new MergeTopologyProcessor(cloudEventParser, metrics, tiesDbOperations, auditLogger); + teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator(), new TeivMetadataResolver()); + mergeTopologyProcessor = new MergeTopologyProcessor(cloudEventParser, metrics, teivDbOperations, auditLogger); } @Test @@ -105,10 +106,10 @@ class MergeTopologyProcessorTest { ParsedCloudEventData parsedData = new ParsedCloudEventData(List.of(entity), List.of()); when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); - doThrow(new RuntimeException("Discard event by expected test behavior")).when(tiesDbService).execute(anyList()); + doThrow(new RuntimeException("Discard event by expected test behavior")).when(teivDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> mergeTopologyProcessor.process(event, anyString())); - verify(tiesDbService, times(1)).execute(anyList()); + verify(teivDbService, times(1)).execute(anyList()); verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), anyString()); @@ -125,7 +126,7 @@ class MergeTopologyProcessorTest { when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(parsedData); mergeTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumSuccessfullyParsedMergeCloudEvents(); verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedMergeCloudEvents(); @@ -148,7 +149,7 @@ class MergeTopologyProcessorTest { when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(parsedData); mergeTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumSuccessfullyParsedMergeCloudEvents(); verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedMergeCloudEvents(); @@ -166,7 +167,7 @@ class MergeTopologyProcessorTest { when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); mergeTopologyProcessor.process(event, anyString()); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumUnsuccessfullyParsedMergeCloudEvents(); verifyNoMoreInteractions(metrics); diff --git a/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java b/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java index b4c45ea..92ea516 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,8 +65,8 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.schema.BidiDbNameMapper; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.service.TiesDbOperations; -import org.oran.smo.teiv.service.TiesDbService; +import org.oran.smo.teiv.service.TeivDbOperations; +import org.oran.smo.teiv.service.TeivDbService; @ExtendWith(MockitoExtension.class) class SourceEntityDeleteTopologyProcessorTest { @@ -80,10 +80,10 @@ class SourceEntityDeleteTopologyProcessorTest { private CustomMetrics metrics; @Mock - private TiesDbService tiesDbService; + private TeivDbService teivDbService; @Mock - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @Mock private IngestionAuditLogger auditLogger; @@ -92,8 +92,8 @@ class SourceEntityDeleteTopologyProcessorTest { @BeforeEach void setUp() { - sourceEntityDeleteTopologyProcessor = new SourceEntityDeleteTopologyProcessor(tiesDbService, new ObjectMapper(), - metrics, tiesDbOperations, auditLogger); + sourceEntityDeleteTopologyProcessor = new SourceEntityDeleteTopologyProcessor(teivDbService, new ObjectMapper(), + metrics, teivDbOperations, auditLogger); } @Test @@ -105,7 +105,7 @@ class SourceEntityDeleteTopologyProcessorTest { assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); // then mockedSchemaRegistry.verifyNoInteractions(); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents(); verifyNoMoreInteractions(metrics); @@ -124,7 +124,7 @@ class SourceEntityDeleteTopologyProcessorTest { assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); // then mockedSchemaRegistry.verifyNoInteractions(); - verifyNoInteractions(tiesDbService); + verifyNoInteractions(teivDbService); verify(metrics, times(1)).incrementNumReceivedCloudEventNotSupported(); verifyNoMoreInteractions(metrics); @@ -141,12 +141,12 @@ class SourceEntityDeleteTopologyProcessorTest { CloudEvent event = CloudEventTestUtil.getCloudEvent(EVENT_TYPE, "{\"type\":\"cmHandle\",\"value\":\"abc\"}"); mockedSchemaRegistry.when(SchemaRegistry::getEntityTypes).thenReturn(List.of(entityType)); - doThrow(new RuntimeException()).when(tiesDbService).execute(anyList()); + doThrow(new RuntimeException()).when(teivDbService).execute(anyList()); // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); // then mockedSchemaRegistry.verify(SchemaRegistry::getEntityTypes, times(1)); - verify(tiesDbService, times(1)).execute(anyList()); + verify(teivDbService, times(1)).execute(anyList()); verify(metrics, times(1)).incrementNumSuccessfullyParsedSourceEntityDeleteCloudEvents(); verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents(); @@ -175,9 +175,9 @@ class SourceEntityDeleteTopologyProcessorTest { OperationResult mockOperationResult = mock(OperationResult.class); EntityType gnbduFunction = EntityType.builder().name("GNBDUFunction").build(); when(SchemaRegistry.getEntityTypes()).thenReturn(List.of(gnbduFunction)); - when(tiesDbOperations.selectByCmHandleFormSourceIds(any(), anyString(), anyString())).thenReturn(List.of( + when(teivDbOperations.selectByCmHandleFormSourceIds(any(), anyString(), anyString())).thenReturn(List.of( "result1")); - when(tiesDbOperations.deleteEntity(any(), any(), anyString())).thenReturn(List.of(mockOperationResult)); + when(teivDbOperations.deleteEntity(any(), any(), anyString())).thenReturn(List.of(mockOperationResult)); doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocation) { @@ -187,14 +187,14 @@ class SourceEntityDeleteTopologyProcessorTest { }); return null; } - }).when(tiesDbService).execute(anyList()); + }).when(teivDbService).execute(anyList()); // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); // then mockedSchemaRegistry.verify(SchemaRegistry::getEntityTypes, times(1)); - verify(tiesDbService, atLeastOnce()).execute(anyList()); - verify(tiesDbOperations, atLeastOnce()).selectByCmHandleFormSourceIds(any(), anyString(), anyString()); - verify(tiesDbOperations, atLeastOnce()).deleteEntity(any(), any(), anyString()); + verify(teivDbService, atLeastOnce()).execute(anyList()); + verify(teivDbOperations, atLeastOnce()).selectByCmHandleFormSourceIds(any(), anyString(), anyString()); + verify(teivDbOperations, atLeastOnce()).deleteEntity(any(), any(), anyString()); verify(metrics, times(1)).incrementNumSuccessfullyParsedSourceEntityDeleteCloudEvents(); verify(metrics, times(1)).incrementNumSuccessfullyPersistedSourceEntityDeleteCloudEvents(); diff --git a/teiv/src/test/java/org/oran/smo/teiv/schema/MockSchemaLoader.java b/teiv/src/test/java/org/oran/smo/teiv/schema/MockSchemaLoader.java index 6692c52..b73998a 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/schema/MockSchemaLoader.java +++ b/teiv/src/test/java/org/oran/smo/teiv/schema/MockSchemaLoader.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,8 +36,7 @@ import static org.oran.smo.teiv.schema.DataType.DECIMAL; import static org.oran.smo.teiv.schema.DataType.GEOGRAPHIC; import static org.oran.smo.teiv.schema.DataType.INTEGER; import static org.oran.smo.teiv.schema.DataType.PRIMITIVE; -import static org.oran.smo.teiv.schema.DataType.TIMESTAMPTZ; -import static org.oran.smo.teiv.utils.TiesConstants.TEIV_DOMAIN; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DOMAIN; public class MockSchemaLoader extends SchemaLoader { @@ -150,7 +149,7 @@ public class MockSchemaLoader extends SchemaLoader { "src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql")); String line; while ((line = reader.readLine()) != null) { - if (line.startsWith("COPY ties_model." + tableName)) { + if (line.startsWith("COPY teiv_model." + tableName)) { while (!(line = reader.readLine()).startsWith("\\.")) { List l = List.of(line.split("\t")); modelInfo.add(l); @@ -171,7 +170,7 @@ public class MockSchemaLoader extends SchemaLoader { "src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql")); String line; while ((line = reader.readLine()) != null) { - if (line.startsWith("CREATE TABLE IF NOT EXISTS ties_data.\"" + tableName + "\"")) { + if (line.startsWith("CREATE TABLE IF NOT EXISTS teiv_data.\"" + tableName + "\"")) { while (!(line = reader.readLine()).startsWith(");")) { List l = List.of(line.trim().replace("\t\t\t", "\t").replaceAll("[\",]", "").split("\t")); String fieldName = l.get(0); @@ -179,7 +178,7 @@ public class MockSchemaLoader extends SchemaLoader { extractFieldName(dataFields, fieldName, dataType); } } - if (line.startsWith("ALTER TABLE ties_data.\"" + tableName + "\" ADD COLUMN IF NOT EXISTS")) { + if (line.startsWith("ALTER TABLE teiv_data.\"" + tableName + "\" ADD COLUMN IF NOT EXISTS")) { String[] str = line.trim().split("\\s+"); String fieldName = str[str.length - 2].replaceAll("\"", ""); String dataType = str[str.length - 1].replace(";", ""); @@ -201,7 +200,6 @@ public class MockSchemaLoader extends SchemaLoader { case "DECIMAL" -> dataFields.put(fieldName, DECIMAL); case "jsonb" -> dataFields.put(fieldName, CONTAINER); case "geography" -> dataFields.put(fieldName, GEOGRAPHIC); - case "TIMESTAMPTZ" -> dataFields.put(fieldName, TIMESTAMPTZ); case "BYTEA" -> dataFields.put(fieldName, BYTEA); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java b/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java index 6140f25..8f7e30f 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,16 +20,16 @@ */ package org.oran.smo.teiv.schema; -import static org.oran.smo.teiv.exposure.tiespath.refiner.AliasMapper.hashAlias; +import static org.oran.smo.teiv.exposure.teivpath.refiner.AliasMapper.hashAlias; import static org.oran.smo.teiv.schema.RelationshipDataLocation.A_SIDE; import static org.oran.smo.teiv.schema.RelationshipDataLocation.B_SIDE; import static org.oran.smo.teiv.schema.RelationshipDataLocation.RELATION; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN; import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.TEIV_DOMAIN; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DOMAIN; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA; import static org.jooq.impl.DSL.field; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -42,11 +42,12 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.jooq.JSONB; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exposure.spi.Module; class SchemaRegistryTest { @@ -87,7 +88,7 @@ class SchemaRegistryTest { assertEquals(expectedDomain, oamToRanModule.getDomain()); assertEquals(expectedIncludedModules, oamToRanModule.getIncludedModuleNames()); - assertThrows(TiesException.class, () -> SchemaRegistry.getModuleByName("invalid-module")); + assertThrows(TeivException.class, () -> SchemaRegistry.getModuleByName("invalid-module")); } @Test @@ -115,7 +116,7 @@ class SchemaRegistryTest { @Test void testGetModuleByDomainThrowsUnknownDomainException() { - assertThrows(TiesException.class, () -> SchemaRegistry.getModuleByDomain("throwError")); + assertThrows(TeivException.class, () -> SchemaRegistry.getModuleByDomain("throwError")); } //Entities @@ -166,7 +167,7 @@ class SchemaRegistryTest { //given EntityType oduFunction = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ODUFunction"); //then - assertEquals("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFunction.getTableName()); + assertEquals("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFunction.getTableName()); } @Test @@ -188,17 +189,20 @@ class SchemaRegistryTest { @Test void testGetFieldsForEntity() throws SchemaRegistryException { //given - EntityType oduFunction = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ODUFunction"); + EntityType OduFunction = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ODUFunction"); //then - assertEquals(Set.of(field("gNBDUId").as("o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), field("gNBId").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBId"), field("gNBIdLength").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBIdLength"), field("id").as( - "o-ran-smo-teiv-ran:ODUFunction.id"), field("CD_sourceIds").as( - "o-ran-smo-teiv-ran:ODUFunction.sourceIds"), field("CD_classifiers").as( - "o-ran-smo-teiv-ran:ODUFunction.classifiers"), field("CD_decorators").as( - "o-ran-smo-teiv-ran:ODUFunction.decorators"), field("dUpLMNId").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId")), - new HashSet<>(oduFunction.getAllFieldsWithId())); + assertEquals(Set.of(field("dUpLMNId", JSONB.class).as("o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId"), field( + "gNBDUId").as("o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), field("gNBId").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.gNBId"), field("gNBIdLength").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.gNBIdLength"), field("id").as( + "o-ran-smo-teiv-ran:ODUFunction.id"), field("CD_sourceIds").as( + "o-ran-smo-teiv-ran:ODUFunction.sourceIds"), field("CD_classifiers").as( + "o-ran-smo-teiv-ran:ODUFunction.classifiers"), field( + "CD_decorators").as( + "o-ran-smo-teiv-ran:ODUFunction.decorators"), field( + "metadata").as( + "o-ran-smo-teiv-ran:ODUFunction.metadata")), + new HashSet<>(OduFunction.getAllFieldsWithId())); } @Test @@ -325,9 +329,9 @@ class SchemaRegistryTest { @Test void testGetTableNameForRelation() throws SchemaRegistryException { //given - String expectedManyToMany = "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""; - String expectedOneToMany = "ties_data.\"o-ran-smo-teiv-ran_NRCellDU\""; - String expectedManyToOne = "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""; + String expectedManyToMany = "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""; + String expectedOneToMany = "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\""; + String expectedManyToOne = "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\""; //when RelationType manyToMany = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); @@ -434,24 +438,27 @@ class SchemaRegistryTest { RelationType antennamoduleServesAntennacapability = SchemaRegistry.getRelationTypeByModuleAndName( "o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); //then - assertEquals(Set.of(field(String.format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String + assertEquals(Set.of(field(String.format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String .format(QUOTED_STRING, "aSide_AntennaModule")).as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.aSide")), field(String - .format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( + .format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( QUOTED_STRING, "bSide_AntennaCapability")).as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.bSide")), - field(String.format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( + field(String.format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( QUOTED_STRING, "id")).as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.id")), field(String - .format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String + .format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String .format(QUOTED_STRING, "CD_sourceIds")).as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.sourceIds")), - field(String.format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( + field(String.format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( QUOTED_STRING, "CD_decorators")).as(hashAlias( "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.decorators")), - field(String.format(TIES_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( + field(String.format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( QUOTED_STRING, "CD_classifiers")).as(hashAlias( - "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.classifiers"))), + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.classifiers")), + field(String.format(TEIV_DATA, "CFC235E0404703D1E4454647DF8AAE2C193DB402") + "." + String.format( + QUOTED_STRING, "metadata")).as(hashAlias( + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY.metadata"))), new HashSet<>(antennamoduleServesAntennacapability.getAllFieldsWithId())); } @@ -473,7 +480,7 @@ class SchemaRegistryTest { @Test void getAttributeColumnsWithFilterTest() throws SchemaRegistryException { - Assertions.assertEquals(Map.of(field("ties_data.\"AntennaModule\".\"geo-location\"").as( + Assertions.assertEquals(Map.of(field("teiv_data.\"AntennaModule\".\"geo-location\"").as( "o-ran-smo-teiv-equipment:AntennaModule.attr.geo-location"), DataType.GEOGRAPHIC), SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModule") .getSpecificAttributeColumns(List.of("geo-location"))); diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java index be981a0..7431b90 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,21 +24,24 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; -import static org.oran.smo.teiv.utils.TiesTestConstants.KAFKA_RETRY_INTERVAL_10_MS; -import static org.oran.smo.teiv.utils.TiesTestConstants.SPRING_BOOT_SERVER_HOST; -import static org.oran.smo.teiv.utils.TiesTestConstants.SPRING_BOOT_SERVER_PORT; +import static org.oran.smo.teiv.utils.JooqTypeConverter.jsonbToMap; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivTestConstants.KAFKA_RETRY_INTERVAL_10_MS; +import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_HOST; +import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_PORT; import java.io.File; import java.time.Duration; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Base64; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; import io.cloudevents.CloudEvent; @@ -52,12 +55,15 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringSerializer; import org.awaitility.Awaitility; import org.jooq.DSLContext; +import org.jooq.JSONB; import org.jooq.Record; import org.jooq.Result; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; import org.oran.smo.teiv.config.KafkaConfig; @@ -70,6 +76,7 @@ import org.oran.smo.teiv.utils.EndToEndExpectedResults; import org.oran.smo.teiv.utils.KafkaTestExecutionListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; import org.springframework.kafka.core.DefaultKafkaProducerFactory; import org.springframework.kafka.core.KafkaAdmin; import org.springframework.kafka.test.EmbeddedKafkaBroker; @@ -80,9 +87,11 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestExecutionListeners; +import org.testcontainers.shaded.org.checkerframework.checker.nullness.qual.Nullable; @EmbeddedKafka @ActiveProfiles({ "test", "ingestion" }) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @SpringBootTest(properties = { SPRING_BOOT_SERVER_HOST, SPRING_BOOT_SERVER_PORT, KAFKA_RETRY_INTERVAL_10_MS, "kafka.topic.replicas:1", "kafka.topology-ingestion.consumer.concurrency:2", "data-catalog.enabled:true" }) @TestExecutionListeners(listeners = KafkaTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) @@ -91,7 +100,12 @@ public class EndToEndDbTest { private AppInit appInit; - static Producer producer; + private DefaultKafkaProducerFactory factory; + + private Producer producer; + + @Autowired + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; private static final String TEST_EVENT_FOLDER = "src/test/resources/cloudeventdata/end-to-end/"; private static final String EXPECTED_RESULTS_FOLDER = "src/test/resources/cloudeventdata/end-to-end/expected-results/"; @@ -130,6 +144,12 @@ public class EndToEndDbTest { registry.add("spring.datasource.write.password", () -> postgresqlContainer.getPassword()); } + private static final String FIRST_DISCOVERED = "firstDiscovered"; + private static final String LAST_MODIFIED = "lastModified"; + private static final String RELIABILITY_INDICATOR = "reliabilityIndicator"; + + private OffsetDateTime testStartTime; + @BeforeAll static void beforeAll() { TestPostgresqlContainer.loadData(); @@ -138,20 +158,29 @@ public class EndToEndDbTest { @BeforeEach void setupEach() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), writeDataDslContext); appInit = new AppInit(dependentServiceAvailabilityKafka, kafkaTopicService, listenerStarter); appInit.startUpHandler(); - producer = new DefaultKafkaProducerFactory<>(new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker)), - new StringSerializer(), new CloudEventSerializer()).createProducer(); + factory = new DefaultKafkaProducerFactory<>(KafkaTestUtils.producerProps(embeddedKafkaBroker), + new StringSerializer(), new CloudEventSerializer()); + producer = factory.createProducer(); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); } @AfterEach - void tearDown() { - embeddedKafkaBroker.destroy(); + void cleanupEach() { + factory.destroy(); + } + + @AfterAll + void cleanupAll() { + kafkaListenerEndpointRegistry.stop(); + Admin adminClient = Admin.create(kafkaAdmin.getConfigurationProperties()); + adminClient.close(); } - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) @Test + @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testEndToEndDb() { final String CREATE_ONE_TO_ONE_PATH = TEST_EVENT_FOLDER + "ce-create-one-to-one.json"; final String CREATE_MANY_TO_MANY_PATH = TEST_EVENT_FOLDER + "ce-create-many-to-many.json"; @@ -159,6 +188,8 @@ public class EndToEndDbTest { final String CREATE_INFERRED_ENTITIES = TEST_EVENT_FOLDER + "ce-create-inferred.json"; final String CREATE_GEOLOCATION_PATH = TEST_EVENT_FOLDER + "ce-create-geo-location.json"; final String MERGE_ONE_TO_MANY_PATH = TEST_EVENT_FOLDER + "ce-merge-one-to-many.json"; + final String MERGE_ONE_TO_MANY3_PATH = TEST_EVENT_FOLDER + "ce-merge-one-to-many3.json"; + final String MERGE_MANY_TO_MANY_PATH = TEST_EVENT_FOLDER + "ce-merge-many-to-many.json"; final String DELETE_MANY_TO_MANY_PATH = TEST_EVENT_FOLDER + "ce-delete-many-to-many.json"; final String DELETE_ONE_TO_ONE_PATH = TEST_EVENT_FOLDER + "ce-delete-one-to-one.json"; final String DELETE_CMHANDLE_PATH = TEST_EVENT_FOLDER + "ce-source-entity-delete-cm-handle.json"; @@ -169,19 +200,23 @@ public class EndToEndDbTest { final String EXP_CREATE_INFERRED_ENTITIES = EXPECTED_RESULTS_FOLDER + "exp-create-inferred.json"; final String EXP_CREATE_GEOLOCATION_PATH = EXPECTED_RESULTS_FOLDER + "exp-create-geo-location.json"; final String EXP_MERGE_ONE_TO_MANY_PATH = EXPECTED_RESULTS_FOLDER + "exp-merge-one-to-many.json"; + final String EXP_MERGE_ONE_TO_MANY3_PATH = EXPECTED_RESULTS_FOLDER + "exp-merge-one-to-many3.json"; + final String EXP_MERGE_MANY_TO_MANY_PATH = EXPECTED_RESULTS_FOLDER + "exp-merge-many-to-many.json"; final String EXP_DELETE_ONE_TO_ONE_PATH = EXPECTED_RESULTS_FOLDER + "exp-delete-one-to-one.json"; final String NOT_EXP_DELETE_ONE_TO_ONE_PATH = EXPECTED_RESULTS_FOLDER + "not-exp-delete-one-to-one.json"; final String NOT_EXP_DELETE_MANY_TO_MANY_PATH = EXPECTED_RESULTS_FOLDER + "not-exp-delete-many-to-many.json"; final String NOT_EXP_DELETE_CMHANDLE_PATH = EXPECTED_RESULTS_FOLDER + "not-exp-source-entity-delete-cm-handle.json"; + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); validateReceivedCloudEventMetrics(0, 0, 0, 0); sendEventFromFile(CREATE_ONE_TO_ONE_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_ONE_TO_ONE_PATH); assertDbContainsExpectedValues(expected); validateReceivedCloudEventMetrics(1, 0, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_MANY_TO_MANY_PATH); validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_MANY_TO_MANY_PATH); @@ -189,68 +224,94 @@ public class EndToEndDbTest { validateReceivedCloudEventMetrics(2, 0, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); + //Sends the same entities and relationships as previous CE, but with different entity attributes. Relationships same. + sendEventFromFile(MERGE_MANY_TO_MANY_PATH); + validateWithTimeout(15, () -> { + EndToEndExpectedResults expected = getExpectedResults(EXP_MERGE_MANY_TO_MANY_PATH); + assertDbContainsExpectedValues(expected); + validateReceivedCloudEventMetrics(2, 1, 0, 0); + }); + + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_GEOLOCATION_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_GEOLOCATION_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(3, 0, 0, 0); + validateReceivedCloudEventMetrics(3, 1, 0, 0); }); - sendEventFromFile(MERGE_ONE_TO_MANY_PATH); - + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); + sendEventFromFile(MERGE_ONE_TO_MANY_PATH);//This sends new entities even though it's a merge event validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_MERGE_ONE_TO_MANY_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(3, 1, 0, 0); + validateReceivedCloudEventMetrics(3, 2, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); + //Sends the same entities and relationships as previous CE, but with different entity attributes. Relationships same. + sendEventFromFile(MERGE_ONE_TO_MANY3_PATH); + validateWithTimeout(15, () -> { + EndToEndExpectedResults expected = getExpectedResults(EXP_MERGE_ONE_TO_MANY3_PATH); + assertDbContainsExpectedValues(expected); + validateReceivedCloudEventMetrics(3, 3, 0, 0); + }); + + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_SECOND_CASE_PATH); validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_SECOND_CASE_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(4, 1, 0, 0); + validateReceivedCloudEventMetrics(4, 3, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_INFERRED_ENTITIES); - validateWithTimeout(20, () -> { + + validateWithTimeout(25, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_INFERRED_ENTITIES); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(5, 1, 0, 0); + validateReceivedCloudEventMetrics(5, 3, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(CREATE_GEOLOCATION_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_GEOLOCATION_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(6, 1, 0, 0); + validateReceivedCloudEventMetrics(6, 3, 0, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(DELETE_MANY_TO_MANY_PATH); validateWithTimeout(15, () -> { EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_MANY_TO_MANY_PATH); assertDbNotContainsExpectedValues(notExpected); - validateReceivedCloudEventMetrics(6, 1, 1, 0); + validateReceivedCloudEventMetrics(6, 3, 1, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(DELETE_ONE_TO_ONE_PATH); validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_DELETE_ONE_TO_ONE_PATH); assertDbContainsExpectedValues(expected); EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_ONE_TO_ONE_PATH); assertDbNotContainsExpectedValues(notExpected); - validateReceivedCloudEventMetrics(6, 1, 2, 0); + validateReceivedCloudEventMetrics(6, 3, 2, 0); }); + testStartTime = OffsetDateTime.now(ZoneOffset.UTC); sendEventFromFile(DELETE_CMHANDLE_PATH); validateWithTimeout(15, () -> { EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_CMHANDLE_PATH); - assertDbContainsExpectedValues(notExpected); - validateReceivedCloudEventMetrics(6, 1, 2, 1); + assertDbNotContainsExpectedValues(notExpected); + validateReceivedCloudEventMetrics(6, 3, 2, 1); }); } - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) @Test + @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testTopologyIngestionConcurrentListeners() { final String COMMON_EVENT_FOLDER = "src/test/resources/cloudeventdata/common/"; @@ -281,7 +342,7 @@ public class EndToEndDbTest { cloudEventsForPartition2, cloudEventsForPartition3); produceKafkaMessages(cloudEventPathLists, List.of(0, 1, 2, 3)); - validateWithTimeout(10, () -> { + validateWithTimeout(20, () -> { assertEquals(2, assertDoesNotThrow(() -> getActiveConsumers(kafkaConfig.getTopologyIngestion().getGroupId()))); validateReceivedCloudEventMetrics(15, 2, 5, 1); validatePersistedCloudEventMetrics(8, 2, 5, 1); @@ -316,42 +377,127 @@ public class EndToEndDbTest { }); } - private void assertDatabaseContainsValues(final String table, final Map attributes) { - Result results = TiesDbServiceContainerizedTest.selectAllRowsFromTable(writeDataDslContext, - "ties_data.\"" + table + "\""); - boolean containsExpectedData = results.stream().anyMatch(row -> attributes.entrySet().stream().allMatch( - expectedField -> { - if (expectedField.getValue() != null) { - if (row.get(expectedField.getKey()) == null) { + private void assertDatabaseContainsValues(final String table, final Map expectedFields) { + Result results = TeivDbServiceContainerizedTest.selectAllRowsFromTable(writeDataDslContext, + "teiv_data.\"" + table + "\""); + AtomicReference debugInfo = new AtomicReference<>(""); + AtomicReference targetRow = new AtomicReference<>(); + boolean containsExpectedRow = results.stream().anyMatch(row -> { + if (Objects.equals(row.get("id"), expectedFields.get("id"))) { + targetRow.set(row); + return true; + } + return false; + }); + assertTrue(containsExpectedRow, "Row not found with id = " + expectedFields.get("id")); + boolean containsExpectedData = expectedFields.entrySet().stream().allMatch(expectedField -> { + final String expectedFieldName = expectedField.getKey(); + @Nullable Object actualFieldValue = targetRow.get().get(expectedFieldName); + if (expectedField.getValue() != null) { + if (actualFieldValue instanceof byte[]) { + String hashString = bytesToHex((byte[]) Objects.requireNonNull(actualFieldValue)); + if (!Objects.equals(expectedField.getValue().toString(), hashString)) { + debugInfo.set(expectedField.getKey() + " not as expected for " + targetRow.get().get("id")); + return false; + } else { + return true; + } + } + if (expectedField.getKey().contains("metadata")) {//Will be true for the metadata of the entity, and of each relation + Map expectedMetadata = jsonbToMap((JSONB) expectedField.getValue()); + if (actualFieldValue == null) { + debugInfo.set(expectedFieldName + " of " + expectedFields.get("id") + " is null"); + return false; + } + Map actualMetadata = jsonbToMap((JSONB) Objects.requireNonNull(actualFieldValue)); + if (expectedMetadata.containsKey(RELIABILITY_INDICATOR)) { + if (!Objects.equals(expectedMetadata.get(RELIABILITY_INDICATOR), actualMetadata.get( + RELIABILITY_INDICATOR))) { + debugInfo.set(RELIABILITY_INDICATOR + " of " + expectedField.getKey() + " of " + targetRow.get() + .get("id") + " should be " + expectedMetadata.get( + RELIABILITY_INDICATOR) + " but it is " + actualMetadata.get( + RELIABILITY_INDICATOR)); return false; } - if (row.get(expectedField.getKey()) instanceof byte[]) { - String hashString = bytesToHex((byte[]) Objects.requireNonNull(row.get(expectedField - .getKey()))); - return Objects.equals(expectedField.getValue().toString(), hashString); - } - return Objects.equals(expectedField.getValue().toString(), row.get(expectedField.getKey()) - .toString()); } - return row.get(expectedField.getKey()) == null; + if (expectedMetadata.containsKey(FIRST_DISCOVERED)) { + return validateMetadataTimestamp(FIRST_DISCOVERED, expectedField, actualMetadata, debugInfo, + targetRow, expectedMetadata); + } + if (expectedMetadata.containsKey(LAST_MODIFIED)) { + return validateMetadataTimestamp(LAST_MODIFIED, expectedField, actualMetadata, debugInfo, targetRow, + expectedMetadata); + } + return true; + } else { + if (actualFieldValue == null || !Objects.equals(expectedField.getValue().toString(), actualFieldValue + .toString())) { + debugInfo.set(targetRow.get().get("id") + " " + expectedField + .getKey() + " should be " + expectedField.getValue() + " but it is " + actualFieldValue); + return false; + } else { + return true; + } + } + } + if (actualFieldValue != null) { + debugInfo.set(expectedFieldName + " should have been null."); + } + return actualFieldValue == null; + }); + assertTrue(containsExpectedData, getAsserDbValuesFailureMessage(table, expectedFields, results, debugInfo.get())); + } - })); - assertTrue(containsExpectedData, getAsserDbValuesFailureMessage(table, attributes, results)); + private boolean validateMetadataTimestamp(String timestampKeyToVerify, Map.Entry expectedField, + Map actualMetadata, AtomicReference debugInfo, AtomicReference targetRow, + Map expectedMetadata) { + Object actualtimestampObject = actualMetadata.get(timestampKeyToVerify); + if (actualtimestampObject == null) { + debugInfo.set(targetRow.get().get("id") + ":\n" + timestampKeyToVerify + " should not be null"); + return false; + } + OffsetDateTime actualTimestamp = OffsetDateTime.parse(actualtimestampObject.toString()); + String expectedTimestamp = expectedMetadata.get(timestampKeyToVerify).toString(); + if (expectedTimestamp.contains("AFTER TEST START TIME")) { + if (actualTimestamp.isBefore(testStartTime)) { + debugInfo.set(targetRow.get().get( + "id") + ":\n" + timestampKeyToVerify + " " + actualTimestamp + " should be after " + testStartTime + " in " + expectedField + .getKey()); + return false; + } + } else if (expectedTimestamp.contains("BEFORE TEST START TIME")) { + if (actualTimestamp.isAfter(testStartTime)) { + debugInfo.set(targetRow.get().get( + "id") + ": " + timestampKeyToVerify + " " + actualTimestamp + " should be before " + testStartTime + " in " + expectedField + .getKey()); + return false; + } + } else { + if (!actualTimestamp.isEqual(OffsetDateTime.parse("2025-01-08T10:40:36.46156500Z")) && !actualTimestamp.isEqual( + OffsetDateTime.parse("2025-01-09T10:40:36.461565Z"))) { + debugInfo.set(targetRow.get().get( + "id") + ": " + timestampKeyToVerify + " " + actualTimestamp + " should be " + "2025-01-08T10:40:36.46156500Z" + " in " + expectedField + .getKey()); + return false; + } + } + return true; } private String bytesToHex(byte[] hashBytes) { return Base64.getEncoder().encodeToString(hashBytes); } - private String getAsserDbValuesFailureMessage(String table, Map attributes, Result results) { + private String getAsserDbValuesFailureMessage(String table, Map attributes, Result results, + String extraInfo) { return String.format( "Database table \"%s\" does not contain expected data, but it should.\nExpected row:\n" + attributes + "\nActual data (all rows):\n" + results - .formatCSV(), table); + .formatCSV() + "\n%s\n", table, extraInfo); } private void assertDatabaseDoesNotContainRecord(final String table, final String id) { - Result results = TiesDbServiceContainerizedTest.selectAllRowsFromTable(writeDataDslContext, - "ties_data.\"" + table + "\""); + Result results = TeivDbServiceContainerizedTest.selectAllRowsFromTable(writeDataDslContext, + "teiv_data.\"" + table + "\""); if (results.isNotEmpty()) { boolean containsRecord = results.stream().map(row -> row.get("id").toString()).anyMatch(id::equals); assertFalse(containsRecord, String.format("Database table \"%s\" contains record: \"%s\", but it should not.", diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/KafkaTopicServiceTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/KafkaTopicServiceTest.java index bcdc135..d7f447e 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/KafkaTopicServiceTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/KafkaTopicServiceTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,6 @@ import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.oran.smo.teiv.startup.SchemaHandler; -import org.oran.smo.teiv.utils.KafkaTestExecutionListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; @@ -63,13 +62,11 @@ import org.springframework.test.context.ActiveProfiles; import lombok.Getter; import org.oran.smo.teiv.service.kafka.KafkaTopicService; -import org.springframework.test.context.TestExecutionListeners; @Slf4j @EmbeddedKafka @ActiveProfiles({ "test", "ingestion" }) @SpringBootTest -@TestExecutionListeners(listeners = KafkaTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) class KafkaTopicServiceTest { @Value("${spring.embedded.kafka.brokers}") @Getter @@ -98,6 +95,8 @@ class KafkaTopicServiceTest { adminClient.deleteTopics(listTopicsResult.names().get()); } catch (InterruptedException | ExecutionException e) { log.info("Error deleting topics", e.getMessage()); + } finally { + adminClient.close(); } } @@ -135,7 +134,6 @@ class KafkaTopicServiceTest { @Test @DirtiesContext(methodMode = MethodMode.BEFORE_METHOD) void test_isTopicCreated_ExecutionException() throws Exception { - Node controller = new Node(0, "localhost", 8121); List brokers = Arrays.asList(controller, new Node(1, "localhost", 8122), new Node(2, "localhost", 8123)); Admin mockedAdminClient = new MockAdminClient(brokers, controller); @@ -159,6 +157,8 @@ class KafkaTopicServiceTest { Mockito.reset(spiedAdminClient, topicListResult, kafkaFutures, spiedTopicService); mockedStaticAdminClient.close(); + mockedAdminClient.close(); + spiedAdminClient.close(); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java similarity index 81% rename from teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java rename to teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java index a188caf..a5f7cbb 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.oran.smo.teiv.service.models.OperationResult.ENTITY_CATEGORY; import static org.oran.smo.teiv.service.models.OperationResult.RELATIONSHIP_CATEGORY; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -66,7 +66,7 @@ import io.cloudevents.CloudEvent; import org.oran.smo.teiv.db.TestPostgresqlContainer; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.ingestion.DeadlockRetryPolicy; import org.oran.smo.teiv.ingestion.validation.IngestionOperationValidatorFactory; import org.oran.smo.teiv.ingestion.validation.MaximumCardinalityViolationException; @@ -87,15 +87,22 @@ import org.oran.smo.teiv.utils.JooqTypeConverter; @Configuration @SpringBootTest @ActiveProfiles({ "test", "ingestion" }) -class TiesDbOperationResultsTest { +class TeivDbOperationResultsTest { private static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); - private static TiesDbService tiesDbService; - private static TiesDbOperations tiesDbOperations; + private static TeivDbService teivDbService; + private static TeivDbOperations teivDbOperations; private static DSLContext dslContext; private static String VALIDATE_MANY_TO_ONE_DIR = "src/test/resources/cloudeventdata/validation/many-to-one/"; private static String VALIDATE_ONE_TO_MANY_DIR = "src/test/resources/cloudeventdata/validation/one-to-many/"; private static String VALIDATE_ONE_TO_ONE_DIR = "src/test/resources/cloudeventdata/validation/one-to-one/"; - private static String updatedTimeColumnName = "updated_time"; + private static EntityType entityTypeMe; + private static EntityType entityTypeORU; + private static EntityType entityTypeAntennMod; + private static EntityType entityTypeAntennModLongName; + private static EntityType entityTypeAntennCap; + private static RelationType relTypeMeManagesORU; + private static RelationType relTypeantennServesAntennCap; + private static RelationType relTypeAntennModRealisedByAntennaModLongName; @Autowired CloudEventParser cloudEventParser; @@ -108,17 +115,33 @@ class TiesDbOperationResultsTest { String url = postgresqlContainer.getJdbcUrl(); DataSource ds = DataSourceBuilder.create().url(url).username("test").password("test").build(); dslContext = DSL.using(ds, SQLDialect.POSTGRES); - tiesDbService = new TiesDbService(dslContext, dslContext, deadlockRetryPolicy); - tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), - new RelationshipMergeValidator()); + teivDbService = new TeivDbService(dslContext, dslContext, deadlockRetryPolicy); + teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator(), new TeivMetadataResolver()); TestPostgresqlContainer.loadIngestionTestData(); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); } @BeforeEach - public void deleteAll() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), dslContext); + public void deleteAllAndMakeTypes() { + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), dslContext); + try { + entityTypeMe = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"); + entityTypeORU = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ORUFunction"); + entityTypeAntennMod = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModule"); + entityTypeAntennModLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); + entityTypeAntennCap = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapability"); + relTypeMeManagesORU = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION"); + relTypeantennServesAntennCap = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); + relTypeAntennModRealisedByAntennaModLongName = SchemaRegistry.getRelationTypeByModuleAndName( + "o-ran-smo-teiv-equipment", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); + } catch (SchemaRegistryException e) { + throw new RuntimeException(e); + } } @Test @@ -126,7 +149,7 @@ class TiesDbOperationResultsTest { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = assertDoesNotThrow(() -> tiesDbOperations + List mergeResult = assertDoesNotThrow(() -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1")); assertEquals(3, mergeResult.size()); @@ -149,11 +172,10 @@ class TiesDbOperationResultsTest { void testDeleteEntityById() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "managed_element_entity_id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); // Delete operation - expected to succeed - List deleteResultMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteResultMatch = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "managed_element_entity_id1"); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); @@ -162,7 +184,7 @@ class TiesDbOperationResultsTest { "The list should contain the delete operation result with id: 'managed_element_entity_id1'"); // Delete operation with the same EIID - expected to fail - List deleteResultNoMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteResultNoMatch = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "managed_element_entity_id1"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); @@ -172,14 +194,16 @@ class TiesDbOperationResultsTest { void testDeleteOneToOneByRelationId() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\"", managedElementEntity, - updatedTimeColumnName); + EntityType entityTypeMeLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"); + teivDbOperations.merge(dslContext, entityTypeMeLongName, managedElementEntity); Map nrCellDuEntity = new HashMap<>(); nrCellDuEntity.put("id", "nrcelldu-id1"); nrCellDuEntity.put("020335B0F627C169E24167748C38FE756FB34AE2", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"", nrCellDuEntity, - updatedTimeColumnName); + EntityType entityTypeNrCellDuLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"); + teivDbOperations.merge(dslContext, entityTypeNrCellDuLongName, nrCellDuEntity); Map meToNrcellduRelation = new HashMap<>(); meToNrcellduRelation.put("id", "me-id1"); @@ -187,11 +211,10 @@ class TiesDbOperationResultsTest { meToNrcellduRelation.put("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "eiid1"); meToNrcellduRelation.put("REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\"", meToNrcellduRelation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMeLongName, meToNrcellduRelation); // Delete operation for aSide - expected to succeed - Optional deleteASideResultMatch = tiesDbOperations.deleteRelationFromEntityTableByRelationId( + Optional deleteASideResultMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId( dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); @@ -201,16 +224,16 @@ class TiesDbOperationResultsTest { "The delete operation result should be present for: 'eiid1'"); // Delete operation with the same EIID - expected to fail - Optional deleteResultNoMatch = tiesDbOperations.deleteRelationFromEntityTableByRelationId( + Optional deleteResultNoMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId( dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); - Result nrcellduRows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); - Result managedElementRows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); + Result nrcellduRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); + Result managedElementRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); assertEquals("me-id1", managedElementRows.get(0).get("id")); assertEquals("nrcelldu-id1", nrcellduRows.get(0).get("id")); assertNull(managedElementRows.get(0).get("REL_FK_used-nrCellDu")); @@ -223,26 +246,23 @@ class TiesDbOperationResultsTest { void testDeleteOneToManyByManySideEntityId() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); Map oruFunctionEntity = new HashMap<>(); oruFunctionEntity.put("id", "oru-id1"); oruFunctionEntity.put("oruId", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", oruFunctionEntity, - updatedTimeColumnName); - - Map meToEnodeBFuncRelation = new HashMap<>(); - meToEnodeBFuncRelation.put("id", "oru-id1"); - meToEnodeBFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); - meToEnodeBFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid1"); - meToEnodeBFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List.of( + teivDbOperations.merge(dslContext, entityTypeORU, oruFunctionEntity); + + Map meToORUFuncRelation = new HashMap<>(); + meToORUFuncRelation.put("id", "oru-id1"); + meToORUFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); + meToORUFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid1"); + meToORUFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", meToEnodeBFuncRelation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, relTypeMeManagesORU, meToORUFuncRelation); // Delete operation with existing relationship - List deleteResultMatch = tiesDbOperations.deleteRelationshipByManySideEntityId(dslContext, + List deleteResultMatch = teivDbOperations.deleteRelationshipByManySideEntityId(dslContext, "oru-id1", "id", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_ORUFUNCTION")); @@ -252,7 +272,7 @@ class TiesDbOperationResultsTest { "The list should contain the delete operation result with id: 'eiid1'"); // Delete operation with the same entity ID - expected to return an empty list - List deleteResultNoMatch = tiesDbOperations.deleteRelationshipByManySideEntityId(dslContext, + List deleteResultNoMatch = teivDbOperations.deleteRelationshipByManySideEntityId(dslContext, "oru-id1", "id", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_ORUFUNCTION")); @@ -264,36 +284,32 @@ class TiesDbOperationResultsTest { void testDeleteOneToManyByOneSideEntityId() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); - - Map meToEnodeBFuncRelation1 = new HashMap<>(); - meToEnodeBFuncRelation1.put("id", "oru-id1"); - meToEnodeBFuncRelation1.put("REL_FK_managed-by-managedElement", "me-id1"); - meToEnodeBFuncRelation1.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid1"); - meToEnodeBFuncRelation1.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List - .of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", meToEnodeBFuncRelation1, - updatedTimeColumnName); - Map meToEnodeBFuncRelation2 = new HashMap<>(); - meToEnodeBFuncRelation2.put("id", "oru-id2"); - meToEnodeBFuncRelation2.put("REL_FK_managed-by-managedElement", "me-id1"); - meToEnodeBFuncRelation2.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid2"); - meToEnodeBFuncRelation2.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List - .of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", meToEnodeBFuncRelation2, - updatedTimeColumnName); - Map meToEnodeBFuncRelation3 = new HashMap<>(); - meToEnodeBFuncRelation3.put("id", "oru-id3"); - meToEnodeBFuncRelation3.put("REL_FK_managed-by-managedElement", "me-id1"); - meToEnodeBFuncRelation3.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid3"); - meToEnodeBFuncRelation3.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List - .of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", meToEnodeBFuncRelation3, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); + + Map meToORUFuncRelation1 = new HashMap<>(); + meToORUFuncRelation1.put("id", "oru-id1"); + meToORUFuncRelation1.put("REL_FK_managed-by-managedElement", "me-id1"); + meToORUFuncRelation1.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid1"); + meToORUFuncRelation1.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List.of( + "fdn1", "cmHandleId1"))); + teivDbOperations.merge(dslContext, relTypeMeManagesORU, meToORUFuncRelation1); + Map meToORUFuncRelation2 = new HashMap<>(); + meToORUFuncRelation2.put("id", "oru-id2"); + meToORUFuncRelation2.put("REL_FK_managed-by-managedElement", "me-id1"); + meToORUFuncRelation2.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid2"); + meToORUFuncRelation2.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List.of( + "fdn1", "cmHandleId1"))); + teivDbOperations.merge(dslContext, relTypeMeManagesORU, meToORUFuncRelation2); + Map meToORUFuncRelation3 = new HashMap<>(); + meToORUFuncRelation3.put("id", "oru-id3"); + meToORUFuncRelation3.put("REL_FK_managed-by-managedElement", "me-id1"); + meToORUFuncRelation3.put("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION", "eiid3"); + meToORUFuncRelation3.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION", JooqTypeConverter.toJsonb(List.of( + "fdn1", "cmHandleId1"))); + teivDbOperations.merge(dslContext, relTypeMeManagesORU, meToORUFuncRelation3); // Delete operation for me-id1 - List deleteResultMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteResultMatch = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); @@ -313,8 +329,8 @@ class TiesDbOperationResultsTest { "The list should contain the delete operation result with id: 'eiid3'"); // Verify all related entities have their relationships deleted - Result rows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\""); + Result rows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"o-ran-smo-teiv-ran_ORUFunction\""); assertEquals(3, rows.size()); for (Record row : rows) { assertNull(row.get("REL_FK_managed-by-managedElement"), @@ -348,39 +364,34 @@ class TiesDbOperationResultsTest { rel2.put("aSide_AntennaModule", "antennamodule_id1"); rel2.put("bSide_AntennaCapability", "antennacapability_id2"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", antennaModule1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", antennaCapability1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", antennaCapability2, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", rel1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", rel2, - updatedTimeColumnName); - - Result row1 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); + teivDbOperations.merge(dslContext, entityTypeAntennMod, antennaModule1); + teivDbOperations.merge(dslContext, entityTypeAntennCap, antennaCapability1); + teivDbOperations.merge(dslContext, entityTypeAntennCap, antennaCapability2); + teivDbOperations.merge(dslContext, relTypeantennServesAntennCap, rel1); + teivDbOperations.merge(dslContext, relTypeantennServesAntennCap, rel2); + + Result row1 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(1, row1.size()); - Result row2 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); + Result row2 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(2, row2.size()); - Result row3 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); + Result row3 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(2, row3.size()); RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); // Test deletion of a relationship by ID (expected success) - Optional deleteResultMatch = tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, + Optional deleteResultMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, relType, "rel_id1"); assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); assertEquals(OperationResult.builder().id("rel_id1").type("ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category( RELATIONSHIP_CATEGORY).build(), deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) - Optional deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, + Optional deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, relType, "rel_id1"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should not return a present Optional"); } @@ -409,30 +420,25 @@ class TiesDbOperationResultsTest { rel2.put("aSide_AntennaModule", "antennamodule_id1"); rel2.put("bSide_AntennaCapability", "antennacapability_id2"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", antennaModule1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", antennaCapability1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", antennaCapability2, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", rel1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", rel2, - updatedTimeColumnName); - - assertEquals(1, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"").size(), "Expected one AntennaModule record"); - assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"").size(), "Expected two AntennaCapability records"); - assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"").size(), + teivDbOperations.merge(dslContext, entityTypeAntennMod, antennaModule1); + teivDbOperations.merge(dslContext, entityTypeAntennCap, antennaCapability1); + teivDbOperations.merge(dslContext, entityTypeAntennCap, antennaCapability2); + teivDbOperations.merge(dslContext, relTypeantennServesAntennCap, rel1); + teivDbOperations.merge(dslContext, relTypeantennServesAntennCap, rel2); + + assertEquals(1, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\"").size(), "Expected one AntennaModule record"); + assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\"").size(), "Expected two AntennaCapability records"); + assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"").size(), "Expected two ANTENNAMODULE_SERVES_ANTENNACAPABILITY relations"); RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); // Test deletion of relations by entity ID (expected to delete two relations) - List deleteResultMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, + List deleteResultMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id1").type( @@ -445,7 +451,7 @@ class TiesDbOperationResultsTest { // Test deletion of relations by the same entity ID again (expected to find no // relations to delete) - List deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, + List deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); @@ -481,27 +487,23 @@ class TiesDbOperationResultsTest { rel2.put("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "module_id2"); rel2.put("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E", "module_id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"", antennaModule1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"", antennaModule2, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"", rel1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"", rel2, - updatedTimeColumnName); - - Result row1 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\""); + teivDbOperations.merge(dslContext, entityTypeAntennModLongName, antennaModule1); + teivDbOperations.merge(dslContext, entityTypeAntennModLongName, antennaModule2); + teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel1); + teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2); + + Result row1 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\""); assertEquals(2, row1.size()); - Result row2 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\""); + Result row2 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\""); assertEquals(2, row2.size()); RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); // Test deletion of a relationship by ID (expected success) - Optional deleteResultMatch = tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, + Optional deleteResultMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, antennaRelType1, "rel_id1"); assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); @@ -510,7 +512,7 @@ class TiesDbOperationResultsTest { deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) - Optional deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, + Optional deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext, antennaRelType1, "rel_id1"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should not return a present Optional"); @@ -546,26 +548,22 @@ class TiesDbOperationResultsTest { rel2.put("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "module_id2"); rel2.put("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E", "module_id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"", antennaModule1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"", antennaModule2, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"", rel1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"", rel2, - updatedTimeColumnName); - - assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"").size(), "Expected two AntennaModule records"); - assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"").size(), + teivDbOperations.merge(dslContext, entityTypeAntennModLongName, antennaModule1); + teivDbOperations.merge(dslContext, entityTypeAntennModLongName, antennaModule2); + teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel1); + teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2); + + assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"").size(), "Expected two AntennaModule records"); + assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\"").size(), "Expected two ANTENNAMODULE_REALISED_BY_ANTENNAMODULE relations"); RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"); // Test deletion of relations by entity ID (expected to delete two relations) - List deleteResultMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, + List deleteResultMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); @@ -579,7 +577,7 @@ class TiesDbOperationResultsTest { // Test deletion of relations by the same entity ID again (expected to find no // relations to delete) - List deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, + List deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"); assertTrue(deleteResultNoMatch.isEmpty(), @@ -594,7 +592,7 @@ class TiesDbOperationResultsTest { // Merge entities and relationship ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(25, mergeResult.size()); } @@ -606,42 +604,42 @@ class TiesDbOperationResultsTest { // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(25, mergeResult.size()); // Entity with One_To_One relationship - List deleteEntityResult1 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"), "ManagedElement_3"); assertEquals(2, deleteEntityResult1.size()); // Entity with One_To_Many relationship - List deleteEntityResult2 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), "ODUFunction_1"); assertEquals(2, deleteEntityResult2.size()); // Entity and Many_To_One relationship - List deleteEntityResult3 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"), "LTESectorCarrier_id1"); assertEquals(2, deleteEntityResult3.size()); // Entity with Many_To_Many relationship - List deleteEntityResult4 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_7"); assertEquals(2, deleteEntityResult4.size()); // Entity with One_To_Many relationship ConnectingSameEntity - List deleteEntityResult5 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_5"); assertEquals(2, deleteEntityResult5.size()); // Entity with One_To_One relationship ConnectingSameEntity - List deleteEntityResult6 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_1"); assertEquals(2, deleteEntityResult6.size()); @@ -654,49 +652,49 @@ class TiesDbOperationResultsTest { // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(25, mergeResult.size()); // Entity with One_To_One relationship - List deleteEntityResult1 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_2"); assertEquals(2, deleteEntityResult1.size()); // Entity with One_To_Many relationship - List deleteEntityResult2 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_1"); assertEquals(2, deleteEntityResult2.size()); // Entity with Many_To_One relationship - List deleteEntityResult3 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id2"); assertEquals(2, deleteEntityResult3.size()); // Entity with Many_To_Many relationship - List deleteEntityResult4 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1"); assertEquals(2, deleteEntityResult4.size()); // Entity with One_To_Many relationship ConnectingSameEntity - List deleteEntityResult5 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_6"); assertEquals(2, deleteEntityResult5.size()); // Entity with One_To_One relationship ConnectingSameEntity - List deleteEntityResult6 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_2"); assertEquals(2, deleteEntityResult6.size()); // Again delete AntennaCapability(id=AntennaCapability_id1) should // return empty result list - List deleteEntityResult7 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry + List deleteEntityResult7 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1"); assertTrue(deleteEntityResult7.isEmpty(), @@ -710,7 +708,7 @@ class TiesDbOperationResultsTest { // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(25, mergeResult.size()); @@ -720,7 +718,7 @@ class TiesDbOperationResultsTest { "ManagedElement_3", "NRCellDU_2", List.of()); RelationType oneToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToOneRelationship.getModule(), oneToOneRelationship.getType()); - Optional deleteOneToOneRelationshipResult = tiesDbOperations + Optional deleteOneToOneRelationshipResult = teivDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, oneToOneRelationship.getId(), oneToOneRelationType); assertTrue(deleteOneToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); @@ -730,7 +728,7 @@ class TiesDbOperationResultsTest { "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", "ManagedElement_1", "ODUFunction_1", List.of()); RelationType oneToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToManyRelationship .getModule(), oneToManyRelationship.getType()); - Optional deleteOneToManyRelationshipResult = tiesDbOperations + Optional deleteOneToManyRelationshipResult = teivDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, oneToManyRelationship.getId(), oneToManyRelationType); assertTrue(deleteOneToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); @@ -742,7 +740,7 @@ class TiesDbOperationResultsTest { .of()); RelationType manyToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToOneRelationship .getModule(), manyToOneRelationship.getType()); - Optional deleteManyToOneRelationshipResult = tiesDbOperations + Optional deleteManyToOneRelationshipResult = teivDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, manyToOneRelationship.getId(), manyToOneRelationType); assertTrue(deleteManyToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); @@ -753,7 +751,7 @@ class TiesDbOperationResultsTest { "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", "AntennaModule_7", "AntennaCapability_id1", List.of()); RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToManyRelationship .getModule(), manyToManyRelationship.getType()); - Optional deleteManyToManyRelationshipResult = tiesDbOperations + Optional deleteManyToManyRelationshipResult = teivDbOperations .deleteManyToManyRelationByRelationId(dslContext, manyToManyRelationType, manyToManyRelationship.getId()); assertTrue(deleteManyToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); @@ -763,7 +761,7 @@ class TiesDbOperationResultsTest { "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "AntennaModule_1", "AntennaModule_2", List.of()); RelationType connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName( connectingSameEntityOneToOneRelationship.getModule(), connectingSameEntityOneToOneRelationship.getType()); - Optional deleteConnectingSameEntityOneToOneRelationshipResult = tiesDbOperations + Optional deleteConnectingSameEntityOneToOneRelationshipResult = teivDbOperations .deleteManyToManyRelationByRelationId(dslContext, connectingSameEntityType, connectingSameEntityOneToOneRelationship.getId()); assertTrue(deleteConnectingSameEntityOneToOneRelationshipResult.isPresent(), @@ -775,7 +773,7 @@ class TiesDbOperationResultsTest { "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "AntennaModule_5", "AntennaModule_6", List.of()); connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName(connectingSameEntityOneToManyRelationship .getModule(), connectingSameEntityOneToManyRelationship.getType()); - Optional deleteConnectingSameEntityOneToManyRelationshipResult = tiesDbOperations + Optional deleteConnectingSameEntityOneToManyRelationshipResult = teivDbOperations .deleteManyToManyRelationByRelationId(dslContext, connectingSameEntityType, connectingSameEntityOneToManyRelationship.getId()); assertTrue(deleteConnectingSameEntityOneToManyRelationshipResult.isPresent(), @@ -783,7 +781,7 @@ class TiesDbOperationResultsTest { } @Test - void testSelectByCmHandleFormSourceIds() { + void testSelectByCmHandleFormSourceIds() throws SchemaRegistryException { Map antennaModule1 = new HashMap<>(); antennaModule1.put("id", "module_id1"); antennaModule1.put("CD_sourceIds", JSONB.jsonb( @@ -794,13 +792,11 @@ class TiesDbOperationResultsTest { antennaModule2.put("CD_sourceIds", JSONB.jsonb( "[\"urn:3gpp:dn:fdn\"," + "\"urn:cmHandle:395221E080CCF0FD1924103B15873815\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", antennaModule1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", antennaModule2, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeAntennMod, antennaModule1); + teivDbOperations.merge(dslContext, entityTypeAntennMod, antennaModule2); - List ids = tiesDbOperations.selectByCmHandleFormSourceIds(dslContext, - "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", "395221E080CCF0FD1924103B15873814"); + List ids = teivDbOperations.selectByCmHandleFormSourceIds(dslContext, + "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", "395221E080CCF0FD1924103B15873814"); assertEquals(List.of("module_id1"), ids); } @@ -809,7 +805,7 @@ class TiesDbOperationResultsTest { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(6, mergeResult.size()); @@ -818,7 +814,7 @@ class TiesDbOperationResultsTest { new ArrayList<>()); final ParsedCloudEventData finalParsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of( manyToManyRelationship)); - assertThrows(TiesException.class, () -> tiesDbOperations.executeEntityAndRelationshipMergeOperations( + assertThrows(TeivException.class, () -> teivDbOperations.executeEntityAndRelationshipMergeOperations( finalParsedCloudEventData, "dmi-plugin:nm-1")); } @@ -827,7 +823,7 @@ class TiesDbOperationResultsTest { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(6, mergeResult.size()); @@ -836,7 +832,7 @@ class TiesDbOperationResultsTest { new ArrayList<>()); final ParsedCloudEventData finalParsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of( manyToManyRelationship)); - List result = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List result = teivDbOperations.executeEntityAndRelationshipMergeOperations( finalParsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(1, result.size()); @@ -847,7 +843,7 @@ class TiesDbOperationResultsTest { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(6, mergeResult.size()); @@ -855,7 +851,7 @@ class TiesDbOperationResultsTest { "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", "relation_5", "AntennaModule_5", "AntennaCapability_5", new ArrayList<>()); parsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of(manyToManyRelationship)); - List result = tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, + List result = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(3, result.size()); @@ -866,7 +862,7 @@ class TiesDbOperationResultsTest { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( + List mergeResult = teivDbOperations.executeEntityAndRelationshipMergeOperations( parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(6, mergeResult.size()); @@ -874,7 +870,7 @@ class TiesDbOperationResultsTest { "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", "relation_5", "AntennaModule_2", "AntennaCapability_5", new ArrayList<>()); parsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of(manyToManyRelationship)); - List result = tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, + List result = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(2, result.size()); @@ -907,9 +903,9 @@ class TiesDbOperationResultsTest { assertEquals("ODU_1", manyToOneCreateResult.get(0).getId()); assertEquals("ODU_1", manyToOneCreateResult.get(0).getId()); assertEquals("ODUFunction", manyToOneCreateResult.get(0).getType()); - Map eNodeBAttributes = manyToOneCreateResult.get(0).getAttributes(); - assertTrue(eNodeBAttributes.containsKey("dUpLMNId")); - assertEquals(JSONB.jsonb("{\"mcc\":\"209\",\"mnc\":\"751\"}"), eNodeBAttributes.get("dUpLMNId")); + Map ORUAttributes = manyToOneCreateResult.get(0).getAttributes(); + assertTrue(ORUAttributes.containsKey("dUpLMNId")); + assertEquals(JSONB.jsonb("{\"mcc\":\"209\",\"mnc\":\"751\"}"), ORUAttributes.get("dUpLMNId")); assertEquals("NRSectorCarrier_1", manyToOneCreateResult.get(1).getId()); assertEquals("NRSectorCarrier", manyToOneCreateResult.get(1).getType()); @@ -926,15 +922,15 @@ class TiesDbOperationResultsTest { VALIDATE_MANY_TO_ONE_DIR + "ce-merge-many-to-one-null-attribute.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - List mergeResult = assertDoesNotThrow(() -> tiesDbOperations + List mergeResult = assertDoesNotThrow(() -> teivDbOperations .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1")); assertEquals(3, mergeResult.size()); assertEquals("ODU_1", mergeResult.get(0).getId()); assertEquals("ODUFunction", mergeResult.get(0).getType()); - eNodeBAttributes = mergeResult.get(0).getAttributes(); - assertTrue(eNodeBAttributes.containsKey("dUpLMNId")); - assertNull(eNodeBAttributes.get("dUpLMNId")); + ORUAttributes = mergeResult.get(0).getAttributes(); + assertTrue(ORUAttributes.containsKey("dUpLMNId")); + assertNull(ORUAttributes.get("dUpLMNId")); assertEquals("NRSectorCarrier_1", mergeResult.get(1).getId()); assertEquals("NRSectorCarrier", mergeResult.get(1).getType()); @@ -959,11 +955,11 @@ class TiesDbOperationResultsTest { assertDbContainsOperationResults(oneToManyResult); assertDbContainsOperationResults(oneToOneResult); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one2.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_MANY_DIR + "ce-create-one-to-many2.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_ONE_DIR + "ce-create-one-to-one2.json")); } @@ -1009,11 +1005,11 @@ class TiesDbOperationResultsTest { assertDbContainsOperationResults(oneToManyResult); assertDbContainsOperationResults(oneToOneResult); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one4.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_MANY_DIR + "ce-create-one-to-many4.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_ONE_DIR + "ce-create-one-to-one4.json")); } @@ -1088,11 +1084,11 @@ class TiesDbOperationResultsTest { assertDbContainsOperationResults(oneToManyResult); assertDbContainsOperationResults(oneToOneResult); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one8.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_MANY_DIR + "ce-create-one-to-many8.json")); - assertThrows(TiesException.class, () -> mergeSingleTestEvent( + assertThrows(TeivException.class, () -> mergeSingleTestEvent( VALIDATE_ONE_TO_ONE_DIR + "ce-create-one-to-one8.json")); } @@ -1141,7 +1137,7 @@ class TiesDbOperationResultsTest { RelationType relationType = SchemaRegistry.getRelationTypeByModuleAndName(relationship.getModule(), relationship .getType()); - assertEquals("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", relationType.getNotStoringSideTableName()); + assertEquals("teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"", relationType.getNotStoringSideTableName()); assertEquals("REL_FK_provided-by-oduFunction", relationType .getNotStoringSideEntityIdColumnNameInStoringSideTable()); assertEquals("NRCellDU", relationType.getStoringSideEntityType().getName()); @@ -1175,7 +1171,7 @@ class TiesDbOperationResultsTest { InvalidFieldInYangDataException { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile(path); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - return tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1"); + return teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1"); } private void assertDbContainsOperationResults(List results) { @@ -1192,7 +1188,7 @@ class TiesDbOperationResultsTest { } private void tableContainsId(String tableName, String idColumn, OperationResult result) { - Result dbResults = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, tableName); + Result dbResults = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, tableName); final boolean contains = dbResults.stream().map(row -> row.get(idColumn)).filter(Objects::nonNull).map( Object::toString).anyMatch(result.getId()::equals); assertTrue(contains); diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbServiceContainerizedTest.java similarity index 72% rename from teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java rename to teiv/src/test/java/org/oran/smo/teiv/service/TeivDbServiceContainerizedTest.java index 251456e..f6e97d9 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/TeivDbServiceContainerizedTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,8 @@ package org.oran.smo.teiv.service; import static org.oran.smo.teiv.ingestion.DeadlockRetryPolicy.POSTGRES_DEADLOCK_ERROR_CODE; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; +import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING; +import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.table; @@ -53,6 +53,8 @@ import org.jooq.exception.DataAccessException; import org.jooq.util.xml.jaxb.Column; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.oran.smo.teiv.schema.EntityType; +import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.SchemaRegistryException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -63,22 +65,29 @@ import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.oran.smo.teiv.db.TestPostgresqlContainer; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.schema.SchemaRegistry; import org.oran.smo.teiv.utils.JooqTypeConverter; -import org.oran.smo.teiv.utils.TiesConstants; +import org.oran.smo.teiv.utils.TeivConstants; import org.oran.smo.teiv.utils.schema.Geography; @Configuration @SpringBootTest -class TiesDbServiceContainerizedTest { +class TeivDbServiceContainerizedTest { private static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); + private static EntityType entityTypeMe; + private static EntityType entityTypeODU; + private static EntityType entityTypeSector; + private static EntityType entityTypeAntennMod; + private static EntityType entityTypeAntennCap; + private static RelationType relTypeantennServesAntennCap; + private static RelationType relTypeMeManagesODU; @Autowired - private TiesDbService tiesDbService; + private TeivDbService teivDbService; @Autowired - private TiesDbOperations tiesDbOperations; + private TeivDbOperations teivDbOperations; @Autowired @Qualifier("writeDataDslContext") @@ -87,8 +96,6 @@ class TiesDbServiceContainerizedTest { @Value("${database.retry-policies.deadlock.retry-attempts}") private int maxRetryAttemptsForDeadlock; - private static String updatedTimeColumnName = "updated_time"; - @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.read.jdbc-url", () -> postgreSQLContainer.getJdbcUrl()); @@ -101,19 +108,31 @@ class TiesDbServiceContainerizedTest { } @BeforeEach - public void deleteAll() { - TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), dslContext); + public void deleteAllAndMakeTypes() { + TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), dslContext); + try { + entityTypeMe = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"); + entityTypeODU = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ODUFunction"); + entityTypeSector = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "Sector"); + entityTypeAntennMod = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModule"); + entityTypeAntennCap = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapability"); + relTypeMeManagesODU = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENT_MANAGES_ODUFUNCTION"); + relTypeantennServesAntennCap = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"); + } catch (SchemaRegistryException e) { + throw new RuntimeException(e); + } } @Test - void testMergeManagedElement() { + void testMergeManagedElement() throws SchemaRegistryException { Map map1 = new HashMap<>(); map1.put("id", "id1"); map1.put("CD_sourceIds", JSONB.jsonb("[\"sourceId1\",\"sourceId2\"]")); map1.put("metadata", Map.of("reliabilityIndicator", "OK")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map1, updatedTimeColumnName); - - Result rows = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + teivDbOperations.merge(dslContext, entityTypeMe, map1); + Result rows = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals("{\"reliabilityIndicator\":\"OK\"}", rows.get(0).get("metadata").toString()); map1.remove("metadata"); for (Entry e : map1.entrySet()) { @@ -124,10 +143,9 @@ class TiesDbServiceContainerizedTest { map2.put("id", "id1"); map2.put("CD_sourceIds", JSONB.jsonb("[\"sourceId3\",\"sourceId4\"]")); map2.put("metadata", new HashMap<>()); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map2, updatedTimeColumnName); - - Result rows2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); - assertEquals("{}", rows2.get(0).get("metadata").toString()); + teivDbOperations.merge(dslContext, entityTypeMe, map2); + Result rows2 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals("{\"reliabilityIndicator\":\"OK\"}", rows2.get(0).get("metadata").toString()); map2.remove("metadata"); for (Entry e : map2.entrySet()) { assertEquals(e.getValue(), rows2.get(0).get(e.getKey())); @@ -135,14 +153,13 @@ class TiesDbServiceContainerizedTest { } @Test - void testMergeSector() throws IOException { + void testMergeSector() throws IOException, SchemaRegistryException { Map mapWithGeoLocation = new HashMap<>(); mapWithGeoLocation.put("id", "id1"); mapWithGeoLocation.put("sectorId", 7); mapWithGeoLocation.put("geo-location", new Geography("{\"longitude\": 19.040236,\"latitude\": 47.497913}")); mapWithGeoLocation.put("azimuth", 7.3); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_Sector\"", mapWithGeoLocation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeSector, mapWithGeoLocation); Map mapWithGeoLocationAndHeight = new HashMap<>(); mapWithGeoLocationAndHeight.put("id", "id2"); @@ -150,13 +167,10 @@ class TiesDbServiceContainerizedTest { mapWithGeoLocationAndHeight.put("geo-location", new Geography( "{\"longitude\": 19.040236,\"latitude\": 47.497913,\"height\": 111.1}")); mapWithGeoLocationAndHeight.put("azimuth", 8.3); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_Sector\"", mapWithGeoLocationAndHeight, - updatedTimeColumnName); - + teivDbOperations.merge(dslContext, entityTypeSector, mapWithGeoLocationAndHeight); Result rows = dslContext.select(field("id"), field("\"sectorId\"").as("sectorId"), field( - "ST_AsText(\"geo-location\")"), field("azimuth")).from(table("ties_data.\"o-ran-smo-teiv-ran_Sector\"")) + "ST_AsText(\"geo-location\")"), field("azimuth")).from(table("teiv_data.\"o-ran-smo-teiv-ran_Sector\"")) .fetch(); - assertEquals("id1", rows.get(0).get("id")); assertEquals(7L, rows.get(0).get("sectorId")); assertEquals("POINT(19.040236 47.497913)", rows.get(0).get("ST_AsText(\"geo-location\")")); @@ -173,141 +187,136 @@ class TiesDbServiceContainerizedTest { Map map1 = new HashMap<>(); map1.put("id", "id1"); map1.put("CD_sourceIds", JSONB.jsonb("[\"sourceId1\",\"sourceId2\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map1, updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, map1); Map map2 = new HashMap<>(); map2.put("id", "id2"); map2.put("CD_sourceIds", JSONB.jsonb("[\"sourceId3\",\"sourceId4\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map2, updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, map2); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + Result row1 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(2, row1.size()); - tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + teivDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "id1"); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + Result row2 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, row2.size()); } @Test - void testCascadeOnDelete() { + void testCascadeOnDelete() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map map1 = new HashMap<>(); map1.put("id", "id1"); map1.put("positionWithinSector", "center"); map1.put("antennaBeamWidth", JSONB.jsonb("[2,4,5]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", map1, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeAntennMod, map1); Map map2 = new HashMap<>(); map2.put("id", "id1"); map2.put("eUtranFqBands", JSONB.jsonb("[\"eUtranFqBands1\",\"eUtranFqBands2\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", map2, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeAntennCap, map2); Map map3 = new HashMap<>(); map3.put("id", "id1"); map3.put("aSide_AntennaModule", "id1"); map3.put("bSide_AntennaCapability", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", map3, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, relTypeantennServesAntennCap, map3); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); + Result row1 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(1, row1.size()); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); + Result row2 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(1, row2.size()); - Result row3 = selectAllRowsFromTable(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); + Result row3 = selectAllRowsFromTable(dslContext, "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(1, row3.size()); dbOperations.add(dslContext -> { try { - tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName( + teivDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName( "o-ran-smo-teiv-equipment", "AntennaModule"), "id1"); } catch (SchemaRegistryException e) { throw new RuntimeException(e); } }); - assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); + assertDoesNotThrow(() -> teivDbService.execute(dbOperations)); - Result row4 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); + Result row4 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(0, row4.size()); - Result row5 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); + Result row5 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(1, row5.size()); - Result row6 = selectAllRowsFromTable(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); + Result row6 = selectAllRowsFromTable(dslContext, "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(0, row6.size()); } @Test - void testTriggerOnDelete() { + void testTriggerOnDelete() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map map1 = new HashMap<>(); map1.put("id", "id1"); map1.put("gNBId", 1); map1.put("dUpLMNId", JSONB.jsonb("{\"mcc\":\"dUpLMNId1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", map1, updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, map1); Map map2 = new HashMap<>(); map2.put("id", "id1"); map2.put("CD_sourceIds", JSONB.jsonb("[\"sourceId1\",\"sourceId2\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map2, updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, map2); Map map3 = new HashMap<>(); map3.put("id", "id1"); map3.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "relId"); map3.put("REL_FK_managed-by-managedElement", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", map3, updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, map3); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + Result row2 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, row2.size()); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + Result row1 = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, row1.size()); dbOperations.add(dslContext -> { try { - tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + teivDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "id1"); } catch (SchemaRegistryException e) { throw new RuntimeException(e); } }); - assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); + assertDoesNotThrow(() -> teivDbService.execute(dbOperations)); Result oduFuctionRecords = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals("id1", oduFuctionRecords.get(0).get("id")); assertEquals(1L, oduFuctionRecords.get(0).get("gNBId")); assertNull(oduFuctionRecords.get(0).get("REL_FK_managed-by-managedElement")); assertNull(oduFuctionRecords.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); Result managedElementRecords = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(0, managedElementRecords.size()); } @Test - void testMergeOneToManyRelationship() { + void testMergeOneToManyRelationship() throws SchemaRegistryException { Map oduFuctionEntity1 = new HashMap<>(); oduFuctionEntity1.put("id", "id1"); oduFuctionEntity1.put("gNBId", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity1, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, oduFuctionEntity1); Map managedElementEntity1 = new HashMap<>(); managedElementEntity1.put("id", "id1"); managedElementEntity1.put("CD_sourceIds", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity1, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity1); Map rel = new HashMap<>(); rel.put("id", "id1"); rel.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "rel_id1"); rel.put("REL_FK_managed-by-managedElement", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", rel, updatedTimeColumnName); + teivDbOperations.merge(dslContext, relTypeMeManagesODU, rel); - Result rowsBeforeMerge = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + Result rowsBeforeMerge = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals("id1", rowsBeforeMerge.get(0).get("id")); assertEquals(1L, rowsBeforeMerge.get(0).get("gNBId")); assertEquals("id1", rowsBeforeMerge.get(0).get("REL_FK_managed-by-managedElement")); @@ -316,17 +325,15 @@ class TiesDbServiceContainerizedTest { Map oduFuctionEntity2 = new HashMap<>(); oduFuctionEntity2.put("id", "id2"); oduFuctionEntity2.put("gNBId", 2); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity2, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, oduFuctionEntity2); Map modifiedRel = new HashMap<>(); modifiedRel.put("id", "id2"); modifiedRel.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "rel_id2"); modifiedRel.put("REL_FK_managed-by-managedElement", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", modifiedRel, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, relTypeMeManagesODU, modifiedRel); - Result rowsAfterMerge = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + Result rowsAfterMerge = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals("id1", rowsBeforeMerge.get(0).get("id")); assertEquals(1L, rowsBeforeMerge.get(0).get("gNBId")); @@ -342,14 +349,12 @@ class TiesDbServiceContainerizedTest { void testDeleteOneToManyRelationship() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); Map oduFuctionEntity = new HashMap<>(); oduFuctionEntity.put("id", "odu-id1"); oduFuctionEntity.put("gNBId", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, oduFuctionEntity); Map meToOduFuncRelation = new HashMap<>(); meToOduFuncRelation.put("id", "odu-id1"); @@ -357,13 +362,12 @@ class TiesDbServiceContainerizedTest { meToOduFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "eiid1"); meToOduFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", meToOduFuncRelation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, meToOduFuncRelation); - tiesDbOperations.deleteRelationFromEntityTableByRelationId(dslContext, "eiid1", SchemaRegistry + teivDbOperations.deleteRelationFromEntityTableByRelationId(dslContext, "eiid1", SchemaRegistry .getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_ODUFUNCTION")); - Result rows = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + Result rows = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals("odu-id1", rows.get(0).get("id")); assertEquals(1L, rows.get(0).get("gNBId")); assertNull(rows.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); @@ -372,18 +376,16 @@ class TiesDbServiceContainerizedTest { } @Test - void testTransactionalMergeSucceeds() { + void testTransactionalMergeSucceeds() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeMe, managedElementEntity)); Map oduFuctionEntity = new HashMap<>(); oduFuctionEntity.put("id", "odu-id1"); oduFuctionEntity.put("gNBId", 1); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeODU, oduFuctionEntity)); Map meToOduFuncRelation = new HashMap<>(); meToOduFuncRelation.put("id", "odu-id1"); @@ -391,13 +393,12 @@ class TiesDbServiceContainerizedTest { meToOduFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "eiid1"); meToOduFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", meToOduFuncRelation, updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeODU, meToOduFuncRelation)); - assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); + assertDoesNotThrow(() -> teivDbService.execute(dbOperations)); Result rowsFromOduFuctionTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, rowsFromOduFuctionTable.size()); assertEquals("me-id1", rowsFromOduFuctionTable.get(0).get("REL_FK_managed-by-managedElement")); assertEquals("eiid1", rowsFromOduFuctionTable.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); @@ -405,57 +406,52 @@ class TiesDbServiceContainerizedTest { "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElement.size()); } @Test - void testTransactionalMergeRollsBackAfterRelationshipError() { + void testTransactionalMergeRollsBackAfterRelationshipError() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeMe, managedElementEntity)); Map oduFuctionEntity = new HashMap<>(); oduFuctionEntity.put("id", "odu-id1"); oduFuctionEntity.put("gNBId", 1); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeODU, oduFuctionEntity)); // Create a faulty relationship map to trigger the rollback Map faultyCloudNativeSystemRelationship = new HashMap<>(); faultyCloudNativeSystemRelationship.put("id", "odu_id1"); faultyCloudNativeSystemRelationship.put("REL_MANAGEDELEMENT_MANAGES_ODUFUNCTION_BAAAD", "managed_element_id1"); faultyCloudNativeSystemRelationship.put("REL_MANAGEDELEMENT_MANAGES_ODUFUNCTION_EIID", "eiid1"); - dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", faultyCloudNativeSystemRelationship, - updatedTimeColumnName)); + dbOperations.add(wrDSLContext -> teivDbOperations.merge(wrDSLContext, entityTypeODU, + faultyCloudNativeSystemRelationship)); - assertThrows(TiesException.class, () -> tiesDbService.execute(dbOperations)); + assertThrows(TeivException.class, () -> teivDbService.execute(dbOperations)); Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(0, rowsFromManagedElementTable.size()); Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(0, rowsFromCloudNativeSystem.size()); } @Test - void testTransactionalDeleteSucceeds() { + void testTransactionalDeleteSucceeds() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); Map oduFuctionEntity = new HashMap<>(); oduFuctionEntity.put("id", "odu-id1"); oduFuctionEntity.put("gNBId", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, oduFuctionEntity); Map meToOduFuncRelation = new HashMap<>(); meToOduFuncRelation.put("id", "odu-id1"); @@ -463,11 +459,10 @@ class TiesDbServiceContainerizedTest { meToOduFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "eiid1"); meToOduFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", meToOduFuncRelation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, meToOduFuncRelation); Result rowsFromOduFuctionBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, rowsFromOduFuctionBeforeDelete.size()); assertEquals("me-id1", rowsFromOduFuctionBeforeDelete.get(0).get("REL_FK_managed-by-managedElement")); assertEquals("eiid1", rowsFromOduFuctionBeforeDelete.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); @@ -475,12 +470,12 @@ class TiesDbServiceContainerizedTest { "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); Result rowsFromManagedElementBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElementBeforeDelete.size()); dbOperations.add(wrDSLContext -> { try { - tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + teivDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( "o-ran-smo-teiv-ran", "ODUFunction"), "odu-id1"); } catch (SchemaRegistryException e) { e.printStackTrace(); @@ -489,7 +484,7 @@ class TiesDbServiceContainerizedTest { dbOperations.add(wrDSLContext -> { try { - tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + teivDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( "o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); } catch (SchemaRegistryException e) { e.printStackTrace(); @@ -498,7 +493,7 @@ class TiesDbServiceContainerizedTest { dbOperations.add(wrDSLContext -> { try { - tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", SchemaRegistry + teivDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", SchemaRegistry .getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_ODUFUNCTION")); } catch (SchemaRegistryException e) { @@ -506,29 +501,27 @@ class TiesDbServiceContainerizedTest { } }); - assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); + assertDoesNotThrow(() -> teivDbService.execute(dbOperations)); Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(0, rowsFromManagedElementTable.size()); - Result rowsOduFuction = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + Result rowsOduFuction = selectAllRowsFromTable(dslContext, "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(0, rowsOduFuction.size()); } @Test - void testTransactionalDeleteRollbackAfterRelationshipError() { + void testTransactionalDeleteRollbackAfterRelationshipError() throws SchemaRegistryException { List> dbOperations = new ArrayList<>(); Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity); Map oduFuctionEntity = new HashMap<>(); oduFuctionEntity.put("id", "odu-id1"); oduFuctionEntity.put("gNBId", 1); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, oduFuctionEntity); Map meToOduFuncRelation = new HashMap<>(); meToOduFuncRelation.put("id", "odu-id1"); @@ -536,15 +529,14 @@ class TiesDbServiceContainerizedTest { meToOduFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "eiid1"); meToOduFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", JooqTypeConverter.toJsonb(List.of( "fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", meToOduFuncRelation, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeODU, meToOduFuncRelation); Result rowsFromManagedElementBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElementBeforeDelete.size()); Result rowsFromOduFuctionBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, rowsFromOduFuctionBeforeDelete.size()); assertEquals(1, rowsFromOduFuctionBeforeDelete.size()); assertEquals("me-id1", rowsFromOduFuctionBeforeDelete.get(0).get("REL_FK_managed-by-managedElement")); @@ -554,7 +546,7 @@ class TiesDbServiceContainerizedTest { dbOperations.add(wrDSLContext -> { try { - tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + teivDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( "o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); } catch (SchemaRegistryException e) { e.printStackTrace(); @@ -562,7 +554,7 @@ class TiesDbServiceContainerizedTest { }); dbOperations.add(wrDSLContext -> { try { - tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + teivDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( "o-ran-smo-teiv-ran", "ODUFunction"), "odu-id1"); } catch (SchemaRegistryException e) { e.printStackTrace(); @@ -571,17 +563,17 @@ class TiesDbServiceContainerizedTest { // Add a faulty relationship delete to trigger the rollback dbOperations.add(wrDSLContext -> { - tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", null); + teivDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", null); }); - assertThrows(TiesException.class, () -> tiesDbService.execute(dbOperations)); + assertThrows(TeivException.class, () -> teivDbService.execute(dbOperations)); Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElement.size()); Result rowsFromOduFuction = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, rowsFromOduFuction.size()); assertEquals(1, rowsFromOduFuction.size()); assertEquals("me-id1", rowsFromOduFuction.get(0).get("REL_FK_managed-by-managedElement")); @@ -591,7 +583,7 @@ class TiesDbServiceContainerizedTest { } @Test - void testDeadlockRetry() throws InterruptedException { + void testDeadlockRetry() throws InterruptedException, SchemaRegistryException { List> dbOperations1 = new ArrayList<>(); List> dbOperations2 = new ArrayList<>(); @@ -610,15 +602,12 @@ class TiesDbServiceContainerizedTest { final CountDownLatch firstTransactionCompletedMergeEntity1 = new CountDownLatch(1); final CountDownLatch secondTransactionCompletedMergeEntity2 = new CountDownLatch(1); dbOperations1.add(dslContext -> { - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity1, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity1); firstTransactionCompletedMergeEntity1.countDown(); try { secondTransactionCompletedMergeEntity2.await(); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity2, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity3, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity2); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity3); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -626,27 +615,24 @@ class TiesDbServiceContainerizedTest { // Try to add the same rows in another transaction in another order. dbOperations2.add(dslContext -> { try { - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity2, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity2); secondTransactionCompletedMergeEntity2.countDown(); firstTransactionCompletedMergeEntity1.await(); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity1, - updatedTimeColumnName); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity4, - updatedTimeColumnName); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity1); + teivDbOperations.merge(dslContext, entityTypeMe, managedElementEntity4); } catch (InterruptedException e) { throw new RuntimeException(e); } }); - Thread t1 = new Thread(() -> tiesDbService.execute(dbOperations1)); - Thread t2 = new Thread(() -> tiesDbService.execute(dbOperations2)); + Thread t1 = new Thread(() -> teivDbService.execute(dbOperations1)); + Thread t2 = new Thread(() -> teivDbService.execute(dbOperations2)); t1.start(); t2.start(); t1.join(); t2.join(); Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(4, rowsFromManagedElement.size()); } @@ -659,7 +645,7 @@ class TiesDbServiceContainerizedTest { throw new DataAccessException("A deadlock occurred in the db", new SQLException("details", POSTGRES_DEADLOCK_ERROR_CODE)); }); - assertThrows(TiesException.class, () -> tiesDbService.execute(dbOperations)); + assertThrows(TeivException.class, () -> teivDbService.execute(dbOperations)); assertEquals(maxRetryAttemptsForDeadlock, attempts.get()); } @@ -672,7 +658,7 @@ class TiesDbServiceContainerizedTest { * * @param readDataDslContext * @param tableName - * For example: ties_data."AntennaModule" + * For example: teiv_data."AntennaModule" * @return the fetched rows. Values of geography type are represented as String * values. */ @@ -683,7 +669,7 @@ class TiesDbServiceContainerizedTest { List columns = readDataDslContext.meta(table).informationSchema().getColumns(); List> columnsToSelect = columns.stream().map(c -> { if ("geography".equals(c.getDataType())) { - return field(String.format(TiesConstants.ST_TO_STRING, String.format(QUOTED_STRING, c.getColumnName()))); + return field(String.format(TeivConstants.ST_TO_STRING, String.format(QUOTED_STRING, c.getColumnName()))); } else if ("jsonb".equals(c.getDataType())) { return field(name(c.getColumnName()), JSONB.class); } else { diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java index 2a0457c..5ca0097 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ */ package org.oran.smo.teiv.utils; -import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; -import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; +import static org.oran.smo.teiv.utils.TeivConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TeivConstants.DECORATORS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; @@ -41,7 +41,7 @@ import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.exception.YangException; import org.oran.smo.teiv.schema.MockSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoader; @@ -111,7 +111,7 @@ class ExposureYangParserTest { MultipartFile wrongClassifiersFile = new MockMultipartFile("file", "file.yang", MediaType.MULTIPART_FORM_DATA_VALUE, ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + " import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + " leaf test1 {\n" + " type string;\n" + " }\n" + "\t\tleaf test2 {\n" + " type boolean;\n" + " }\n" + "\t\tleaf test3 {\n" + " type uint32;\n" + " }\n" + " }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase geo-classifier;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") .getBytes()); - assertThrows(TiesException.class, () -> ExposureYangParser.validateSchemasYang(wrongClassifiersFile)); + assertThrows(TeivException.class, () -> ExposureYangParser.validateSchemasYang(wrongClassifiersFile)); } @Test @@ -119,6 +119,6 @@ class ExposureYangParserTest { MultipartFile wrongDecoratorsFile = new MockMultipartFile("file", "file.yang", MediaType.MULTIPART_FORM_DATA_VALUE, ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + " import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + " leaf test1 {\n" + " type test;\n" + " }\n" + "\t\tleaf test2 {\n" + " type boolean;\n" + " }\n" + "\t\tleaf test3 {\n" + " type uint32;\n" + " }\n" + " }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase geo-classifier;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") .getBytes()); - assertThrows(TiesException.class, () -> ExposureYangParser.validateSchemasYang(wrongDecoratorsFile)); + assertThrows(TeivException.class, () -> ExposureYangParser.validateSchemasYang(wrongDecoratorsFile)); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java index 694eb51..6fab62d 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; -import org.oran.smo.teiv.exception.TiesException; +import org.oran.smo.teiv.exception.TeivException; import org.oran.smo.teiv.utils.schema.Geography; class JooqTypeConverterTest { @@ -95,12 +95,12 @@ class JooqTypeConverterTest { @Test void testThrowExceptionJsonbToList() { final JSONB invalidJson = JSONB.valueOf("[\"one\", \"two]"); - Assertions.assertThrowsExactly(TiesException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); + Assertions.assertThrowsExactly(TeivException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); } @Test void testThrowExceptionJsonbToMap() { final JSONB invalidJson = JSONB.valueOf("{\"key\": \"valu"); - Assertions.assertThrowsExactly(TiesException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); + Assertions.assertThrowsExactly(TeivException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java b/teiv/src/test/java/org/oran/smo/teiv/utils/TeivTestConstants.java similarity index 93% rename from teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java rename to teiv/src/test/java/org/oran/smo/teiv/utils/TeivTestConstants.java index ec8d61c..4ce214b 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/TeivTestConstants.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ */ package org.oran.smo.teiv.utils; -public class TiesTestConstants { +public class TeivTestConstants { public static final String APPLICATION_JSON = "application/json"; public static final String SPRING_BOOT_SERVER_HOST = "kafka.server.bootstrap-server-host:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[0]}"; diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/YangParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/YangParserTest.java index 7c4aa5b..f6a6063 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/YangParserTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/YangParserTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,9 +47,9 @@ class YangParserTest { } @Test - void testReturnAllTiesSchemas() { + void testReturnAllTeivSchemas() { //when - List OranTeivSchemasMetaDataList = YangParser.returnAllTiesSchemas(yangParser.extractYangData()); + List OranTeivSchemasMetaDataList = YangParser.returnAllTeivSchemas(yangParser.extractYangData()); //then Assertions.assertEquals(10, OranTeivSchemasMetaDataList.size()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/schema/GeographyTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/schema/GeographyTest.java index f8ed9a3..74e7f7d 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/schema/GeographyTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/schema/GeographyTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,5 +67,10 @@ class GeographyTest { assertThrows(IOException.class, () -> new Geography("{\"longitude\": 19.040236 \"height\": 19.040236}")); assertThrows(IOException.class, () -> new Geography("{\"latitude\": 47.497913 \"height\": 19.040236}")); + + assertThrows(IOException.class, () -> new Geography( + "{\"longitude\": 180.040236 \"latitude\": 47.497913 \"height\": 19.040236}")); + assertThrows(IOException.class, () -> new Geography( + "{\"longitude\": 19.040236 \"latitude\": -147.497913 \"height\": 19.040236}")); } } diff --git a/teiv/src/test/resources/application.yaml b/teiv/src/test/resources/application-test.yaml similarity index 98% rename from teiv/src/test/resources/application.yaml rename to teiv/src/test/resources/application-test.yaml index 79e8c7d..d1c35c2 100644 --- a/teiv/src/test/resources/application.yaml +++ b/teiv/src/test/resources/application-test.yaml @@ -19,8 +19,6 @@ # ============LICENSE_END========================================================= # -spring.profiles.active: test - #Metrics related configurations management: endpoint: diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json b/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json index db70c93..a93eac2 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json index 08ae504..b7c168f 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json index 9f4c8dd..9cdafd9 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json index b1e407c..8dc4da7 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json @@ -33,8 +33,8 @@ } }, "sourceIds": [ - "source1", - "source2" + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", + "urn:cmHandle:395221E080CCF0FD1929103B15999999" ] } ] diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json index bcdffb3..a8ff2d0 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json index 87e8e9e..5d3399a 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json @@ -71,8 +71,8 @@ "aSide": "AntennaModule_1", "bSide": "AntennaCapability_1", "sourceIds": [ - "source12", - "source22" + "source1", + "source2" ] }, { @@ -80,8 +80,8 @@ "aSide": "AntennaModule_2", "bSide": "AntennaCapability_2", "sourceIds": [ - "source12", - "source22" + "source1", + "source2" ] } ] diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many3.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many3.json new file mode 100644 index 0000000..3af10ba --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many3.json @@ -0,0 +1,101 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0002", + "source": "dmi-plugin:enm-1", + "type": "topology-inventory-ingestion.merge", + "time": "2023-10-25T13:30:12Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "ODU_1", + "attributes": { + "dUpLMNId": { + "mcc": "777", + "mnc": "888" + }, + "gNBDUId": 44, + "gNBId": 4321, + "gNBIdLength": 9 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "NRCellDU_1", + "attributes": { + "cellLocalId": 4589, + "nCI": 2 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "NRCellDU_2", + "attributes": { + "cellLocalId": 45891 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "NRCellDU_3", + "attributes": { + "cellLocalId": 964 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "relation_7", + "aSide": "ODU_1", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_8", + "aSide": "ODU_1", + "bSide": "NRCellDU_2", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_9", + "aSide": "ODU_1", + "bSide": "NRCellDU_3", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json index 6d65d4c..01547b7 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json @@ -7,7 +7,12 @@ "id": "NRCellDU_51", "CD_sourceIds": [ "relation_one_to_one_missing_bSide" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } } ], "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ @@ -27,6 +32,11 @@ "CD_sourceIds": [ "relation_one_to_one_missing_aSide" ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + }, "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4": [ "source1", "source2" @@ -37,6 +47,11 @@ { "id": "NRCellDU_4", "cellLocalId": 470, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, "REL_FK_provided-by-oduFunction": "ODU_3", "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_one_to_many_aSide_missing", "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [ @@ -51,6 +66,11 @@ "CD_sourceIds": [ "relation_one_to_many_bSide_missing" ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + }, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [ "source1", "source2" @@ -66,13 +86,23 @@ }, "gNBDUId": 13, "gNBId": 12345, - "gNBIdLength": 5 + "gNBIdLength": 5, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "ODU_3", "CD_sourceIds": [ "relation_one_to_many_aSide_missing" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-equipment_AntennaModule": [ @@ -84,13 +114,23 @@ "id": "AntennaModule_123", "CD_sourceIds": [ "relation_many_to_many_aSide_missing" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "AntennaModule_11", "CD_sourceIds": [ "relation_many_to_many_both_sides_missing" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-ran_AntennaCapability": [ @@ -105,13 +145,23 @@ "id": "AntennaCapability_123", "CD_sourceIds": [ "relation_many_to_many_bSide_missing" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "AntennaCapability_22", "CD_sourceIds": [ "relation_many_to_many_both_sides_missing" - ] + ], + "metadata": { + "reliabilityIndicator": "ADVISED", + "firstDiscovered": "", + "lastModified": "" + } } ], "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json index 825c7d2..eabcc96 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json @@ -2,11 +2,21 @@ "o-ran-smo-teiv-equipment_AntennaModule": [ { "id": "AntennaModule_1", - "positionWithinSector": "center" + "positionWithinSector": "center", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "AntennaModule_2", - "positionWithinSector": "center2" + "positionWithinSector": "center2", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-ran_AntennaCapability": [ @@ -15,6 +25,11 @@ "geranFqBands": { "attribute_1": "1", "attribute_2": "2" + }, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" } }, { @@ -22,6 +37,11 @@ "geranFqBands": { "attribute_1": "1", "attribute_2": "2" + }, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" } } ], @@ -29,12 +49,22 @@ { "id": "relation_1", "aSide_AntennaModule": "AntennaModule_1", - "bSide_AntennaCapability": "AntennaCapability_1" + "bSide_AntennaCapability": "AntennaCapability_1", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "relation_2", "aSide_AntennaModule": "AntennaModule_2", - "bSide_AntennaCapability": "AntennaCapability_2" + "bSide_AntennaCapability": "AntennaCapability_2", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json index e224b7a..0307ab0 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json @@ -11,12 +11,22 @@ { "id": "ManagedElement_21", "REL_FK_used-nrCellDu": "NRCellDU_21", - "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_11" + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_11", + "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "ManagedElement_41", "REL_FK_used-nrCellDu": "NRCellDU_31", - "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_12" + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_12", + "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json index 6465d9a..62df5f4 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json @@ -2,11 +2,21 @@ "o-ran-smo-teiv-equipment_AntennaModule": [ { "id": "AntennaModule_3", - "positionWithinSector": "center" + "positionWithinSector": "center", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "AntennaModule_4", - "positionWithinSector": "center2" + "positionWithinSector": "center2", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-ran_AntennaCapability": [ @@ -21,7 +31,12 @@ "attribute_2": "2" }, "eUtranFqBands": null, - "nRFqBands": null + "nRFqBands": null, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "AntennaCapability_4", @@ -34,19 +49,34 @@ "attribute_2": "2" }, "eUtranFqBands": null, - "nRFqBands": null + "nRFqBands": null, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ], "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ { "id": "relation_3", "aSide_AntennaModule": "AntennaModule_3", - "bSide_AntennaCapability": "AntennaCapability_3" + "bSide_AntennaCapability": "AntennaCapability_3", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "relation_4", "aSide_AntennaModule": "AntennaModule_4", - "bSide_AntennaCapability": "AntennaCapability_4" + "bSide_AntennaCapability": "AntennaCapability_4", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json index a6f34f9..67de539 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json @@ -12,7 +12,7 @@ "id": "ManagedElement_41", "REL_FK_used-nrCellDu": null, "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": null, - "REL_metadata_780D8ABEAC14A0B2ET73FC4EB093C446F7CD3E56": null + "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": null } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json new file mode 100644 index 0000000..eef53b8 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json @@ -0,0 +1,65 @@ +{ + "o-ran-smo-teiv-equipment_AntennaModule": [ + { + "id": "AntennaModule_1", + "positionWithinSector": "left", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + }, + { + "id": "AntennaModule_2", + "positionWithinSector": "left2", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + } + ], + "o-ran-smo-teiv-ran_AntennaCapability": [ + { + "id": "AntennaCapability_1", + "geranFqBands": { + "attribute_1": "2", + "attribute_2": "3" + }, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + }, + { + "id": "AntennaCapability_2", + "geranFqBands": { + "attribute_1": "23", + "attribute_2": "23" + } + } + ], + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ + { + "id": "relation_1", + "aSide_AntennaModule": "AntennaModule_1", + "bSide_AntennaCapability": "AntennaCapability_1", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + }, + { + "id": "relation_2", + "aSide_AntennaModule": "AntennaModule_2", + "bSide_AntennaCapability": "AntennaCapability_2", + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + } + ] +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json index 38e8e77..b695a6c 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json @@ -6,20 +6,50 @@ "nCI": 2, "nRPCI": null, "nRTAC": null, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, "REL_FK_provided-by-oduFunction": "ODU_1", - "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_7" + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_7", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "NRCellDU_2", "cellLocalId": 45891, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, "REL_FK_provided-by-oduFunction": "ODU_1", - "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_8" + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_8", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } }, { "id": "NRCellDU_3", "cellLocalId": 469, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, "REL_FK_provided-by-oduFunction": "ODU_1", - "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_9" + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_9", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ], "o-ran-smo-teiv-ran_ODUFunction": [ @@ -31,7 +61,12 @@ }, "gNBDUId": 12, "gNBId": 1234, - "gNBIdLength": 4 + "gNBIdLength": 4, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many3.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many3.json new file mode 100644 index 0000000..ab434b1 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many3.json @@ -0,0 +1,69 @@ +{ + "o-ran-smo-teiv-ran_NRCellDU": [ + { + "id": "NRCellDU_1", + "cellLocalId": 4589, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_7", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + }, + { + "id": "NRCellDU_2", + "cellLocalId": 45891, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_8", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + }, + { + "id": "NRCellDU_3", + "cellLocalId": 964, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + }, + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_9", + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + } + ], + "o-ran-smo-teiv-ran_ODUFunction": [ + { + "id": "ODU_1", + "dUpLMNId": { + "mcc": "777", + "mnc": "888" + }, + "gNBDUId": 44, + "gNBId": 4321, + "gNBIdLength": 9, + "metadata": { + "reliabilityIndicator": "OK", + "firstDiscovered": "", + "lastModified": "" + } + } + ] +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json index 60b5b68..1fc9682 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json @@ -2,75 +2,111 @@ "o-ran-smo-teiv-ran_NRCellDU": [ { "id": "myReliabilityCell_1", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_2", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_3", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_4", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_5", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_6", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": null, "nCI": null, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_7", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_8", + "metadata": { + "lastModified": "", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 }, { "id": "myReliabilityCell_9", + "metadata": { + "lastModified": "", + "firstDiscovered": "", + "reliabilityIndicator": "OK" + }, "cellLocalId": 51, "nCI": 61, "nRPCI": 701, - "nRTAC": 401, - "RI_nRTAC": "OK" + "nRTAC": 401 } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json index c07909b..d0ae060 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json index 072f5ce..62310e2 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json @@ -5,7 +5,7 @@ "type": "ran-logical-topology.merge", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "https://teiv:8080/schemas/v1/r1-topology", "data": { "entities": [ { diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy index 1d0142d..7d704db 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -320,5 +320,155 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[2]', byEquality()) } } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with classifiers in scopeFilter." + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "attributes": { + "gNBId" : 19 + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBId', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with classifiers in scopeFilter." + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "attributes": { + "gNBId" : 19 + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural'] | /provided-nrCellDu/classifiers[@item='test-app-module:Indoor']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBId', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with classifiers in scopeFilter." + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "attributes": { + "gNBId" : 19 + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(gNBId)&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBId', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy index 3e6dccc..90d7662 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy index caf7be9..08554d6 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -160,4 +160,50 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "SUCCESS - 200: Get classifiers using getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/provided-nrCellDu/classifiers[@item='test-app-module:Rural']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + } ] diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy index bf9bb1a..289d791 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import org.springframework.cloud.contract.spec.Contract "test-app-module:Weekend" ], "entityIds": [ - "WRONG_ENTITY_ID", + "urn:WRONG_ENTITY_ID", "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" ], "operation": "merge" @@ -52,7 +52,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []" + "details": "The requested resource with the following ids cannot be found. Entities: [urn:WRONG_ENTITY_ID] Relationships: []" }''') bodyMatchers { jsonPath('$.status', byEquality()) @@ -61,6 +61,39 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "ERROR - 400: Merge classifiers where entity id does not start with urn:" + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "merge" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : WRONG_ENTITY_ID is not in supported format. Topology ID should start with urn:" + }''') + } + }, Contract.make { description "NOT FOUND - 404: Merge classifiers with wrong relationship ids." request { @@ -77,7 +110,7 @@ import org.springframework.cloud.contract.spec.Contract ], "relationshipIds": [ "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", - "WRONG_RELATIONSHIP_ID" + "urn:WRONG_RELATIONSHIP_ID" ], "operation": "merge" }''') @@ -90,7 +123,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]" + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [urn:WRONG_RELATIONSHIP_ID]" }''') bodyMatchers { jsonPath('$.status', byEquality()) @@ -99,6 +132,39 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "NOT FOUND - 404: Merge classifiers with wrong relationship ids." + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", + "WRONG_RELATIONSHIP_ID" + ], + "operation": "merge" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : WRONG_RELATIONSHIP_ID is not in supported format. Topology ID should start with urn:" + }''') + } + }, Contract.make { description "SUCCESS - 204: Merge valid classifiers to entities and relationships (add)." request { diff --git a/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy b/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy index 606c5bb..7fe40aa 100644 --- a/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy +++ b/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy index b7e37a8..3ea0fd8 100644 --- a/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy index 1369576..f3cacab 100644 --- a/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy index 072b79c..e1dd959 100644 --- a/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -677,7 +677,7 @@ import org.springframework.cloud.contract.spec.Contract }, "attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters": "someStringValue" }, - "id": "LongEntityType1" + "id": "urn:LongEntityType1" } ] } @@ -716,6 +716,7 @@ import org.springframework.cloud.contract.spec.Contract } } }, + //10 Contract.make { description "SUCCESS - 200: Get all topology entities of type NRCellDU with scopeFilter on association." request { @@ -958,10 +959,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get all topology entities of type OCUCPFunction with scopeFilter on complex attribute STRING value - EQUALS - KEY AND VALUE EXISTS" + description 'SUCCESS - 200: Get all topology entities of type ODUFunction with scopeFilter on complex attribute STRING value - EQUALS - KEY AND VALUE EXISTS' request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" } response { status OK() @@ -971,11 +972,11 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "items": [ { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "456", "mnc": "83" } @@ -984,11 +985,11 @@ import org.springframework.cloud.contract.spec.Contract ] }, { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "456", "mnc": "86" } @@ -998,19 +999,19 @@ import org.springframework.cloud.contract.spec.Contract } ], "self": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "first": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "prev": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "next": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "last": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "totalCount": 2 }''') @@ -1018,16 +1019,16 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(2) }) - jsonPath('$.items[0].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) - jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } }, Contract.make { - description "SUCCESS - 200: Get all topology entities of type OCUCPFunction with scopeFilter on complex attribute STRING value - EQUALS - KEY AND VALUE EXISTS" + description 'SUCCESS - 200: Get all topology entities of type ODUFunction with scopeFilter on complex attribute STRING value - EQUALS - KEY AND VALUE EXISTS' request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" } response { status OK() @@ -1037,11 +1038,11 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "items": [ { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "456", "mnc": "83" } @@ -1050,11 +1051,11 @@ import org.springframework.cloud.contract.spec.Contract ] }, { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "456", "mnc": "86" } @@ -1064,19 +1065,19 @@ import org.springframework.cloud.contract.spec.Contract } ], "self": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "first": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "prev": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "next": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "last": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[@mcc='456']" }, "totalCount": 2 }''') @@ -1084,16 +1085,16 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(2) }) - jsonPath('$.items[0].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) - jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } }, Contract.make { - description "SUCCESS - 200: Get all topology entities of type OCUCPFunction with scopeFilter on complex attribute STRING value - CONTAINS - KEY AND VALUE EXISTS" + description 'SUCCESS - 200: Get all topology entities of type ODUFunction with scopeFilter on complex attribute STRING value - CONTAINS - KEY AND VALUE EXISTS' request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" } response { status OK() @@ -1103,11 +1104,11 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "items": [ { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "789", "mnc": "84" } @@ -1116,11 +1117,11 @@ import org.springframework.cloud.contract.spec.Contract ] }, { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", "attributes": { - "pLMNId": { + "dUpLMNId": { "mcc": "789", "mnc": "87" } @@ -1130,19 +1131,19 @@ import org.springframework.cloud.contract.spec.Contract } ], "self": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" }, "first": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" }, "prev": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" }, "next": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" }, "last": { - "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes(dUpLMNId)&scopeFilter=/attributes/dUpLMNId[contains(@mcc,'78')]" }, "totalCount": 2 }''') @@ -1150,8 +1151,8 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(2) }) - jsonPath('$.items[0].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) - jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } }, @@ -1328,6 +1329,7 @@ import org.springframework.cloud.contract.spec.Contract } } }, + //20 Contract.make { description "SUCCESS - 200: Get all topology entities of type AntennaCapability with scopeFilter on complex attribute STRING array - PARTIAL MATCH - VALUE NOT EXISTS" request { @@ -1617,6 +1619,7 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + //30 Contract.make { description "ERROR - 400: Get all topology entities with invalid scopeFilter (attribute not prefixed with @)" request { @@ -1960,6 +1963,7 @@ import org.springframework.cloud.contract.spec.Contract } } }, + //40 Contract.make { description 'SUCCESS - 200: Get entities of type AntennaModule inside the specified Polygon' request { @@ -2055,7 +2059,7 @@ import org.springframework.cloud.contract.spec.Contract description "SUCCESS - 200: Get entities of type NRCellDU by Sector id" request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" } response { status OK() @@ -2087,19 +2091,19 @@ import org.springframework.cloud.contract.spec.Contract } ], "self": { - "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "first": { - "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "prev": { - "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "next": { - "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "last": { - "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "totalCount": 3 }''') @@ -2114,10 +2118,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get topology entities of type EntityTypeA where used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'LongEntityType1'. One to One" + description "SUCCESS - 200: Get topology entities of type EntityTypeA where used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'urn:LongEntityType1'. One to One" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" } response { status OK() @@ -2129,25 +2133,25 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:EntityTypeA": [ { - "id": "EntityType1" + "id": "urn:EntityType1" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeA/entities?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "totalCount": 1 }''') @@ -2157,7 +2161,7 @@ import org.springframework.cloud.contract.spec.Contract description "SUCCESS - 200: Get topology entities of type EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters where used-by-entityTypeA id is 'EntityType1'. One to One" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" } response { status OK() @@ -2169,28 +2173,1483 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters": [ { - "id": "LongEntityType1" + "id": "urn:LongEntityType1" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='EntityType1']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=100&scopeFilter=/used-by-entityTypeA[@id='urn:EntityType1']" }, "totalCount": 1 }''') } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - LESS THAN' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T11:40:36.461565Z", + "firstDiscovered": "2025-01-09T11:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-11T09:40:36.461565Z", + "firstDiscovered": "2025-01-11T09:40:36.461565Z", + "reliabilityIndicator": "ADVISED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T10:40:36.461565Z", + "firstDiscovered": "2025-01-09T10:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-01-11T23:40:36.461565Z']" + }, + "totalCount": 3 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - GREATER THAN' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-11T23:40:36.461565Z", + "firstDiscovered": "2025-01-11T23:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-12T21:40:36.461565Z", + "firstDiscovered": "2025-01-12T21:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2025-01-11T09:40:36.461565Z']" + }, + "totalCount": 2 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - GREATER THAN AND LESS THAN' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T11:40:36.461565Z", + "firstDiscovered": "2025-01-09T11:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-11T23:40:36.461565Z", + "firstDiscovered": "2025-01-11T23:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-11T09:40:36.461565Z", + "firstDiscovered": "2025-01-11T09:40:36.461565Z", + "reliabilityIndicator": "ADVISED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-12T21:40:36.461565Z", + "firstDiscovered": "2025-01-12T21:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T10:40:36.461565Z", + "firstDiscovered": "2025-01-09T10:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "totalCount": 5 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(5) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - LESS THAN OR EQUALS WITH DIFFERENT TIMEZONE' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ +{ + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T10:40:36.461565Z", + "firstDiscovered": "2025-01-09T10:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified<='2025-01-09T11:40:36.46156500+01:00']" + }, + "totalCount": 1 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - GREATER THAN OR EQUALS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-11T23:40:36.461565Z", + "firstDiscovered": "2025-01-11T23:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-12T21:40:36.461565Z", + "firstDiscovered": "2025-01-12T21:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified>='2025-01-11T23:40:36.461565Z']" + }, + "totalCount": 2 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + //50 + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - EQUALS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T11:40:36.461565Z", + "firstDiscovered": "2025-01-09T11:40:36.461565Z", + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@lastModified='2025-01-09T11:40:36.461565Z']" + }, + "totalCount": 1 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - GREATER THAN AND LESS THAN WITH RELIABILITY INDICATOR' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T10:40:36.461565Z", + "firstDiscovered": "2025-01-09T10:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK' and @lastModified>'2024-01-21T11:12:48.628172460Z' and @lastModified<'2025-01-21T11:12:48.628172460Z']" + }, + "totalCount": 1 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities using lastModified in metadata - GREATER THAN OR EQUALS AND LESS THAN OR EQUALS WITH DIFFERENT TIMEZONE' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "lastModified": "2025-01-09T10:40:36.461565Z", + "firstDiscovered": "2025-01-09T10:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>='2025-01-06T12:34:56.789+05:30' and @firstDiscovered<='2025-01-09T16:10:36.461565+05:30']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Get entities using lastModified in metadata - invalid timeformat' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'2025-23-23T27:12:48.62817246Z']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "Invalid timestamp: 2025-23-23T27:12:48.62817246Z" + }''') + } + }, + Contract.make { + description 'ERROR - 400: Get entities using lastModified in metadata - invalid date format' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@lastModified<'202510-11T20:12:48.62817246Z']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "Invalid timestamp: 202510-11T20:12:48.62817246Z" + }''') + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type NRCellDU with scopeFilter - LESS THAN ignored.' + request { + method GET() + url '/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]' + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId<2]" + }, + "totalCount": 6 +}''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(6) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaCapability inside the specified Polygon of AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities of type AntennaCapability by AntennaModule id" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type NRCellDU 500 meters radius of AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type NRCellDU 500 meters radius of AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type NRCellDU where AntennaModule antennaModelNumber is 5 or 501205' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'] | /serving-antennaModule/attributes[@antennaModelNumber='501205']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type NRCellDU where AntennaModule antennaModelNumber is 5 and electricalAntennaTilt is 11' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5']; /serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type AntennaModule with scopeFilter on sourceIds' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type AntennaModule with scopeFilter on sourceIds' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type NRCellDU where Sector sectorId is 2' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Missing container type for queried leaf antennaModelNumber' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@antennaModelNumber='5']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Missing container type for queried leaf antennaModelNumber" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Wrong sysntax for association id is not an attribute' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@id='5']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid parameters for association", + "details": "Invalid parameters provided for association serving-antennaModule" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type AntennaModule with scopeFilter association on AntennaCapability complex attribute STRING array - EXACT MATCH - VALUE EXISTS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[@item='456']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type AntennaModule with scopeFilter association on AntennaCapability complex attribute STRING array - EXACT MATCH - VALUE EXISTS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Root object doesnt match with entity name' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/NRCellDU/serviced-antennaCapability/attributes/eUtranFqBands[contains(@item,'45')]" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Target/Scope filter can only contain Root Object types mentioned in the path parameter" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Invalid format for association.' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/attributes/sourceIds[@item='789']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "More than one valid containerType appeared in path: attributes, sourceIds" + }''') + } + }, + Contract.make { + description 'ERROR - 400: Invalid format for association.' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/attributes/decorators[@test-app-module:textdata='Ericsson']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "More than one valid containerType appeared in path: attributes, decorators" + }''') + } + }, + Contract.make { + description 'SUCCESS - 200: Get all topology entities of type AntennaModule with scopeFilter association on AntennaCapability complex attribute STRING array - EXACT MATCH - VALUE EXISTS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9" + } + ] + } + ], + "self": { + "href": "/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + }, + "first": { + "href": "/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + }, + "prev": { + "href": "/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + }, + "next": { + "href": "/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + }, + "last": { + "href": "/domains/OAM/entity-types/ManagedElement/entities?offset=0&limit=500&scopeFilter=/managed-ocucpFunction/attributes/pLMNId[@mcc='01']" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(7) + }) + jsonPath('$.items[0].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-oam:ManagedElement[0].id', byEquality()) + } + } + }, + Contract.make { + description 'ERROR - 400: Invalid format for association.' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/managed-by-managedElement/attributes/NRCellDU/ManagedElement/attributes" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Invalid data in scopeFilter" + }''') + } + }, + Contract.make { + description 'ERROR - 400: Invalid format for association.' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/grouped-by-sector/attributes@sectorId=1" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Invalid data in scopeFilter" + }''') + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy index c8fa3f4..968ca74 100644 --- a/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -86,10 +86,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "ERROR - 400: Get topology for ODUFunction entity with non existing id 'non-existing-id'." + description "ERROR - 400: Get topology for ODUFunction entity with non existing id 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=99999'." request { method GET() - url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/ODUFunction/entities/non-existing-id" + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=99999" } response { status NOT_FOUND() @@ -99,7 +99,25 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource is not found. ID: non-existing-id" + "details": "The requested resource is not found. ID: urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=99999" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get topology for ODUFunction entity with with no supported topology id - 3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 ." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/ODUFunction/entities/3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : 3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 is not in supported format. Topology ID should start with urn:" }''') } } diff --git a/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy index 2f94858..8a51d32 100644 --- a/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU": [ { "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", - "aSide": "Sector=2", + "aSide": "urn:Sector=2", "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" } ] @@ -165,7 +165,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU": [ { "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", - "aSide": "Sector=2", + "aSide": "urn:Sector=2", "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" } ] @@ -295,10 +295,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get all relationships for long entity type name with id as LongEntityType1 (OneToOne, ManyToOne, ManyToMany and Same Entity with aSide of relationship)" + description "SUCCESS - 200: Get all relationships for long entity type name with id as urn:LongEntityType1 (OneToOne, ManyToOne, ManyToMany and Same Entity with aSide of relationship)" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships" } response { status OK() @@ -310,64 +310,64 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType1", - "aSide": "EntityType1", - "id": "RelId_OneToOne_EntityType1_LongEntityType1" + "bSide": "urn:LongEntityType1", + "aSide": "urn:EntityType1", + "id": "urn:RelId_OneToOne_EntityType1_LongEntityType1" } ] }, { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] }, { "test-built-in-module:ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType1", - "aSide": "EntityType2", - "id": "Rel_ManyToOne_EntityType2_LongEntityType1" + "bSide": "urn:LongEntityType1", + "aSide": "urn:EntityType2", + "id": "urn:Rel_ManyToOne_EntityType2_LongEntityType1" } ] }, { "test-built-in-module:ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType1", - "aSide": "EntityType1", - "id": "Rel_ManyToMany_EntityType1_LongEntityType1" + "bSide": "urn:LongEntityType1", + "aSide": "urn:EntityType1", + "id": "urn:Rel_ManyToMany_EntityType1_LongEntityType1" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500" }, "totalCount": 4 }''') } }, Contract.make { - description "SUCCESS - 200: Get all relationships for long entity type name with id as LongEntityType2 (OneToMany and Same Entity with bSide of relationship)" + description "SUCCESS - 200: Get all relationships for long entity type name with id as urn:LongEntityType2 (OneToMany and Same Entity with bSide of relationship)" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships" } response { status OK() @@ -379,55 +379,55 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "EntityType2", - "id": "Rel_OneToMany_EntityType2_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:EntityType2", + "id": "urn:Rel_OneToMany_EntityType2_LongEntityType2" } ] }, { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] }, { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType3", - "aSide": "LongEntityType2", - "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + "bSide": "urn:LongEntityType3", + "aSide": "urn:LongEntityType2", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500" }, "totalCount": 3 }''') } }, Contract.make { - description "SUCCESS - 200: Get all relationships for long entity type name with id as LongEntityType1 and with scope filter on sourceIds" + description "SUCCESS - 200: Get all relationships for long entity type name with id as urn:LongEntityType1 and with scope filter on sourceIds" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']&targetFilter=/sourceIds" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']&targetFilter=/sourceIds" } response { status OK() @@ -439,37 +439,37 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType1/relationships?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']" }, "totalCount": 1 }''') } }, Contract.make { - description "SUCCESS - 200: Get all relationships for long entity type name with id as LongEntityType3 and with scope filter on classifiers" + description "SUCCESS - 200: Get all relationships for long entity type name with id as urn:LongEntityType3 and with scope filter on classifiers" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?scopeFilter=/classifiers[@item='test-app-module:Weekend']&targetFilter=/classifiers" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?scopeFilter=/classifiers[@item='test-app-module:Weekend']&targetFilter=/classifiers" } response { status OK() @@ -481,37 +481,37 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType3", - "aSide": "LongEntityType2", - "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + "bSide": "urn:LongEntityType3", + "aSide": "urn:LongEntityType2", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType3/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Weekend']" }, "totalCount": 1 }''') } }, Contract.make { - description "SUCCESS - 200: Get all relationships for long entity type name with id as LongEntityType2 and with scope filter on decorators" + description "SUCCESS - 200: Get all relationships for long entity type name with id as urn:LongEntityType2 and with scope filter on decorators" request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]&targetFilter=/decorators" + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]&targetFilter=/decorators" } response { status OK() @@ -523,36 +523,36 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] }, { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType3", - "aSide": "LongEntityType2", - "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + "bSide": "urn:LongEntityType3", + "aSide": "urn:LongEntityType2", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" } ] } ], "self": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" }, "first": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" }, "prev": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" }, "next": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" }, "last": { - "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/urn:LongEntityType2/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'ORAN')]" }, "totalCount": 2 }''') @@ -680,7 +680,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE":[ { "bSide":"urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", - "aSide":"Sector=2", + "aSide":"urn:Sector=2", "id":"urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512" } ] @@ -750,7 +750,7 @@ import org.springframework.cloud.contract.spec.Contract description "ERROR - 404: Get all relationships for non existing NRCellDU id." request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/non-existent/relationships" + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:non-existent/relationships" } response { status NOT_FOUND() @@ -760,7 +760,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource is not found. ID: non-existent" + "details": "The requested resource is not found. ID: urn:non-existent" }''') } }, @@ -816,5 +816,244 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) } } + }, + Contract.make { + description "SUCCESS - 200 Get all relationships with entityId for ODUFunction using firstDiscovered in metadata as filter - LESS THAN" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body(''' +{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "metadata": { + "lastModified": "2025-01-08T10:40:36.46156500Z", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "RESTORED" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=7723E5D5B3332E0890EAA620C77A6A47065E15A2EA28AD83F3B3CFEA5A7E3BB5965AE78890F1BF000EAA89BF8DE209E506192BF5EA6871426603ED76CBFAF088" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "metadata": { + "lastModified": "2025-01-08T10:40:36.46156500Z", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "ADVISED" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=DDECCEFB8831FA4EB21B121BA35EAB07ED8D841B5A38580C5F3AD11E66FE73D2FC42E823C6C73288860C7562B610C3D07B6C39FD386171A3BE622096F4B3D006" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "metadata": { + "lastModified": "2025-01-13T16:40:36.461565Z", + "firstDiscovered": "2025-01-13T16:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + }, + "first": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + }, + "next": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + }, + "last": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered<'2025-01-21T11:12:48.628172460Z']" + }, + "totalCount": 3 +} + ''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.lastModified', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.lastModified', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200 Get all relationships with entityId for ODUFunction using firstDiscovered in metadata as filter - GREATER THAN" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + } + response { + status OK() + headers { + contentType('application/json') + } + body(''' +{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "metadata": { + "lastModified": "2025-01-08T10:40:36.46156500Z", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "RESTORED" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=7723E5D5B3332E0890EAA620C77A6A47065E15A2EA28AD83F3B3CFEA5A7E3BB5965AE78890F1BF000EAA89BF8DE209E506192BF5EA6871426603ED76CBFAF088" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "metadata": { + "lastModified": "2025-01-08T10:40:36.46156500Z", + "firstDiscovered": "2025-01-08T10:40:36.46156500Z", + "reliabilityIndicator": "ADVISED" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=DDECCEFB8831FA4EB21B121BA35EAB07ED8D841B5A38580C5F3AD11E66FE73D2FC42E823C6C73288860C7562B610C3D07B6C39FD386171A3BE622096F4B3D006" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "metadata": { + "lastModified": "2025-01-13T16:40:36.461565Z", + "firstDiscovered": "2025-01-13T16:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + }, + "first": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + }, + "next": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + }, + "last": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2024-01-21T11:12:48.628172460+01:00']" + }, + "totalCount": 3 +} + ''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.lastModified', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.lastModified', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.reliabilityIndicator', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200 Get all relationships with entityId for ODUFunction using firstDiscovered in metadata as filter - LESS THAN AND GREATER THAN" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + } + response { + status OK() + headers { + contentType('application/json') + } + body(''' +{ + "items": [], + "self": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + }, + "first": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + }, + "next": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + }, + "last": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19/relationships?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@firstDiscovered>'2025-01-21T11:12:48.628172460Z' and @firstDiscovered<'2025-01-31T11:12:48.628172460Z']" + }, + "totalCount": 0 +} + ''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy index 606efbb..9bb9c60 100644 --- a/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy index 7cfc7ba..f6a5b76 100644 --- a/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -299,10 +299,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get topology relationships of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS where used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2'." + description "SUCCESS - 200: Get topology relationships of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS where used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2'." request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + url "/topology-inventory/v1alpha11/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" } response { status OK() @@ -314,37 +314,37 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] } ], "self": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "first": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "prev": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "next": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "last": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType1']" }, "totalCount": 1 }''') } }, Contract.make { - description "SUCCESS - 200: Get topology relationships of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS where used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2'." + description "SUCCESS - 200: Get topology relationships of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS where used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is 'urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2'." request { method GET() - url "/topology-inventory/v1alpha11/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + url "/topology-inventory/v1alpha11/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" } response { status OK() @@ -356,27 +356,27 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] } ], "self": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" }, "first": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" }, "prev": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" }, "next": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" }, "last": { - "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='urn:LongEntityType2']" }, "totalCount": 1 }''') @@ -399,7 +399,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU": [ { "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", - "aSide": "Sector=2", + "aSide": "urn:Sector=2", "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" } ] @@ -449,7 +449,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU": [ { "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", - "aSide": "Sector=2", + "aSide": "urn:Sector=2", "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" } ] @@ -498,18 +498,18 @@ import org.springframework.cloud.contract.spec.Contract { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType2", - "aSide": "LongEntityType1", - "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + "bSide": "urn:LongEntityType2", + "aSide": "urn:LongEntityType1", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" } ] }, { "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ { - "bSide": "LongEntityType3", - "aSide": "LongEntityType2", - "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + "bSide": "urn:LongEntityType3", + "aSide": "urn:LongEntityType2", + "id": "urn:Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" } ] } diff --git a/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy index 4ae3fee..3a5241b 100644 --- a/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE": [ { "bSide": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", - "aSide": "Sector=2", + "aSide": "urn:Sector=2", "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", "sourceIds": [] } @@ -70,10 +70,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "ERROR - 400: Get relationship with non existing id 'non-existing-id'" + description "ERROR - 400: Get relationship with non existing id 'urn:non-existing-id'" request { method GET() - url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/non-existing-id" + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/urn:non-existing-id" } response { status NOT_FOUND() @@ -83,8 +83,44 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource is not found. ID: non-existing-id" + "details": "The requested resource is not found. ID: urn:non-existing-id" }''') } + }, + Contract.make { + description "SUCCESS - 200: Get relationship with metadata for specified id " + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD" + } + response { + status OK() + headers { + contentType('application/yang.data+json') + } + body('''{ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "metadata": { + "lastModified":"2025-01-13T16:40:36.461565Z", + "firstDiscovered":"2025-01-13T16:40:36.461565Z", + "reliabilityIndicator": "OK" + }, + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD", + "sourceIds": [] + } + ] + }''') + bodyMatchers { + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.lastModified', byEquality()) + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.firstDiscovered', byEquality()) + jsonPath('o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].metadata.reliabilityIndicator', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy index 4c7c99f..1789f43 100644 --- a/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy +++ b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -624,7 +624,7 @@ import org.springframework.cloud.contract.spec.Contract contentType('application/json') } body('''{ - "items": [ + "items": [ { "o-ran-smo-teiv-ran:OCUCPFunction": [ { @@ -704,7 +704,7 @@ import org.springframework.cloud.contract.spec.Contract contentType('application/json') } body('''{ - "items": [ + "items": [ { "o-ran-smo-teiv-ran:OCUCPFunction": [ { @@ -784,7 +784,7 @@ import org.springframework.cloud.contract.spec.Contract contentType('application/json') } body('''{ - "items": [ + "items": [ { "o-ran-smo-teiv-ran:NRCellDU": [ { @@ -834,10 +834,10 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 200: Get entities in RAN domain with scopeFilter on 2 different entity types and combining the condition on complex attributes" + description 'SUCCESS - 200: Get entities in RAN domain with scopeFilter on 2 different entity types and combining the condition on complex attributes' request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entities?scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + url "/topology-inventory/v1alpha11/domains/RAN/entities?scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" } response { status OK() @@ -854,34 +854,34 @@ import org.springframework.cloud.contract.spec.Contract ] }, { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10" + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" } ] }, { - "o-ran-smo-teiv-ran:OCUCPFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16" + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" } ] } ], "self": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" }, "first": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" }, "prev": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" }, "next": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" }, "last": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/ODUFunction/attributes/dUpLMNId[@mcc='456' or @mnc='83']" }, "totalCount": 3 }''') @@ -889,9 +889,9 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items', byType { occurrence(3) }) - jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) - jsonPath('$.items[2].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } }, @@ -1007,6 +1007,8 @@ import org.springframework.cloud.contract.spec.Contract "o-ran-smo-teiv-ran:ODUFunction": [ { "metadata": { + "lastModified":"2025-01-09T10:40:36.461565Z", + "firstDiscovered":"2025-01-09T10:40:36.461565Z", "reliabilityIndicator": "OK" }, "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" @@ -1036,6 +1038,9 @@ import org.springframework.cloud.contract.spec.Contract occurrence(1) }) jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.lastModified', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.firstDiscovered', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].metadata.reliabilityIndicator', byEquality()) } } }, @@ -1267,7 +1272,7 @@ import org.springframework.cloud.contract.spec.Contract description "SUCCESS - 200: Get entities of domain RAN by Sector id" request { method GET() - url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" } response { status OK() @@ -1299,19 +1304,19 @@ import org.springframework.cloud.contract.spec.Contract } ], "self": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "first": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "prev": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "next": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "last": { - "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='Sector=2']" + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector[@id='urn:Sector=2']" }, "totalCount": 3 }''') @@ -1324,5 +1329,477 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) } } + }, + Contract.make { + description "SUCCESS - 200: Get entities of domain RAN by AntennaModule id" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[@id='urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN inside the specified Polygon of AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType { + minOccurrence(1) + }) + jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType { + minOccurrence(1) + }) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN within 500 meters radius of AntennaModule' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType { + minOccurrence(1) + }) + jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType { + minOccurrence(1) + }) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN where AntennaModule electricalAntennaTilt is 11' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@electricalAntennaTilt=11]" + }, + "totalCount": 4 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(4) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN inside the specified Polygon of Sector' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[coveredBy(@geo-location, 'POLYGON((60 18, 61 18, 61 20, 60 20, 60 18))')]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN within 500 meters radius of Sector' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[withinMeters(@geo-location, 'POINT(60.4019881 18.9419888)', 500)]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN where Sector sectorId is 2' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-by-sector/attributes[@sectorId=2]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of domain RAN where NRCellDU cellLocalId is 3' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:Sector": [ + { + "id": "urn:Sector=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/grouped-nrCellDu/attributes[@cellLocalId=3]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:Sector[0].id', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy index df9c264..0ce5786 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -232,5 +232,67 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using association name - contains" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction/decorators[contains(@test-app-module:textdata, 'ORAN')]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy index c819480..7e74a91 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy index f4d96c2..b7e7d70 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -232,5 +232,157 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) } } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using association name - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "attributes": { + "cellLocalId": 1 + } + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", + "attributes": { + "cellLocalId": 2 + } + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", + "attributes": { + "cellLocalId": 3 + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(cellLocalId)&scopeFilter=/NRCellDU/provided-by-oduFunction/decorators[@test-app-module:textdata='ORAN']" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].attributes.cellLocalId', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].attributes.cellLocalId', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].attributes.cellLocalId', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using contains with empty string. " + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/decorators[contains(@test-app-module:textdata,'')]" + }, + "totalCount": 5 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(5) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } } ] diff --git a/teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy b/teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy index bc53de9..e44c18d 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import org.springframework.cloud.contract.spec.Contract "test-app-module:intdata": 123 }, "entityIds": [ - "WRONG_ENTITY_ID", + "urn:WRONG_ENTITY_ID", "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" ], "operation": "merge" @@ -52,7 +52,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []" + "details": "The requested resource with the following ids cannot be found. Entities: [urn:WRONG_ENTITY_ID] Relationships: []" }''') bodyMatchers { jsonPath('$.status', byEquality()) @@ -61,6 +61,39 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "NOT FOUND - 404: Merge decorators where entity id does not start with urn:" + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Budapest", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "merge" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : WRONG_ENTITY_ID is not in supported format. Topology ID should start with urn:" + }''') + } + }, Contract.make { description "NOT FOUND - 404: Merge decorators with wrong relationship ids." request { @@ -77,7 +110,7 @@ import org.springframework.cloud.contract.spec.Contract }, "relationshipIds": [ "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", - "WRONG_RELATIONSHIP_ID" + "urn:WRONG_RELATIONSHIP_ID" ], "operation": "merge" }''') @@ -90,7 +123,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]" + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [urn:WRONG_RELATIONSHIP_ID]" }''') bodyMatchers { jsonPath('$.status', byEquality()) @@ -99,6 +132,39 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "ERROR - 400: Merge decorators where relationship id does not start with urn:" + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Budapest", + "test-app-module:intdata": 123 + }, + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", + "WRONG_RELATIONSHIP_ID" + ], + "operation": "merge" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : WRONG_RELATIONSHIP_ID is not in supported format. Topology ID should start with urn:" + }''') + } + }, Contract.make { description "NOT FOUND - 404: Merge decorators with wrong entity and relationship ids." request { @@ -114,11 +180,11 @@ import org.springframework.cloud.contract.spec.Contract "test-app-module:intdata": 123 }, "entityIds": [ - "WRONG_ENTITY_ID", + "urn:WRONG_ENTITY_ID", "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" ], "relationshipIds": [ - "WRONG_RELATIONSHIP_ID" + "urn:WRONG_RELATIONSHIP_ID" ], "operation": "merge" }''') @@ -131,7 +197,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "NOT_FOUND", "message": "Resource Not Found", - "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: [WRONG_RELATIONSHIP_ID]" + "details": "The requested resource with the following ids cannot be found. Entities: [urn:WRONG_ENTITY_ID] Relationships: [urn:WRONG_RELATIONSHIP_ID]" }''') bodyMatchers { jsonPath('$.status', byEquality()) diff --git a/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy index b222e1d..00dd9d6 100644 --- a/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy +++ b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy index 729b26b..19a53f1 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -95,7 +95,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-common-yang-types", "domain": "", - "revision": "2024-10-04", + "revision": "2025-01-17", "content": { "href": "/schemas/o-ran-smo-teiv-common-yang-types/content" } diff --git a/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy index 2a6ba12..62c21d8 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy index 949cc6b..7fac0a1 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -837,7 +837,7 @@ import org.springframework.cloud.contract.spec.Contract ' } ' + ' } ' + ' ' + - ' identity UPDATEties_model.module_referenceSETstatusDELETINGWHEREnameodu-function-model { ' + + ' identity UPDATEteiv_model.module_referenceSETstatusDELETINGWHEREnameodu-function-model { ' + ' base test:classifiers; ' + ' } ' + ' ' + diff --git a/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy index 5c486fa..28d6615 100644 --- a/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy +++ b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/groups/00_createGroup.groovy b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy index 699d7fa..fd35df1 100644 --- a/teiv/src/test/resources/contracts/groups/00_createGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -112,7 +112,7 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 201: Create a dynamic getRelationshipsForEntityId group" + description "SUCCESS - 201: Create a dynamic getRelationshipsForEntityId group where entity id doesnt exists in teiv" request { method POST() url("/topology-inventory/v1alpha11/groups") @@ -127,7 +127,7 @@ import org.springframework.cloud.contract.spec.Contract "queryType": "getRelationshipsForEntityId", "domain": "RAN", "entityTypeName": "NRCellDU", - "entityId": "NRCellDU-1" + "entityId": "urn:NRCellDU-1" } }''') } @@ -144,7 +144,7 @@ import org.springframework.cloud.contract.spec.Contract "queryType": "getRelationshipsForEntityId", "domain": "RAN", "entityTypeName": "NRCellDU", - "entityId": "NRCellDU-1" + "entityId": "urn:NRCellDU-1" }, "members": { "href": "/groups/urn:o-ran:smo:teiv:group=bbeb1db4-88dc-47b3-aa07-fdad50145b16/members" @@ -239,21 +239,21 @@ import org.springframework.cloud.contract.spec.Contract { "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { - "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418" + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=EA8BF964B4888BFD1991D8E2ECDFA7723118D3829C1378ACBB5484F9ADE328957641013EDF2BEC80CB8E4E0A46CC2D85B960EF25ABF61CC8601095948E368624" } ] }, { "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { - "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=9CD8DCA1FE61CE75" + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=7EB5B959010A84E95BFA6CAA314120CC335007FCDB2947A53A6E19171BB8742965A874FB89B73CD21EB790E52C8E6DC129B35469BA3867DAC67F4DE72E60185E" } ] }, { "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ { - "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6C56" + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=86084B5A80FAC7339117CEB91A4838FAC28C50AF00C9A13DF66FFA497356A8F440626A935B9621D4C833F0A6DE2722EDC9A312E506D80235A8C1BF54D8DFACC8" } ] } @@ -311,6 +311,37 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + Contract.make { + description "ERROR - 400: Create a dynamic group with 'static' group type" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "static", + "criteria": { + "queryType": "getRelationshipsByType", + "domain": "RAN", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid type specified", + "details": "A dynamic group cannot be created of type 'static'" + }''') + } + }, Contract.make { description "ERROR - 400: Create a dynamic group with invalid group type" request { @@ -333,14 +364,12 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/problem+json') + contentType('application/json') } body('''{ - "type": "about:blank", - "title": "Bad Request", - "status": 400, - "detail": "Failed to read request", - "instance": "/topology-inventory/v1alpha11/groups" + "status": "BAD_REQUEST", + "message": "Invalid type specified", + "details": "Invalid group type. Only 'static' or 'dynamic' types are allowed" }''') } }, @@ -366,14 +395,12 @@ import org.springframework.cloud.contract.spec.Contract response { status BAD_REQUEST() headers { - contentType('application/problem+json') + contentType('application/json') } body('''{ - "type": "about:blank", - "title": "Bad Request", - "status": 400, - "detail": "Failed to read request", - "instance": "/topology-inventory/v1alpha11/groups" + "status": "BAD_REQUEST", + "message": "Invalid type specified", + "details": "Invalid query type. Only 'getRelationshipsForEntityId', 'getEntitiesByDomain', 'getEntitiesByType' & 'getRelationshipsByType' are supported." }''') } }, @@ -409,6 +436,104 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + Contract.make { + description "ERROR - 400: Create a dynamic group with unsupported domain for getRelationshipsByType" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsByType", + "domain": "bla", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown domain", + "details": "Unknown domain: bla, known domains: [CLOUD, EQUIPMENT, OAM, RAN, REL_CLOUD_RAN, REL_EQUIPMENT_RAN, REL_OAM_CLOUD, REL_OAM_RAN, TEIV, TEST]" + }''') + } + }, + //10 + Contract.make { + description "ERROR - 400: Create a dynamic group with invalid filter" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsForEntityId", + "domain": "TEIV", + "entityTypeName": "NRCellDU", + "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "targetFilter": "/NRCellDU/attributes(nCI)", + "scopeFilter": "/NRCellDU/attributes[@cellLocalId=2]" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid target filter, only relationship conditions can be provided", + "details": "NRCellDU is not a valid relation" + }''') + } + }, + Contract.make { + description "ERROR - 400:: Create a dynamic getRelationshipsForEntityId group where entity id does not start with urn:" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsForEntityId", + "domain": "RAN", + "entityTypeName": "NRCellDU", + "entityId": "NRCellDU-1" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Topology ID format not supported", + "details": "Topology ID : NRCellDU-1 is not in supported format. Topology ID should start with urn:" + }''') + } + }, Contract.make { description "ERROR - 400: Create a static group with no providedMembers specified" request { @@ -530,6 +655,120 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + Contract.make { + description "ERROR - 400: Create a static group with invalid module name for the entity type" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:ManagedElement": [ + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=1" + }, + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid topology type 'o-ran-smo-teiv-ran:ManagedElement', not found in the model" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with wrong topology type format" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [ + { + "o-ran-smo-teiv-oam:ManagedElement:bla": [ + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=1" + }, + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Topology type must be in the format 'moduleName:topologyTypeName'. Provided: o-ran-smo-teiv-oam:ManagedElement:bla" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with wrong topology id where topology id doesnt start with urn:" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [ + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=1" + }, + { + "id": "3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Topology id 3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=2 is not in supported format. Provided members id should start with urn:" + }''') + } + }, Contract.make { description "ERROR - 400: Create a static group with invalid providedMembers(list contains empty object)" request { @@ -559,6 +798,7 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + //20 Contract.make { description "ERROR - 400: Create a static group with invalid providedMembers(list contains empty object)" request { @@ -854,11 +1094,79 @@ import org.springframework.cloud.contract.spec.Contract }''') } }, + Contract.make { + description "ERROR - 400: Create a dynamic group with 'static' group type" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "dynamic", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid type specified", + "details": "A static group cannot be created of type 'dynamic'" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a dynamic group with invalid group type" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "invalidGroup", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid type specified", + "details": "Invalid group type. Only 'static' or 'dynamic' types are allowed" + }''') + } + }, Contract.make { description "ERROR - 400: Invalid endpoint" request { method POST() - url("/topology-inventory/v1alpha11/ties-groups") + url("/topology-inventory/v1alpha11/teiv-groups") headers { accept("application/json") contentType("application/json") @@ -881,9 +1189,9 @@ import org.springframework.cloud.contract.spec.Contract } body('''{ "status": "BAD_REQUEST", - "message": "No static resource topology-inventory/v1alpha11/ties-groups.", + "message": "No static resource topology-inventory/v1alpha11/teiv-groups.", "details": null }''') } - } + } //30 ] diff --git a/teiv/src/test/resources/contracts/groups/01_getGroups.groovy b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy index 16afd33..498177c 100644 --- a/teiv/src/test/resources/contracts/groups/01_getGroups.groovy +++ b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,9 +78,9 @@ import org.springframework.cloud.contract.spec.Contract "href": "/groups?offset=2&limit=2" }, "last": { - "href": "/groups?offset=28&limit=2" + "href": "/groups?offset=32&limit=2" }, - "totalCount": 29 + "totalCount": 33 }''') bodyMatchers { jsonPath('$.items', byType { diff --git a/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy index 1a1cb29..1bd72e2 100644 --- a/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy +++ b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -207,12 +207,12 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "INTERNAL_SERVER_ERROR", "message": "Criteria deserialization exception", - "details": "Could not resolve subtype of [simple type, class org.oran.smo.teiv.api.model.OranTeivCriteria]: missing type id property 'queryType'\\n at [Source: (String)\\"{\\"criteria\\":{\\"targetFilter\\":\\"\\\\/sourceIds\\",\\"domain\\":\\"RAN\\",\\"entityTypeName\\":\\"ODUFunction\\",\\"queryType\\":\\"getEntitiesByType\\"}}\\"; line: 1, column: 121]" + "details": "Could not resolve subtype of [simple type, class org.oran.smo.teiv.api.model.OranTeivCriteria]: missing type id property 'queryType'\\n" }''') bodyMatchers { jsonPath('$.status', byEquality()) jsonPath('$.message', byEquality()) - jsonPath('$.details', byEquality()) + jsonPath('$.details', byRegex("Could not resolve subtype of \\[simple type, class org\\.oran\\.smo\\.teiv\\.api\\.model\\.OranTeivCriteria\\]: missing type id property 'queryType'[\\s\\S]*")) } } }, diff --git a/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy index 120e884..c29bdcf 100644 --- a/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/groups/04_putGroup.groovy b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy index a1ff452..3242238 100644 --- a/teiv/src/test/resources/contracts/groups/04_putGroup.groovy +++ b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/groups/05_getMembers.groovy b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy index 23c5ae2..7cbec9e 100644 --- a/teiv/src/test/resources/contracts/groups/05_getMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -526,6 +526,69 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "SUCCESS - 200: Get the members of a dynamic group when valid target filter & valid scope filter)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_NRCELLDU=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616" + ] + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217/members?offset=0&limit=10" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].sourceIds[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].sourceIds[1]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].sourceIds[2]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].sourceIds[3]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_NRCELLDU[0].sourceIds[4]', byEquality()) + } + } + }, Contract.make { description "ERROR - 404: Get a static group by id that does not exists" request { @@ -542,7 +605,7 @@ import org.springframework.cloud.contract.spec.Contract } }, Contract.make { - description "SUCCESS - 404: Get the members of a dynamic group with getRelationshipsForEntityId queryType where entity id doesn't exists" + description "ERROR - 404: Get the members of a dynamic group with getRelationshipsForEntityId queryType where entity id doesn't exists" request { method GET() url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440004/members") @@ -569,8 +632,8 @@ import org.springframework.cloud.contract.spec.Contract status BAD_REQUEST() body('''{ "status": "BAD_REQUEST", - "message": "Invalid data in scopeFilter", - "details": "Unable to resolve attributes" + "message": "Grammar error", + "details": "Invalid data in scopeFilter" }''') } }, @@ -588,5 +651,35 @@ import org.springframework.cloud.contract.spec.Contract "details": "The requested group is not found" }''') } + }, + Contract.make { + description "ERROR - 400: No target filter exists & invalid scope filter" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440218/members") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Filter Error", + "details": "TopologyObjects given in scopeFilter and targetFilter are not matching" + }''') + } + }, + Contract.make { + description "ERROR - 400: Invalid target filter & invalid scope filter" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440220/members") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid target filter, only relationship conditions can be provided", + "details": "NRCellDU is not a valid relation" + }''') + } } ] diff --git a/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy index 6e8ca04..f6fc5e9 100644 --- a/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy index 3bfbaff..72463a3 100644 --- a/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy +++ b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,7 +64,7 @@ import org.springframework.cloud.contract.spec.Contract "operation": "merge", "providedMembers": [ { - "o-ran-smo-teiv-ran:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=1" }, @@ -468,6 +468,43 @@ import org.springframework.cloud.contract.spec.Contract } } }, + Contract.make { + description "ERROR - 400: Merge into provided members in an existing static topology group with invalid module name for the entity type" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/provided-members-operations") + headers { + contentType("application/json") + } + + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:ManagedElement": [ + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=1" + }, + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,ManagedElement=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid topology type 'o-ran-smo-teiv-ran:ManagedElement', not found in the model" + }''') + } + }, Contract.make { description "ERROR - 404: Merge provided members into a non existing topology group" request { @@ -627,7 +664,7 @@ import org.springframework.cloud.contract.spec.Contract "operation": "remove", "providedMembers": [ { - "o-ran-smo-teiv-ran:UnKnown": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1, ManagedElement=1" }, @@ -647,7 +684,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "BAD_REQUEST", "message": "Provided members update exception", - "details": "The specified topology entity/relation: o-ran-smo-teiv-ran:UnKnown is not part of the group." + "details": "The specified topology entity/relation: o-ran-smo-teiv-oam:ManagedElement is not part of the group." }''') bodyMatchers { jsonPath('$.status', byEquality()) diff --git a/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql b/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql index 8a76f68..c5d26c1 100644 --- a/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql +++ b/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql @@ -29,27 +29,27 @@ GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser; -CREATE SCHEMA IF NOT EXISTS ties_data; -ALTER SCHEMA ties_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_data; +ALTER SCHEMA teiv_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_data' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_data' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE OR REPLACE FUNCTION ties_data.create_enum_type( +CREATE OR REPLACE FUNCTION teiv_data.create_enum_type( schema_name TEXT, type_name TEXT, enum_values TEXT[] ) RETURNS VOID AS $$ BEGIN @@ -59,24 +59,24 @@ BEGIN END; $$ language 'plpgsql'; -SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); +SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( +CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" ( "id" TEXT, "hashed_id" BYTEA ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'PK_responsible_adapter_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'responsible_adapter', 'UNIQUE_responsible_adapter_hashed_id', - 'ALTER TABLE ties_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' -);CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( + 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");' +);CREATE TABLE IF NOT EXISTS teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, @@ -86,13 +86,13 @@ SELECT ties_data.create_constraint_if_not_exists( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( +CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_AntennaCapability" TEXT, @@ -102,13 +102,13 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "metadata" jsonb ); -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -117,13 +117,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCloudNamespace" TEXT, @@ -133,13 +133,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -160,25 +160,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( "id" TEXT, "aSide_NodeCluster" TEXT, "bSide_OCloudSite" TEXT, @@ -188,13 +188,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -203,13 +203,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, @@ -224,19 +224,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -246,13 +246,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, @@ -283,25 +283,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_Site" ( "id" TEXT, "geo-location" geography, "name" TEXT, @@ -311,13 +311,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-oam_ManagedElement" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -331,19 +331,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ( "id" TEXT, "eUtranFqBands" jsonb, "geranFqBands" jsonb, @@ -354,13 +354,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellCU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -378,19 +378,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellDU" ( "id" TEXT, "cellLocalId" INTEGER, "nCI" BIGINT, @@ -414,25 +414,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "id" TEXT, "arfcnDL" INTEGER, "arfcnUL" INTEGER, @@ -463,31 +463,31 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "id" TEXT, "nearRtRicId" BIGINT, "pLMNId" jsonb, @@ -503,19 +503,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "id" TEXT, "gNBCUName" TEXT, "gNBId" BIGINT, @@ -533,19 +533,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "id" TEXT, "gNBId" BIGINT, "gNBIdLength" INTEGER, @@ -562,19 +562,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -592,19 +592,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ORUFunction" ( "id" TEXT, "oruId" BIGINT, "CD_sourceIds" jsonb, @@ -619,19 +619,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_Sector" ( "id" TEXT, "azimuth" DECIMAL, "geo-location" geography, @@ -642,13 +642,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUCPFunction" TEXT, @@ -658,13 +658,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_OCUUPFunction" TEXT, @@ -674,13 +674,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_ODUFunction" TEXT, @@ -690,13 +690,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( "id" TEXT, "aSide_AntennaModule" TEXT, "bSide_NRCellDU" TEXT, @@ -706,794 +706,794 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMO "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_CloudifiedNF', 'PK_o-ran-smo-teiv-cloud_CloudifiedNF_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_CloudifiedNF_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'PK_o-ran-smo-teiv-cloud_NFDeployment_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NFDeployment_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NodeCluster', 'PK_o-ran-smo-teiv-cloud_NodeCluster_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_NodeCluster_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'PK_o-ran-smo-teiv-cloud_OCloudNamespace_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudNamespace_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudSite', 'PK_o-ran-smo-teiv-cloud_OCloudSite_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ADD CONSTRAINT "PK_o-ran-smo-teiv-cloud_OCloudSite_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'PK_o-ran-smo-teiv-equipment_AntennaModule_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_Site', 'PK_o-ran-smo-teiv-equipment_Site_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'PK_o-ran-smo-teiv-oam_ManagedElement_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_AntennaCapability', 'PK_o-ran-smo-teiv-ran_AntennaCapability_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'PK_o-ran-smo-teiv-ran_NRCellCU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'PK_o-ran-smo-teiv-ran_NRCellDU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'PK_o-ran-smo-teiv-ran_NRSectorCarrier_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'PK_o-ran-smo-teiv-ran_NearRTRICFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NearRTRICFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'PK_o-ran-smo-teiv-ran_OCUCPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'PK_o-ran-smo-teiv-ran_OCUUPFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'PK_o-ran-smo-teiv-ran_ODUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'PK_o-ran-smo-teiv-ran_ORUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ORUFunction_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_Sector', 'PK_o-ran-smo-teiv-ran_Sector_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'PK_E551D02D14B3C04A565DC73A386BEB29627D3C08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "PK_E551D02D14B3C04A565DC73A386BEB29627D3C08" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'PK_F41873285F3BD831F63C6041B4356A063403406D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5', - 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' + 'ALTER TABLE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5" FOREIGN KEY ("bSide_NearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CFC235E0404703D1E4454647DF8AAE2C193DB402', 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06', - 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' + 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_A08D274894ECB6799E56C2089A494AF0345B9B16', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_A08D274894ECB6799E56C2089A494AF0345B9B16" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE', 'FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ADD CONSTRAINT "FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F" FOREIGN KEY ("bSide_OCloudNamespace") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0" FOREIGN KEY ("REL_FK_comprised-by-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC" UNIQUE ("REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9" FOREIGN KEY ("REL_FK_serviced-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NFDeployment', 'UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ADD CONSTRAINT "UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC" UNIQUE ("REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92" FOREIGN KEY ("aSide_NodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE', 'FK_888BF6FF782916E61B3FE80643A549A1CFDB6117', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES ties_data."o-ran-smo-teiv-cloud_OCloudSite" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ADD CONSTRAINT "FK_888BF6FF782916E61B3FE80643A549A1CFDB6117" FOREIGN KEY ("bSide_OCloudSite") REFERENCES teiv_data."o-ran-smo-teiv-cloud_OCloudSite" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES ties_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NodeCluster" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-cloud_OCloudNamespace', 'UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" ADD CONSTRAINT "UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0" UNIQUE ("REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES ties_data."o-ran-smo-teiv-equipment_Site" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES teiv_data."o-ran-smo-teiv-equipment_Site" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'FK_078764B2F3D613D44CC6E3586F564C83164D2481', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-equipment_AntennaModule', 'UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0', - 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'FK_899B8130A861D1450FC49D3159D8B29C0628A717', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_899B8130A861D1450FC49D3159D8B29C0628A717" FOREIGN KEY ("REL_FK_deployed-as-cloudifiedNF") REFERENCES teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708', - 'ALTER TABLE ties_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellCU', 'UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."o-ran-smo-teiv-ran_Sector" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRCellDU', 'UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_65D538D54EB33081C808540235FEB28823428E64', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NRSectorCarrier', 'UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_NearRTRICFunction', 'UNIQUE_E020461673334EB824643649B6B31670FB064EC8', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ADD CONSTRAINT "UNIQUE_E020461673334EB824643649B6B31670FB064EC8" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'FK_122DD9709032528D161177B3624AD7AAF6589005', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_122DD9709032528D161177B3624AD7AAF6589005" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', 'UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', 'UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ODUFunction', 'UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_ORUFunction', 'UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ORUFunction" ADD CONSTRAINT "UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION', 'FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ADD CONSTRAINT "FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6" FOREIGN KEY ("bSide_OCUCPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION', 'FK_8585D545BC37A473A298E0F5F5942F897A7105B1', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ADD CONSTRAINT "FK_8585D545BC37A473A298E0F5F5942F897A7105B1" FOREIGN KEY ("bSide_OCUUPFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES ties_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79" FOREIGN KEY ("aSide_NFDeployment") REFERENCES teiv_data."o-ran-smo-teiv-cloud_NFDeployment" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION', 'FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ADD CONSTRAINT "FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08" FOREIGN KEY ("bSide_ODUFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU', 'FK_8605800A4923C52258A8CE3989E18A7C93D22E8C', - 'ALTER TABLE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES ties_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id");' ); -CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F97E398B17532BCD9923CE0CF98E73227D890037" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); +CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); -CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); +CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON teiv_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); -CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); +CREATE INDEX IF NOT EXISTS "IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN ("REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER"); -CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators" ON teiv_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); +CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"); -CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); +CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"); -CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_634619CF7333EBC0AFDE990900B79220FC626EBA" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON ties_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); +CREATE INDEX IF NOT EXISTS "IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF"); -CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId"); -CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6891C1BB8EE214340A362906C08955E8ACC1C597" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON ties_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); +CREATE INDEX IF NOT EXISTS "IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"); -CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON ties_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); +CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"); -CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); +CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"); -CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_986B2223E72FF79237337329F4C3BB9DA9025A34" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); +CREATE INDEX IF NOT EXISTS "IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0ECC814A408874C9F8E73EEE3968984A6345A606" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON ties_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_50209F1FF59B49F79FF194887B631994F2B5148A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON ties_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON ties_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON ties_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON teiv_data."o-ran-smo-teiv-ran_ORUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_10BCC6B44663A8D5431668BEE5DF80423420C616" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_03F9C6A2FA82614A788443AC6044BCED2401C465" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_64B7C127C01069009A3FB13592DAE249B0029283" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5996D077978D38D0C1A951A262F1F7E1E339F052" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators"); -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ODUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_Site"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_Site"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NodeCluster"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NodeCluster"; -ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUCPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; +ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU"; -ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; +ANALYZE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_CloudifiedNF"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDeployment"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDeployment"; -ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability"; -ANALYZE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; +ANALYZE teiv_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; -ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; +ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule"; -ANALYZE ties_data."o-ran-smo-teiv-ran_ORUFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_ORUFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellCU"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellCU"; -ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; +ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; -ANALYZE ties_data."o-ran-smo-teiv-ran_OCUUPFunction"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction"; -ANALYZE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier"; -ANALYZE ties_data."o-ran-smo-teiv-ran_Sector"; +ANALYZE teiv_data."o-ran-smo-teiv-ran_Sector"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudSite"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudSite"; -ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace"; +ANALYZE teiv_data."o-ran-smo-teiv-cloud_OCloudNamespace"; COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql b/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql index 3119fb1..dca692d 100644 --- a/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql +++ b/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql @@ -21,21 +21,21 @@ BEGIN; -DROP SCHEMA IF EXISTS ties_model cascade; -CREATE SCHEMA IF NOT EXISTS ties_model; -ALTER SCHEMA ties_model OWNER TO :pguser; +DROP SCHEMA IF EXISTS teiv_model cascade; +CREATE SCHEMA IF NOT EXISTS teiv_model; +ALTER SCHEMA teiv_model OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.hash_info ( +CREATE TABLE IF NOT EXISTS teiv_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, "type" VARCHAR(511) ); -CREATE TABLE IF NOT EXISTS ties_model.module_reference ( +CREATE TABLE IF NOT EXISTS teiv_model.module_reference ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "domain" TEXT, @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS ties_model.module_reference ( "content" TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_model.entity_info ( +CREATE TABLE IF NOT EXISTS teiv_model.entity_info ( "storedAt" TEXT PRIMARY KEY, "name" TEXT NOT NULL, "moduleReferenceName" TEXT NOT NULL, "attributeNames" jsonb DEFAULT '[]'::jsonb, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( +CREATE TABLE IF NOT EXISTS teiv_model.relationship_info ( "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, @@ -70,12 +70,12 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "connectSameEntity" BOOLEAN NOT NULL, "moduleReferenceName" TEXT NOT NULL, PRIMARY KEY ("name", "moduleReferenceName"), - FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE + FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE, + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE ); -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN CD_sourceIds CD_sourceIds COLUMN @@ -465,7 +465,7 @@ totalTilt totalTilt COLUMN verticalBeamWidth verticalBeamWidth COLUMN \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; _3gpp-common-yang-extensions urn:3gpp:sa5:_3gpp-common-yang-extensions \N [] 2019-06-23 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZHVsZSBkZWZpbmVzIFlBTkcgZXh0ZW5zaW9ucyBuZWVkZWQgCiAgICAzR1BQIFlBTkcgbW9kZWxpbmcuCgogICAgQ29weXJpZ2h0IChjKSAyMDE5IDNHUFAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgRXh0ZW5zaW9ucyBNVVNUIGJlIGRlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUKICAgIGRlc2NyaXB0aW9uIHN0YXRlbWVudDoKICAgICAgICAtIFdoYXQgaXMgdGhpcyBzdGF0ZW1lbnQuCiAgICAgICAgLSBOZXdsaW5lLAogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSB4eHggc3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIFRoaXMgc3RhdGVtZW50IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgc3Vic3RhdGVtZW50cyB3aXRoCiAgICAgICAgY2FyZGluYWxpdHkgeC4ueS4KICAgICAgICAtIE5ld2xpbmUKICAgICAgICAtIElzIGNoYW5naW5nIHRoaXMgc3RhdGVtZW50IGFuIGVkaXRvcmlhbCwgQkMoYmFja3dhcmRzIGNvbXBhdGlibGUpIAogICAgICAgIG9yIE5CQyhub24tQkMpIGNoYW5nZT8KICAgICAgICAtIE5ld2xpbmUuCiAgICAgICAgLSBUaGUgYXJndW1lbnQgaXRzIG1lYW5pbmcgYW5kIHR5cGUuIFByZWZlcmFibHkgdXNlIFlBTkcgdHlwZXMgYW5kCiAgICAgICAgICBjb25zdHJhaW50cyB0byBkZWZpbmUgdGhlIGFyZ3VtZW50J3MgdHlwZS4KCiAgICBBbnkgZXh0ZW5zaW9uIHN0YXRlbWVudCBjYW4gYmUgYWRkZWQgd2l0aCBhCiAgICBkZXZpYXRpb24vZGV2aWF0ZSBhZGQgc3RhdGVtZW50LiBJbiB0aGlzIGNhc2UgdGhlIHJlc3RyaWN0aW9uIGFib3V0CiAgICB0aGUgcGFyZW50IHN0YXRlbWVudCBvZiB0aGUgZXh0ZW5zaW9uIFNIQUxMIGJlIGV2YWx1YXRlZCBiYXNlZCBvbiB0aGUKICAgIHRhcmdldCBvZiB0aGUgZGV2aWF0aW9uIHN0YXRlbWVudC4KCiAgICBTdXBwb3J0IGZvciB0aGlzIG1vZHVsZSBkb2VzIG5vdCBtZWFuIHRoYXQgYSBZQU5HIHNlcnZlciBpbXBsZW1lbnRzCiAgICBzdXBwb3J0IGZvciBlYWNoIG9mIHRoZXNlIGV4dGVuc2lvbnMuCiAgICBJbXBsZW1lbnRlcnMgb2YgZWFjaCBzcGVjaWZpYyBtb2R1bGUgdXNpbmcgYW4gZXh0ZW5zaW9ucyBNVVNUIGNoZWNrCiAgICBpZiB0aGUgc2VydmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIHVzZWQgZXh0ZW5zaW9uLgogICAgTm90ZTogbW9kdWxlcyB1c2UgbWFueSBleHRlbnNpb25zIHdoaWNoIGluZGl2aWR1YWwKICAgIGltcGxlbWVudGF0aW9ucyBNQVkgb3IgTUFZIE5PVCBzdXBwb3J0LgogICAgSWYgc3VwcG9ydCBmb3IgYW4gZXh0ZW5zaW9uIGlzIG1pc3NpbmcgdGhlIGV4dGVuc2lvbiBzdGF0ZW1lbnQgbmVlZHMKICAgIGluZGl2aWR1YWwgaGFuZGxpbmcgb3IgaXQgU0hPVUxEIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kdWxlIHVzaW5nCiAgICB0aGUgZXh0ZW5zaW9uIGUuZy4gd2l0aCBhIGRldmlhdGlvbi4KICAgICAgICAgICI7CgogIHJldmlzaW9uICIyMDE5LTA2LTIzIiB7CiAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCB2ZXJzaW9uIjsKICB9CgogIGV4dGVuc2lvbiBpblZhcmlhbnQgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlIGRhdGEgbm9kZSBjYW4gb25seSBiZSBzZXQgd2hlbiBpdHMKICAgICAgcGFyZW50IGRhdGEgbm9kZSBpcyBiZWluZyBjcmVhdGVkLiBUbyBjaGFuZ2UgdGhlIHZhbHVlIGFmdGVyIHRoYXQsIHRoZQogICAgICBwYXJlbnQgZGF0YSBub2RlIG11c3QgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIHdpdGggdGhlIGRhdGEgbm9kZQogICAgICBoYXZpbmcgdGhlIG5ldyB2YWx1ZS4KCiAgICAgIEl0IGlzIHVubmVjZXNzYXJ5IHRvIHVzZSBhbmQgTVVTVCBOT1QgYmUgdXNlZCBmb3Iga2V5IGxlYWZzLgoKICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSBsZWFmLCBsZWFmLWxpc3QsIGxpc3QgCiAgICAgIHN0YXRlbWVudHMgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0IAogICAgICBoYXMgYSBkZWZhdWx0IHN0YXRlbWVudCBvciB0aGUgdHlwZSB1c2VkIGZvciB0aGUgZGF0YSBub2RlIAogICAgICBoYXMgYSBkZWZhdWx0IHZhbHVlLgogICAgICBUaGUgc3RhdGVtZW50IE1VU1QgTk9UIGJlIHVzZWQgZm9yIGNvbmZpZz1mYWxzZSBkYXRhIG9yIGluIGFuIAogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9 _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbCAKICAgIGluZm9ybWF0aW9uIGNsYXNzZXMgdXNlZCBmb3IgbWFuYWdlbWVudCBvZiA1RyBuZXR3b3JrcyBhbmQgCiAgICBuZXR3b3JrIHNsaWNpbmcuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMi0wNy0yNiB7IHJlZmVyZW5jZSBDUi0wMTgwIDsgfQogIHJldmlzaW9uIDIwMjItMDItMDkgeyByZWZlcmVuY2UgIkNSLTAxNDQiOyB9CiAgcmV2aXNpb24gMjAyMS0xMS0wMSB7IHJlZmVyZW5jZSAiQ1ItMDE0MSI7IH0KICAKICByZXZpc2lvbiAyMDIxLTA5LTMwIHsKICAgIGRlc2NyaXB0aW9uICJBZGRlZCBMb25naXR1ZGUsIExhdGl0dWRlLCBUZW50aE9mRGVncmVlcywgT25PZmYuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDEzOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTExLTA2IHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGluY29ycmVjdCBTLU5TU0FJIGRlZmluaXRpb25zLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMTgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0wMy0xMCB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBmYXVsdHkgd2hlbiBzdGF0ZW1lbnRzLiI7CiAgICByZWZlcmVuY2UgIlNQLTIwMDIyOSI7CiAgfQogCiAgcmV2aXNpb24gMjAxOS0xMC0yNSB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTWFuYWdlZE5GUHJvZmlsZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTQ0NTciOwogIH0KCiAgcmV2aXNpb24gMjAxOS0xMC0xNiB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgU0FQIGFuZCB1c2FnZVN0YXRlLiI7CiAgICByZWZlcmVuY2UgIlM1LTE5MzUxOCI7CiAgfQoKICByZXZpc2lvbiAyMDE5LTA2LTIzIHsKICAgIHJlZmVyZW5jZSAgIkluaXRpYWwgdmVyc2lvbi4iOwogIH0KCiAgdHlwZWRlZiBFbmFibGVkRGlzYWJsZWQgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgOwogICAgICBlbnVtIEVOQUJMRUQgOwogICAgfQogIH0KICAKICBncm91cGluZyBQcm9jZXNzTW9uaXRvciB7CiAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgYXR0cmlidXRlcyB0byBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZiBwcm9jZXNzZXMgCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuIAogICAgICBJdCBtYXkgYmUgdXNlZCBhcyBkYXRhIHR5cGUgZm9yIGRlZGljYXRlZCBwcm9ncmVzcyBtb25pdG9yIGF0dHJpYnV0ZXMgCiAgICAgIHdoZW4gc3BlY2lmeWluZyB0aGUgbWFuYWdlbWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSBwcm9jZXNzZXMuIAogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LiAKICAgICAgRm9yIHNvbWUgYXR0cmlidXRlcyBzcGVjaWFsaXNhdGlvbnMgbWF5IGJlIHByb3ZpZGVkIHdoZW4gc3BlY2lmeWluZyBhIAogICAgICBjb25jcmV0ZSBwcm9jZXNzIHJlcHJlc2VudGF0aW9uLgoKICAgICAgSWYgYSBtYW5hZ2VtZW50IG9wZXJhdGlvbiBvbiBzb21lIElPQ3MgdHJpZ2dlcnMgYW4gYXNzb2NpYXRlZCAKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkIAogICAgICBhbHNvIHJlc3VsdCBpbiBjcmVhdGluZyBhbiBhdHRyaWJ1dGUgbmFtZWQgJ3Byb2Nlc3NNb25pdG9yJyAob2YgdHlwZSAKICAgICAgJ1Byb2Nlc3NNb25pdG9yJykgaW4gdGhlc2UgSU9DKHMpLiBUaGUgcHJvY2Vzc01vbml0b3IgYXR0cmlidXRlIG1heSBiZSAKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGVzLiBBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbnMgZm9yIAogICAgICB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIG1heSBiZSBwcm92aWRlZCBieSB0aGUgJ3Byb2dyZXNzU3RhdGVJbmZvJyBhbmQgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnIAogICAgICBhbmQgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvICcwJy4gVGhlIE1uUyBwcm9kdWNlciBkZWNpZGVzIHdoZW4gdG8gCiAgICAgIHN0YXJ0IGV4ZWN1dGluZyB0aGUgcHJvY2VzcyBhbmQgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSAnUlVOTklORycgc3RhdGUuIAogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlIAogICAgICBwcm9jZXNzIG1heSBzdGFydCB0byBleGVjdXRlIGRpcmVjdGx5IHVwb24gaXRzIGluc3RhbnRpYXRpb24uIE9uZSAKICAgICAgYWx0ZXJuYXRpdmUgbXVzdCBiZSBzZWxlY3RlZCB3aGVuIHVzaW5nIHRoaXMgZGF0YSB0eXBlLgoKICAgICAgRHVyaW5nIHRoZSAnUlVOTklORycgc3RhdGUgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZSBtYXkgYmUgCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8gCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24uIFRoZSAncHJvZ3Jlc3NJbmZvJyBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gCiAgICAgIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIGluIHRoZSAnTk9UX1JVTk5JTkcnLCAnQ0FOQ0VMTElORycgCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mIAogICAgICAncHJvZ3Jlc3NTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyAKICAgICAgdXNlZC4KCiAgICAgIFVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBwcm9jZXNzLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIHNldCAKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluIAogICAgICB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gQWRkaXRpb25hbCB0ZXh0dWFsIGluZm9ybWF0aW9uIG1heSBiZSBwcm92aWRlZCAKICAgICAgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4gVGhlIHR5cGUgb2YgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuIAogICAgICBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mICdyZXN1bHRTdGF0ZUluZm8nIG1heSBiZSBwcm92aWRlZCAKICAgICAgd2hlcmUgdGhpcyBkYXRhIHR5cGUgaXMgdXNlZC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgZmFpbHMgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCB0aGUgJ3N0YXR1cycgCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZiAKICAgICAgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLCBhbmQgdGhlIHRpbWUgY2FwdHVyZWQgaW4gJ2VuZFRpbWUnLiBUaGUgCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIHNwZWNpZmllcyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZS4gCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbiAKICAgICAgdGhpcyBjbGF1c2UgaXMgdXNlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIGZhaWx1cmUgbWF5IGJlIHN1YmplY3QgZm9yIAogICAgICBmdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIGFzIHdlbGwuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGlzIGNhbmNlbGxlZCwgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBmaXJzdCBzZXQgdG8gCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuIAogICAgICBUaGUgdHJhbnNpdGlvbiB0byAnQ0FOQ0VMTEVEJyBpcyBjYXB0dXJlZCBpbiB0aGUgJ2VuZFRpbWUnIGF0dHJpYnV0ZS4gCiAgICAgIFRoZSB2YWx1ZSBvZiAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4uIEFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbCAKICAgICAgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCcgb3IgCiAgICAgICdDQU5DRUxMRUQnLiBJdCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgbWFraW5nIHRoZSBvdXRjb21lLCB0aGF0IHRoZSAKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzIAogICAgICBjcmVhdGlvbiwgZm9yIGV4YW1wbGUgYmVjYXVzZSByZXF1aXJlZCBkYXRhIG1heSBub3QgYmUgYXZhaWxhYmxlIGFueSAKICAgICAgbW9yZSBhZnRlciBhIGNlcnRhaW4gdGltZSwgb3IgdGhlIHByb2Nlc3Mgb3V0Y29tZSBpcyBuZWVkZWQgdW50aWwgYSAKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4gCiAgICAgIFRoZSB0aW1lIHVudGlsIHRoZSBNblMgcHJvZHVjZXIgYXV0b21hdGljYWxseSBjYW5jZWxzIHRoZSBwcm9jZXNzIGlzIAogICAgICBpbmRpY2F0ZWQgYnkgdGhlICd0aW1lcicgYXR0cmlidXRlLiI7CiAgICAgIAogICAgbGVhZiBpZCB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIklkIG9mIHRoZSBwcm9jZXNzLiBJdCBpcyB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIAogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KICAgIAogICAgbGVhZiBzdGF0dXMgeyAKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBOT1RfU1RBUlRFRCA7CiAgICAgICAgZW51bSBSVU5OSU5HIDsKICAgICAgICBlbnVtIENBTkNFTExJTkcgOwogICAgICAgIGVudW0gRklOSVNIRUQgOwogICAgICAgIGVudW0gRkFJTEVEIDsKICAgICAgICBlbnVtIFBBUlRJQUxMWV9GQUlMRUQgOwogICAgICAgIGVudW0gQ0FOQ0VMTEVEIDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlZmF1bHQgIFJVTk5JTkc7CiAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLiAKICAgICAgICBJdCBkb2VzIG5vdCByZXByZXNlbnQgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCAKICAgICAgICBwcm9jZXNzLiAiOwogICAgfQoKICAgIGxlYWYgcHJvZ3Jlc3NQZXJjZW50YWdlIHsKICAgICAgdHlwZSB1aW50OCB7CiAgICAgICAgcmFuZ2UgMC4uMTAwOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlByb2dyZXNzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MgYXMgcGVyY2VudGFnZSI7CiAgICB9CgogICAgbGVhZi1saXN0IHByb2dyZXNzU3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZyAKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgcmVzdWx0U3RhdGVJbmZvIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIkFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgCiAgICAgICAgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEIGFuZCAnQ0FOQ0VMTEVEJy4gCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcyAKICAgICAgICBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBlcnJvciByZWFzb25zLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzaGFsbCBub3QgYmUgdXNlZCB0byBtYWtlIHRoZSBvdXRjb21lIG9mIHRoZSBwcm9jZXNzIAogICAgICAgIGF2YWlsYWJsZSBmb3IgcmV0cmlldmFsLCBpZiBhbnkuIEZvciB0aGlzIHB1cnBvc2UsIGRlZGljYXRlZCAKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mIAogICAgICAgIGEgc3BlY2lmaWMgcHJvY2Vzcy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiBzdGFydFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiU3RhcnQgdGltZSBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCBpLmUuIHRoZSB0aW1lIHdoZW4gdGhlIAogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsIAogICAgICAgICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJy4gCgogICAgICAgIElmIHRoZSB0aW1lIGlzIGluIHRoZSBmdXR1cmUsIGl0IGlzIHRoZSBlc3RpbWF0ZWQgdGltZSAKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvIAogICAgICAgIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIAogICAgICAgIE1uU19Qcm9kdWNlci4gCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCiAgICAgICAgCiAgICAgICAgT25jZSB0aGUgdGltZXIgaXMgc2V0LCB0aGUgY29uc3VtZXIgY2FuIG5vdCBjaGFuZ2UgaXQgYW55bW9yZS4gCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgIH0KICB9CiAgCiAgdHlwZWRlZiBUZW50aE9mRGVncmVlcyB7IAogICAgdHlwZSB1aW50MTYgeyAKICAgICAgcmFuZ2UgMC4uMzYwMDsgCiAgICB9CiAgICB1bml0cyAiMC4xIGRlZ3JlZXMiOwogICAgZGVzY3JpcHRpb24gIkEgc2luZ2xlIGludGVncmFsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gYW5nbGUgaW4gZGVncmVlcyAKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxhdGl0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIExvbmdpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTE4MC4wMDAwLi4rMTgwLjAwMDAiOyAKICAgIH0KICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgT25PZmYgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gT047CiAgICAgIGVudW0gT0ZGOwogICAgfQogIH0KICAKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcyAKICAvLyAgYmVpbmcgbW92ZWQgdG8gXzNncHAtNWdjLW5ybS1uZnByb2ZpbGUKICBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHsKICAgIGRlc2NyaXB0aW9uICJEZWZpbmVzIHByb2ZpbGUgZm9yIG1hbmFnZWQgTkYiOwogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjUwMSI7CiAgICAKICAgIGxlYWYgaWR4IHsgdHlwZSB1aW50MzIgOyB9CiAgICAKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLiAKICAgICAgICBUaGUgZm9ybWF0IG9mIHRoZSBORiBJbnN0YW5jZSBJRCBzaGFsbCBiZSBhIAogICAgICAgIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIChVVUlEKSB2ZXJzaW9uIDQsIAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMjMuNjU4IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggOwogICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgbGVuZ3RoIDg7CiAgICAgICAgcGF0dGVybiAnWzAxXSonOwogICAgICB9CiAgICB9CiAgICByZWZlcmVuY2UgImNsYXVzZSAyLjEwLjEgb2YgM0dQUCBUUyAyMy4wMDMiOwogIH0KCiAgdHlwZWRlZiBBbWZTZXRJZCB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDE2IHsKICAgICAgICByYW5nZSAnMC4uMTAyMyc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mUG9pbnRlciB7CiAgICB0eXBlIHVuaW9uIHsgCiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CiAgICAgICAgCiAgZ3JvdXBpbmcgQW1mSWRlbnRpZmllciB7ICAgICAgICAKICAgIGxlYWYgYW1mUmVnaW9uSWQgewogICAgICB0eXBlIEFtZlJlZ2lvbklkOwogICAgfQogICAgbGVhZiBhbWZTZXRJZCB7CiAgICAgIHR5cGUgQW1mU2V0SWQ7CiAgICB9CiAgICBsZWFmIGFtZlBvaW50ZXIgewogICAgICB0eXBlIEFtZlBvaW50ZXI7CiAgICB9IAogICAgZGVzY3JpcHRpb24gIlRoZSBBTUZJIGlzIGNvbnN0cnVjdGVkIGZyb20gYW4gQU1GIFJlZ2lvbiBJRCwgCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLiAKICAgICAgVGhlIEFNRiBSZWdpb24gSUQgaWRlbnRpZmllcyB0aGUgcmVnaW9uLCAKICAgICAgdGhlIEFNRiBTZXQgSUQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgQU1GIFNldCB3aXRoaW4gdGhlIEFNRiBSZWdpb24sIGFuZCAKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7IAogIH0gICAgCgovLyB0eXBlIGRlZmluaXRpb25zIGVzcGVjaWFsbHkgZm9yIGNvcmUgTkZzCgogIHR5cGVkZWYgTmZUeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE5SRjsKICAgICAgZW51bSBVRE07CiAgICAgIGVudW0gQU1GOwogICAgICBlbnVtIFNNRjsKICAgICAgZW51bSBBVVNGOwogICAgICBlbnVtIE5FRjsKICAgICAgZW51bSBQQ0Y7CiAgICAgIGVudW0gU01TRjsKICAgICAgZW51bSBOU1NGOwogICAgICBlbnVtIFVEUjsKICAgICAgZW51bSBMTUY7CiAgICAgIGVudW0gR01MQzsKICAgICAgZW51bSA1R19FSVI7CiAgICAgIGVudW0gU0VQUDsKICAgICAgZW51bSBVUEY7CiAgICAgIGVudW0gTjNJV0Y7CiAgICAgIGVudW0gQUY7CiAgICAgIGVudW0gVURTRjsKICAgICAgZW51bSBCU0Y7CiAgICAgIGVudW0gQ0hGOwogICAgfSAgICAgICAgICAKICB9CiAgCiAgdHlwZWRlZiBOb3RpZmljYXRpb25UeXBlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE4xX01FU1NBR0VTOwogICAgICBlbnVtIE4yX0lORk9STUFUSU9OOwogICAgICBlbnVtIExPQ0FUSU9OX05PVElGSUNBVElPTjsKICAgIH0gICAgICAKICB9CiAgCiAgdHlwZWRlZiBMb2FkIHsKICAgIGRlc2NyaXB0aW9uICJMYXRlc3Qga25vd24gbG9hZCBpbmZvcm1hdGlvbiBvZiB0aGUgTkYsIHBlcmNlbnRhZ2UgIjsKICAgIHR5cGUgdWludDggewogICAgICByYW5nZSAwLi4xMDA7CiAgICB9CiAgfQoKICB0eXBlZGVmIE4xTWVzc2FnZUNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIDVHTU07CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTFBQOwogICAgICBlbnVtIFNNUzsgCiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTjJJbmZvcm1hdGlvbkNsYXNzIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNNOwogICAgICBlbnVtIE5SUFBBOwogICAgICBlbnVtIFBXUzsKICAgICAgZW51bSBQV1NfQkNBTDsKICAgICAgZW51bSBQV1NfUkY7CiAgICB9ICAgICAgICAgICAgICAKICB9CiAgCiAgZ3JvdXBpbmcgRGVmYXVsdE5vdGlmaWNhdGlvblN1YnNjcmlwdGlvbiB7CiAgICAKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KICAgIAogICAgbGVhZiBjYWxsYmFja1VyaSB7CiAgICAgIHR5cGUgaW5ldDp1cmk7CiAgICB9CiAgICAKICAgIGxlYWYgbjFNZXNzYWdlQ2xhc3MgewogICAgICB0eXBlIE4xTWVzc2FnZUNsYXNzOwogICAgfQogICAgCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfSAgICAKICB9ICAKICAgICAgICAKICBncm91cGluZyBJcHY0QWRkcmVzc1JhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjQtYWRkcmVzczsKICAgIH0gICAgCiAgfQogICAgCiAgZ3JvdXBpbmcgSXB2NlByZWZpeFJhbmdlIHsKICBsZWFmIHN0YXJ0IHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICBsZWFmIGVuZCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9ICAgIAogIH0KICAgICAKICB0eXBlZGVmIE5zaUlkIHsKICAgIHR5cGUgc3RyaW5nOwogIH0KICAgIAogIHR5cGVkZWYgVWVNb2JpbGl0eUxldmVsIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIFNUQVRJT05BUlk7CiAgICAgIGVudW0gTk9NQURJQzsKICAgICAgZW51bSBSRVNUUklDVEVEX01PQklMSVRZOwogICAgICBlbnVtIEZVTExZX01PQklMSVRZOwogICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBSZXNvdXJjZVNoYXJpbmdMZXZlbCB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU0hBUkVEOwogICAgICAgIGVudW0gTk9UX1NIQVJFRDsKICAgICAgfQogIH0KICAgICAgCiAgdHlwZWRlZiBUeERpcmVjdGlvbiB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gREw7CiAgICAgICAgZW51bSBVTDsKICAgICAgICBlbnVtIERMX0FORF9VTDsKICAgICAgfQogIH0KICAgICAgCiAgZ3JvdXBpbmcgQWRkcmVzc1dpdGhWbGFuIHsKICAgIGxlYWYgaXBBZGRyZXNzIHsKICAgICAgdHlwZSBpbmV0OmlwLWFkZHJlc3M7ICAgCiAgICB9CiAgICBsZWFmIHZsYW5JZCB7CiAgICAgICB0eXBlIHVpbnQxNjsKICAgIH0gIAogIH0KICAKICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgLy8gVE9ETyBpcyB0aGlzIGVxdWl2YWxlbnQgdG8gVFMgMzIuMzAwID8KICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissXSkqJwogICAgICAgICsgJyhcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nCiAgICAgICAgKyAnWyxcK10pKlthLXpBLVpdW2EtekEtWjAtOS1dKj0oXFwoIHwjfFxcfD58PHw7fCJ8XCt8LHxbYS1mQS1GMC05XXsyfSl8W15cXD48OyIrLCMgXSknCiAgICAgICAgKyAnKChcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KScKICAgICAgICArICd8W15cXD48OyIrLF0pKihcXCggfCN8XFx8Pnw8fDt8InxcK3wsfFthLWZBLUYwLTldezJ9KXxbXlxcPjw7IissIF0pKT8nOyAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIAogICAgICBvZiBEaXN0aW5ndWlzaGVkIE5hbWUgKFJGQyA0NTEyKS4gCiAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIERpc3Rpbmd1aXNoZWROYW1lIFJFR0VYIGlzOgogICAgICB7QXR0cmlidXRlVHlwZSA9IEF0dHJpYnV0ZVZhbHVlfSAgIAoKICAgICAgQXR0cmlidXRlVHlwZSBjb25zaXN0cyBvZiBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbiAoT0lEcyBub3QgYWxsb3dlZCkuIAogICAgICBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcmVzdHJpY3RlZC4KICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW5ub3QgY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgb3IgdGhlIAogICAgICAgIGZvbGxvd2luZyBjaGFyYWN0ZXJzIDogXFwgPiA8IDsgXCIgKyAsIChDb21tYSkgYW5kIFdoaXRlIHNwYWNlCiAgICAgIFRoZSBBdHRyaWJ1dGUgdmFsdWUgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGlmIHRoZXkgCiAgICAgICAgYXJlIGV4Y2FwZWQgOiBcXCA+IDwgOyBcIiArICwgKENvbW1hKSBhbmQgV2hpdGUgc3BhY2UKICAgICAgVGhlIEF0dHJpYnV0ZSB2YWx1ZSBjYW4gY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMgaWYgaXRzIGFuIGVzY2FwZWQgCiAgICAgICAgZG91YmxlIGRpZ2l0IGhleCBudW1iZXIuCiAgICAgICAgRXhhbXBsZXMgY291bGQgYmUgCiAgICAgICAgICBVSUQ9bm9ib2R5QGV4YW1wbGUuY29tLERDPWV4YW1wbGUsREM9Y29tCiAgICAgICAgICAgIENOPUpvaG4gU21pdGgsT1U9U2FsZXMsTz1BQ01FIExpbWl0ZWQsTD1Nb2FiLFNUPVV0YWgsQz1VUyI7CiAgICByZWZlcmVuY2UgICJSRkMgNDUxMiBMaWdodHdlaWdodCBEaXJlY3RvcnkgQWNjZXNzIFByb3RvY29sIChMREFQKToKICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBJbmZvcm1hdGlvbiBNb2RlbHMiOwogIH0gLy8gcmVjaGVjayByZWdleHAgaXQgZG9lc24ndCBoYW5kbGUgcG9zaXggWzpjbnRybDpdCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KfQ== ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo= @@ -473,7 +473,7 @@ ietf-inet-types urn:ietf:params:xml:ns:yang:ietf-inet-types \N [] 2013-07-15 bW9 ietf-yang-types urn:ietf:params:xml:ns:yang:ietf-yang-types \N [] 2013-07-15 bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQo= o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5ncywgT3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycCBvciBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9wb2xvZ3kgb2JqZWN0cy4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOwoKICAgIGxpc3QgQ2xvdWRpZmllZE5GIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBSQU4gTmV0d29yayBGdW5jdGlvbiBzb2Z0d2FyZSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBPLUNsb3VkIHZpYSBvbmUgb3IgbW9yZSBORiBEZXBsb3ltZW50cy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWRpZmllZCBORiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5GRGVwbG95bWVudCB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgc29mdHdhcmUgZGVwbG95bWVudCBvbiBPLUNsb3VkIHJlc291cmNlcyB0aGF0IHJlYWxpemVzLCBhbGwgb3IgcGFydCBvZiwgYSBDbG91ZGlmaWVkIE5GLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBORiBEZXBsb3ltZW50IjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkTmFtZXNwYWNlIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGlzb2xhdGluZwogICAgICAgIGdyb3VwcyBvZiByZXNvdXJjZXMgd2l0aGluIGEgc2luZ2xlIGNsdXN0ZXIuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIE5hbWVzcGFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5vZGVDbHVzdGVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBOb2RlQ2x1c3RlciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBOb2Rlcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgTm9kZSBDbHVzdGVyIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkU2l0ZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIGluZnJhc3RydWN0dXJlIHRoYXQKICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBDTE9VRElGSUVETkZfQ09NUFJJU0VTX05GREVQTE9ZTUVOVCB7IC8vIDEgdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGNvbXByaXNlZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBjb21wcmlzZXMgb2YgdGhlc2UgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQ2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBjb21wcmlzZWQtYnktY2xvdWRpZmllZE5GIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgcGFydCBvZiBDbG91ZGlmaWVkIE5GLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX0RFUExPWUVEX09OX09DTE9VRE5BTUVTUEFDRSB7IC8vIDEuLm4gdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9uLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IGRlcGxveWVkIG9uIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk9DbG91ZCBOYW1lc3BhY2UgZGVwbG95cyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NMT1VETkFNRVNQQUNFX0RFUExPWUVEX09OX05PREVDTFVTVEVSIHsgLy8gMS4ubiB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLW9uLW5vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgTmFtZXNwYWNlIGRlcGxveWVkIG9uIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0Nsb3VkTmFtZXNwYWNlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb2RlIENsdXN0ZXIgZGVwbG95cyBPLUNsb3VkIE5hbWVzcGFjZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTk9ERUNMVVNURVJfTE9DQVRFRF9BVF9PQ0xPVURTSVRFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRlZC1hdC1vY2xvdWRTaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBsb2NhdGVkIGF0IE8tQ2xvdWQgU2l0ZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRpb24tb2Ytb25vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgU2l0ZSBpcyBsb2NhdGlvbiBvZiBOb2RlIENsdXN0ZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMgJ3gueS56JyAtIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2025-01-17 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgaWV0Zi15YW5nLXR5cGVzIHsgcHJlZml4IHlhbmc7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNS0wMS0xNyIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBmaXJzdERpc2NvdmVyZWQgYW5kIGxhc3RNb2RpZmllZCB0byBtZXRhZGF0YSBjb250YWluZXIiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyBhbmQgRGlzY292ZXJ5IGFuZCBSZWNvbmNpbGlhdGlvbiBBZGFwdGVyLgogICAgICAgICAgICBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwKICAgICAgICAgICAgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgbGVhZiByZWxpYWJpbGl0eUluZGljYXRvciB7CiAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgZW51bSBPSyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIGlzIGluIGFsaWdubWVudCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsCiAgICAgICAgICAgICAgICAgICAgYXMgZmFyIGFzIFRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZQogICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIGFuZCBwb3RlbnRpYWxseSBub3QgYWxpZ25lZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGguIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxlYWYgZmlyc3REaXNjb3ZlcmVkIHsKICAgICAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGFuIGluc3RhbmNlIG9mIFRvcG9sb2d5IEVudGl0eSBvciBSZWxhdGlvbgogICAgICAgICAgICB3YXMgZmlyc3QgcmVwcmVzZW50ZWQgaW4gVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyB2aWEgZGlzY292ZXJ5LiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGxhc3RNb2RpZmllZCB7CiAgICAgICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiBhbiBpbnN0YW5jZSBvZiBUb3BvbG9neSBFbnRpdHkgb3IgUmVsYXRpb24KICAgICAgICAgICAgd2FzIGxhc3QgdXBkYXRlZCAoZXhjbHVkaW5nIGNsYXNzaWZpZXJzIGFuZCBkZWNvcmF0b3JzKS4iOwogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-10-21 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgaW5zdGFsbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9JTlNUQUxMRURfQVRfU0lURSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2l0ZSB0eXBlLgogICAgICAgICAgICBUaGUgU2l0ZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgQW50ZW5uYU1vZHVsZSBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIGF0IG9uZSBTaXRlLgogICAgICAgICAgICBBIFNpdGUgaW5zdGFuY2UgY2FuIGhhdmUgbWFueSBpbnN0YWxsZWQgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gT0FNOwoKICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9 o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-08 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== @@ -483,7 +483,7 @@ o-ran-smo-teiv-rel-oam-cloud urn:o-ran:smo-teiv-rel-oam-cloud REL_OAM_CLOUD ["o- o-ran-smo-teiv-rel-oam-ran urn:o-ran:smo-teiv-rel-oam-ran REL_OAM_RAN ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud ["name"] o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud ["name"] @@ -504,7 +504,7 @@ o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran ["oruId"] o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran ["azimuth", "geo-location", "sectorId"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ANTENNAMODULE_INSTALLED_AT_SITE installed-at-site AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 installed-antennaModule Site o-ran-smo-teiv-equipment 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran ANTENNAMODULE_SERVES_NRCELLDU serviced-nrCellDu AntennaModule o-ran-smo-teiv-equipment 1 9223372036854775807 serving-antennaModule NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran diff --git a/teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql b/teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql index dca3ded..13e7705 100644 --- a/teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql +++ b/teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql @@ -21,14 +21,14 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_consumer_data; -ALTER SCHEMA ties_consumer_data OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_consumer_data; +ALTER SCHEMA teiv_consumer_data OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."module_reference" ( "name" TEXT PRIMARY KEY, "namespace" TEXT, "revision" TEXT NOT NULL, @@ -37,17 +37,17 @@ CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" ( "status" VARCHAR(127) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."decorators" ( "name" TEXT PRIMARY KEY, "dataType" VARCHAR(511) NOT NULL, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( +CREATE TABLE IF NOT EXISTS teiv_consumer_data."classifiers" ( "name" TEXT PRIMARY KEY, "moduleReferenceName" TEXT NOT NULL, - FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE + FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_consumer_data."module_reference" ("name") ON DELETE CASCADE ); COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql b/teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql index 739a717..41a41af 100644 --- a/teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql +++ b/teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql @@ -21,50 +21,50 @@ BEGIN; -CREATE SCHEMA IF NOT EXISTS ties_groups; -ALTER SCHEMA ties_groups OWNER TO :pguser; +CREATE SCHEMA IF NOT EXISTS teiv_groups; +ALTER SCHEMA teiv_groups OWNER TO :pguser; SET default_tablespace = ''; SET default_table_access_method = heap; SET ROLE :pguser; -- Function to create CONSTRAINT only if it does not exists -CREATE OR REPLACE FUNCTION ties_groups.create_constraint_if_not_exists ( +CREATE OR REPLACE FUNCTION teiv_groups.create_constraint_if_not_exists ( t_name TEXT, c_name TEXT, constraint_sql TEXT ) RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'ties_groups' AND table_name = t_name AND constraint_name = c_name) THEN + IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_schema = 'teiv_groups' AND table_name = t_name AND constraint_name = c_name) THEN EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_groups."groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."groups" ( "id" VARCHAR(150) PRIMARY KEY, "name" VARCHAR(150) NOT NULL, "type" VARCHAR(50) NOT NULL ); -CREATE TABLE IF NOT EXISTS ties_groups."static_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."static_groups" ( "id" VARCHAR(150), "topology_type" TEXT NOT NULL, "provided_members_ids" TEXT[] NOT NULL, PRIMARY KEY ("id", "topology_type"), - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( +CREATE TABLE IF NOT EXISTS teiv_groups."dynamic_groups" ( "id" VARCHAR(150) PRIMARY KEY, "criteria" JSONB NOT NULL, - FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE + FOREIGN KEY ("id") REFERENCES teiv_groups."groups" ("id") ON DELETE CASCADE ); -SELECT ties_groups.create_constraint_if_not_exists( +SELECT teiv_groups.create_constraint_if_not_exists( 'groups', 'CHECK_groups_type', - 'ALTER TABLE ties_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' + 'ALTER TABLE teiv_groups."groups" ADD CONSTRAINT "CHECK_groups_type" CHECK ("type" IN (''static'', ''dynamic''))' ); COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/04_init-oran-smo-teiv-data-update.sql b/teiv/src/test/resources/pgsqlschema/04_init-oran-smo-teiv-data-update.sql new file mode 100644 index 0000000..3d5a876 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/04_init-oran-smo-teiv-data-update.sql @@ -0,0 +1,175 @@ +-- +-- ============LICENSE_START======================================================= +-- Modifications Copyright (C) 2025 OpenInfra Foundation Europe +-- ================================================================================ +-- 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. +-- +-- SPDX-License-Identifier: Apache-2.0 +-- ============LICENSE_END========================================================= +-- + +BEGIN; + +INSERT INTO teiv_data."responsible_adapter" (id, hashed_id) VALUES(:'adapterId', decode(:'adapterHashedId', 'hex')) ON CONFLICT DO NOTHING ; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_Site" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" IS NULL AND "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" IS NULL AND "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" IS NULL AND "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-oam_ManagedElement" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" IS NULL AND "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_metadata_SECTOR_GROUPS_NRCELLDU"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_SECTOR_GROUPS_NRCELLDU" IS NULL AND "REL_ID_SECTOR_GROUPS_NRCELLDU" IS NOT NULL; + +UPDATE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" IS NULL AND "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" IS NULL AND "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY"='{"reliabilityIndicator":"OK"}' WHERE "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" IS NULL AND "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_Sector" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" SET "metadata"='{"reliabilityIndicator":"OK"}' WHERE "metadata" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_Site" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE" IS NULL AND "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE" IS NULL AND "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU" IS NULL AND "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-oam_ManagedElement" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU" IS NULL AND "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_RESP_id_SECTOR_GROUPS_NRCELLDU"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_SECTOR_GROUPS_NRCELLDU" IS NULL AND "REL_ID_SECTOR_GROUPS_NRCELLDU" IS NOT NULL; + +UPDATE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" IS NULL AND "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" IS NULL AND "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER" IS NULL AND "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY"= decode(:'adapterHashedId', 'hex') WHERE "REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY" IS NULL AND "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_Sector" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" SET "RESP_id"= decode(:'adapterHashedId', 'hex') WHERE "RESP_id" IS NULL AND "id" IS NOT NULL; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_ODUFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" = COALESCE("REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" IS NOT NULL AND NOT "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" = COALESCE("REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" IS NOT NULL AND NOT "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_Site" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" = COALESCE("REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" IS NOT NULL AND NOT "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" SET "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" = COALESCE("REL_metadata_SECTOR_GROUPS_ANTENNAMODULE", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" IS NOT NULL AND NOT "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellCU" SET "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" = COALESCE("REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" IS NOT NULL AND NOT "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-oam_ManagedElement" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" = COALESCE("REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" IS NOT NULL AND NOT "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRCellDU" SET "REL_metadata_SECTOR_GROUPS_NRCELLDU" = COALESCE("REL_metadata_SECTOR_GROUPS_NRCELLDU", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_SECTOR_GROUPS_NRCELLDU" IS NOT NULL AND NOT "REL_metadata_SECTOR_GROUPS_NRCELLDU" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" SET "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" = COALESCE("REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" IS NOT NULL AND NOT "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" = COALESCE("REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" IS NOT NULL AND NOT "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" = COALESCE("REL_metadata_NRCELLDU_USES_NRSECTORCARRIER", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" IS NOT NULL AND NOT "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" SET "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" = COALESCE("REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" IS NOT NULL AND NOT "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."o-ran-smo-teiv-ran_Sector" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +UPDATE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" SET "metadata" = COALESCE("metadata", '{}') || ('{"firstDiscovered": "' || :'upgradeTime' || '"}')::jsonb || ('{"lastModified": "' || :'upgradeTime' || '"}')::jsonb WHERE "id" IS NOT NULL AND NOT "metadata" ?& array['firstDiscovered','lastModified']; + +COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/README.md b/teiv/src/test/resources/pgsqlschema/README.md index 53f3a66..e5bf433 100644 --- a/teiv/src/test/resources/pgsqlschema/README.md +++ b/teiv/src/test/resources/pgsqlschema/README.md @@ -1,3 +1,24 @@ + + # PGSQL schema generator During the `generate-resources` phase of the Maven build pgsql-schema-generator will run (see `exec-maven-plugin` in the `teiv` POM), v1 of the SQL files in this directory are **automatically overwritten** if there are changes to the YANG diff --git a/teiv/src/test/resources/pgsqlschema/consumer-data.sql b/teiv/src/test/resources/pgsqlschema/consumer-data.sql index 4f204f5..8f525d5 100644 --- a/teiv/src/test/resources/pgsqlschema/consumer-data.sql +++ b/teiv/src/test/resources/pgsqlschema/consumer-data.sql @@ -21,18 +21,18 @@ BEGIN; -COPY ties_consumer_data."module_reference"("name", "namespace", "revision", "content", "ownerAppId", "status") FROM stdin; +COPY teiv_consumer_data."module_reference"("name", "namespace", "revision", "content", "ownerAppId", "status") FROM stdin; test-app-module urn:o-ran:test-app-module 2024-05-24 bW9kdWxlIHRlc3QtYXBwLW1vZHVsZSB7CgogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOnRlc3QtYXBwLW1vZHVsZSI7CiAgICBwcmVmaXggbW9kdWxlOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0ZXN0OyB9CiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIHJldmlzaW9uICIyMDI0LTA2LTEwIiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICBJbml0aWFsIHJldmlzaW9uLjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgYXVnbWVudCAvdGVzdDpkZWNvcmF0b3JzIHsKICAgICAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmVuZG9yIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIGlkZW50aXR5IE91dGRvb3IgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCiAgICBpZGVudGl0eSBSdXJhbCB7CiAgICAgICAgYmFzZSB0ZXN0OmNsYXNzaWZpZXJzOwogICAgfQoKICAgIGlkZW50aXR5IFdlZWtlbmQgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCn0K APP IN_USAGE test-app-for-deletion-module urn:o-ran:test-app-for-deletion-module 2024-05-24 bW9kdWxlIHRlc3QtYXBwLW1vZHVsZSB7CgogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOnRlc3QtYXBwLW1vZHVsZSI7CiAgICBwcmVmaXggbW9kdWxlOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0ZXN0OyB9CiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIHJldmlzaW9uICIyMDI0LTA2LTEwIiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICBJbml0aWFsIHJldmlzaW9uLjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgYXVnbWVudCAvdGVzdDpkZWNvcmF0b3JzIHsKICAgICAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmVuZG9yIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIGlkZW50aXR5IE91dGRvb3IgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCiAgICBpZGVudGl0eSBSdXJhbCB7CiAgICAgICAgYmFzZSB0ZXN0OmNsYXNzaWZpZXJzOwogICAgfQoKICAgIGlkZW50aXR5IFdlZWtlbmQgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCn0K APP IN_USAGE test-app-in-deleting-status urn:o-ran:test-app-in-deleting-status 2024-10-14 bW9kdWxlIHRlc3QtYXBwLW1vZHVsZSB7CgogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOnRlc3QtYXBwLW1vZHVsZSI7CiAgICBwcmVmaXggbW9kdWxlOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0ZXN0OyB9CiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIHJldmlzaW9uICIyMDI0LTA2LTEwIiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICBJbml0aWFsIHJldmlzaW9uLjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgYXVnbWVudCAvdGVzdDpkZWNvcmF0b3JzIHsKICAgICAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmVuZG9yIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIGlkZW50aXR5IE91dGRvb3IgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCiAgICBpZGVudGl0eSBSdXJhbCB7CiAgICAgICAgYmFzZSB0ZXN0OmNsYXNzaWZpZXJzOwogICAgfQoKICAgIGlkZW50aXR5IFdlZWtlbmQgewogICAgICAgIGJhc2UgdGVzdDpjbGFzc2lmaWVyczsKICAgIH0KCn0K APP DELETING \. -COPY ties_consumer_data."decorators" ("name", "dataType", "moduleReferenceName" ) FROM stdin; +COPY teiv_consumer_data."decorators" ("name", "dataType", "moduleReferenceName" ) FROM stdin; test-app-module:textdata TEXT test-app-module test-app-module:intdata INT test-app-module \. -COPY ties_consumer_data."classifiers" ("name", "moduleReferenceName" ) FROM stdin; +COPY teiv_consumer_data."classifiers" ("name", "moduleReferenceName" ) FROM stdin; test-app-module:Indoor test-app-module test-app-module:Outdoor test-app-module test-app-module:Rural test-app-module diff --git a/teiv/src/test/resources/pgsqlschema/data.sql b/teiv/src/test/resources/pgsqlschema/data.sql index b9e2ce8..8b75bec 100644 --- a/teiv/src/test/resources/pgsqlschema/data.sql +++ b/teiv/src/test/resources/pgsqlschema/data.sql @@ -21,106 +21,106 @@ BEGIN; -COPY ties_data."responsible_adapter" ("id", "hashed_id") FROM stdin; +COPY teiv_data."responsible_adapter" ("id", "hashed_id") FROM stdin; orannamespace-ran-topology-adapter \\xff10444ea1540885f3e34b3670be8bbfd6a780c6 namespace-ran-topology-adapter \\x5f270b1ee231080eb5ffd2e04077cdcfe60e018a test-namespace-test-adapter-id \\x41131feea09d9620d911657a710803ea92414059 ran-topology-adapter \\x5b35d8c6c5f8e8acb48912b8f328ebc9b6924e03 \. -COPY ties_data."o-ran-smo-teiv-oam_ManagedElement" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} {"reliabilityIndicator":"OK"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} {"reliabilityIndicator":"ADVISED"} +COPY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_Sector" ("id", "geo-location", "sectorId", "azimuth", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; -Sector=1 POINT(59.4019881 17.9419888) 1 1.1 ["source1", "source2"] [] {} {"reliabilityIndicator":"RESTORED"} -Sector=2 POINT(60.4019881 18.9419888) 2 2.2 ["source1", "source2"] [] {} {"reliabilityIndicator":"RESTORED"} -Sector=3 POINT(61.4019881 19.9419888) 3 3.3 ["source1", "source2"] [] {} {"reliabilityIndicator":"ADVISED"} +COPY teiv_data."o-ran-smo-teiv-ran_Sector" ("id", "geo-location", "sectorId", "azimuth", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:Sector=1 POINT(59.4019881 17.9419888) 1 1.1 ["source1", "source2"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:Sector=2 POINT(60.4019881 18.9419888) 2 2.2 ["source1", "source2"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:Sector=3 POINT(61.4019881 19.9419888) 3 3.3 ["source1", "source2"] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ("id", "eUtranFqBands", "geranFqBands", "nRFqBands", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 ["123","456","789"] ["123","4564","789"] ["123","456","789"] ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} {"reliabilityIndicator":"INVALID"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1 ["123","456","789"] ["123","4564","789"] ["123","456","789"] ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"RESTORED"} +COPY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ("id", "eUtranFqBands", "geranFqBands", "nRFqBands", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 ["123","456","789"] ["123","4564","789"] ["123","456","789"] ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} {"reliabilityIndicator":"INVALID","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1 ["123","456","789"] ["123","4564","789"] ["123","456","789"] ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ("id", "antennaBeamWidth", "antennaModelNumber", "electricalAntennaTilt", "geo-location", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_installed-at-site", "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE", "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE", "metadata" ) FROM stdin; -urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A \N 5 11 POINT(39.4019881 67.9419888) 6 0 7 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512 [] [] {} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"OK"} -urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7 \N 5 11 POINT(49.4019881 68.9419888) 6 0 7 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=CEEC51BE136D671D2101C09FEDD8A1D95E1E177A4818E9FC0D6E63E610BC8FE26FC9C729A1E58AD43D70472F4CD54403E25CB1E5D2BBA66966625C21435C4A78 [] [] {} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"ADVISED"} {"reliabilityIndicator":"RESTORED"} -urn:o-ran:smo:teiv:sha512:AntennaModule=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A \N 5 11 POINT Z (47.497913 19.040236 111.1) 4 2 5 -850 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} Sector=3 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=67C8D3C4E7B9A2F4C0A7D1B4E3F8D7C9E6F8C3A9D4F2E5B1C7D2F5C8B1D2F6C7A5E7B3C4A1D2E3F7B5A9C7D2F5B8C1D2F7C8A9D4E3F8D7A1E3B5C7 [] [] {} {"reliabilityIndicator":"OK"} {} {"reliabilityIndicator":"ADVISED"} -urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123 \N 5 11 POINT(-49.4019881 -68.9419888) 6 0 5 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=DAFC42AF147B582C3212D1AEFEEB92EA6F2F288B5929FAED1E7F74F721CD9FF37FDAD83AB2F69BE54E81583F5DE65514F36DC2F6E3CCB77A77736D32546D5B89 [] [] {} {"reliabilityIndicator":"OK"} {} {"reliabilityIndicator":"ADVISED"} -urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45 \N 5 11 POINT Z (-47.497913 -19.040236 -111.1) 4 2 5 -850 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} Sector=3 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=BFFB53CF258C693D4323E2BFFFFC93FB7F3F399C6939FBFE2F8F85F832DE9FF48FEAE94BC3F79CF65F92694F6EF76625F47ED3F7F4DDC88B88847E43657E6C9A [] [] {} {"reliabilityIndicator":"OK"} {} {"reliabilityIndicator":"ADVISED"} +COPY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ("id", "antennaBeamWidth", "antennaModelNumber", "electricalAntennaTilt", "geo-location", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_installed-at-site", "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE", "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE", "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE", "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE", "metadata" ) FROM stdin; +urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A \N 5 11 POINT(39.4019881 67.9419888) 6 0 7 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7 \N 5 11 POINT(49.4019881 68.9419888) 6 0 7 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=CEEC51BE136D671D2101C09FEDD8A1D95E1E177A4818E9FC0D6E63E610BC8FE26FC9C729A1E58AD43D70472F4CD54403E25CB1E5D2BBA66966625C21435C4A78 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:o-ran:smo:teiv:sha512:AntennaModule=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A \N 5 11 POINT Z (47.497913 19.040236 111.1) 4 2 5 -850 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} urn:Sector=3 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=67C8D3C4E7B9A2F4C0A7D1B4E3F8D7C9E6F8C3A9D4F2E5B1C7D2F5C8B1D2F6C7A5E7B3C4A1D2E3F7B5A9C7D2F5B8C1D2F7C8A9D4E3F8D7A1E3B5C7 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123 \N 5 11 POINT(-49.4019881 -68.9419888) 6 0 5 -900 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=DAFC42AF147B582C3212D1AEFEEB92EA6F2F288B5929FAED1E7F74F721CD9FF37FDAD83AB2F69BE54E81583F5DE65514F36DC2F6E3CCB77A77736D32546D5B89 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45 \N 5 11 POINT Z (-47.497913 -19.040236 -111.1) 4 2 5 -850 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} \N \N [] [] {} urn:Sector=3 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=BFFB53CF258C693D4323E2BFFFFC93FB7F3F399C6939FBFE2F8F85F832DE9FF48FEAE94BC3F79CF65F92694F6EF76625F47ED3F7F4DDC88B88847E43657E6C9A [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id", "gNBCUName", "gNBId", "gNBIdLength", "pLMNId", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUCPFunction=9 ocucp-9 9 1 {"mcc":"123","mnc":"82"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUCPFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=0F7F3F3CEC7B3CDA05A7B7D2874D1EF39EBDAA18AD7D6F43CF219C087510114C59C6B78EC21F8E9C6F19B5F1999FBBA2DF8C3DDF76F416C874508303F0DA4AB4 [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10 ocucp-10 10 2 {"mcc":"456","mnc":"83"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=7053BF6EEB9769084BB91850C356BF20E3C9D6AD8F0D7212911DC827AD1B4D42AEDA0C43FD5715C94E14334EF49FA09405A976451B777B442BBF397DE89528A4 [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13 ocucp-13 13 2 {"mcc":"789","mnc":"84"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=C88ACE9CD7BA7E56FD059C027DA8E4D0ED0A3E13F9E358D5F4A66EE004FC3767A9D20B0512661B6D2F5F82F106725C04C5DC8826D990DECB4D5AD571BE402BE0 [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUCPFunction=14 ocucp-14 14 2 {"mcc":"123","mnc":"85"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUCPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=F23FADEDC45AE38DBC567C57FC4DD5D61D239B0BEF3C93DD54DF85545E6D0C8B9B26A1D3911B56A3F8C2EB148A4F276D1EBAF7EE2D2E35C8B37F008F572DF7B6 [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16 ocucp-16 16 2 {"mcc":"456","mnc":"86"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=5ECE0941DDBC9B4DEE8492333129A0AB80720CB6005A80B54C4D9247029A41FA42DB6D2C709F71D7ED5D82F5EA90CE2C0B553AC1BD860D8A6DFA218E2E790F1C [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19 ocucp-19 19 2 {"mcc":"789","mnc":"87"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=63EA5A9F77FE5DED61CF6DC30233AB17A57D6E04283365D7C1976FF646961FAAF1889BBA618029EA10DA8761F8DAA643B707B602D4E61898A2B5259AA0118887 [] [] {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUCPFunction=28 ocucp-28 28 2 {"mcc":"123","mnc":"88"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUCPFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=CD564BF182FD6DE77816BA69F25B664374AD02D642DF05FF8991E1009E7E09C50E92F6858A1E1B025CFDA933AB769B8C68FBAE0DBBAA140AE321DC55AED6C2A3 [] [] {} +COPY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ("id", "gNBCUName", "gNBId", "gNBIdLength", "pLMNId", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUCPFunction=9 ocucp-9 9 1 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUCPFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=0F7F3F3CEC7B3CDA05A7B7D2874D1EF39EBDAA18AD7D6F43CF219C087510114C59C6B78EC21F8E9C6F19B5F1999FBBA2DF8C3DDF76F416C874508303F0DA4AB4 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10 ocucp-10 10 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=7053BF6EEB9769084BB91850C356BF20E3C9D6AD8F0D7212911DC827AD1B4D42AEDA0C43FD5715C94E14334EF49FA09405A976451B777B442BBF397DE89528A4 [] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13 ocucp-13 13 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=C88ACE9CD7BA7E56FD059C027DA8E4D0ED0A3E13F9E358D5F4A66EE004FC3767A9D20B0512661B6D2F5F82F106725C04C5DC8826D990DECB4D5AD571BE402BE0 [] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUCPFunction=14 ocucp-14 14 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUCPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=F23FADEDC45AE38DBC567C57FC4DD5D61D239B0BEF3C93DD54DF85545E6D0C8B9B26A1D3911B56A3F8C2EB148A4F276D1EBAF7EE2D2E35C8B37F008F572DF7B6 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16 ocucp-16 16 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=5ECE0941DDBC9B4DEE8492333129A0AB80720CB6005A80B54C4D9247029A41FA42DB6D2C709F71D7ED5D82F5EA90CE2C0B553AC1BD860D8A6DFA218E2E790F1C [] [] {} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19 ocucp-19 19 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=63EA5A9F77FE5DED61CF6DC30233AB17A57D6E04283365D7C1976FF646961FAAF1889BBA618029EA10DA8761F8DAA643B707B602D4E61898A2B5259AA0118887 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUCPFunction=28 ocucp-28 28 2 {"mcc":"01","mnc":"234"} ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUCPFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION=CD564BF182FD6DE77816BA69F25B664374AD02D642DF05FF8991E1009E7E09C50E92F6858A1E1B025CFDA933AB769B8C68FBAE0DBBAA140AE321DC55AED6C2A3 [] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "metadata") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9 9 1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A [] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata" : "value1"} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10 10 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=80D3B4C44B4F0BEFC7660AF0A4E91F89C8108DA814B09728F848C0C5C10E2D956A73FBC85EB2AE0A7EA4D95308A606856603B53C8C2669A50BCB58B9FC87D7F2 [] [] {} {} {"reliabilityIndicator":"ADVISED","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUUPFunction=13 13 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUUPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=29DE1D3B8DA9C9FA1201C36F74FEBE14493F7C674E47E1FFCB6AADEED8EABB0460770EC21E7AC8EEBBB057ABC0E31269AB5C92D941E9BA53877164918C6EFB30 [] [] {} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"RESTORED","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUUPFunction=14 14 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUUPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=4C571BDD5DF9B297C1B249D0242EB9DDC77052BB0A33E62DB851809A075259EE3A0C354FA3978276BD5EE0BBB8CFDBF19F7C3C7017F828B9A2EBAD020E7FDF98 [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar"} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUUPFunction=16 16 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUUPFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=DD5E12CB8D14C89E1C199BDABBCC71908F76AB04FE8FD7F7334A9A403B5BE0D8BB5DA69B4258C7AF4834BF2D3E00B6D5C263AD38A83A22E7EC673ACE1CAF0CF2 [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar"} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUUPFunction=19 19 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUUPFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=2AF48E294918A4EE0E3E7C783A70841E1DEEF72CDD43FE3CD1DF6531CCA06203B574BE02553254220A637632AECB719951DAE2A3D0487D24EA1A090843563603 [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar"} {"foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUUPFunction=28 28 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUUPFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=140E8C8C56B1E717CD992D3FF0C61C04C1633E1FEF17ABB92A9A17C53E18CFAF5D72C4C71415E0026C99671657FB3EC1BD394174DD306261ADA8A6CDF4D42748 [] [] {} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"ADVISED"} +COPY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "metadata") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9 9 1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A [] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata" : "value1"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10 10 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=80D3B4C44B4F0BEFC7660AF0A4E91F89C8108DA814B09728F848C0C5C10E2D956A73FBC85EB2AE0A7EA4D95308A606856603B53C8C2669A50BCB58B9FC87D7F2 [] [] {} {} {"reliabilityIndicator":"ADVISED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUUPFunction=13 13 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUUPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=29DE1D3B8DA9C9FA1201C36F74FEBE14493F7C674E47E1FFCB6AADEED8EABB0460770EC21E7AC8EEBBB057ABC0E31269AB5C92D941E9BA53877164918C6EFB30 [] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUUPFunction=14 14 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUUPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=4C571BDD5DF9B297C1B249D0242EB9DDC77052BB0A33E62DB851809A075259EE3A0C354FA3978276BD5EE0BBB8CFDBF19F7C3C7017F828B9A2EBAD020E7FDF98 [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUUPFunction=16 16 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUUPFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=DD5E12CB8D14C89E1C199BDABBCC71908F76AB04FE8FD7F7334A9A403B5BE0D8BB5DA69B4258C7AF4834BF2D3E00B6D5C263AD38A83A22E7EC673ACE1CAF0CF2 [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUUPFunction=19 19 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUUPFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=2AF48E294918A4EE0E3E7C783A70841E1DEEF72CDD43FE3CD1DF6531CCA06203B574BE02553254220A637632AECB719951DAE2A3D0487D24EA1A090843563603 [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUUPFunction=28 28 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUUPFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=140E8C8C56B1E717CD992D3FF0C61C04C1633E1FEF17ABB92A9A17C53E18CFAF5D72C4C71415E0026C99671657FB3EC1BD394174DD306261ADA8A6CDF4D42748 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_ODUFunction" ("id", "dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "metadata", "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 {"mcc":"123","mnc":"82"} \N 9 1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"ORAN"} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B426 [] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"ORAN"} {"reliabilityIndicator":"OK","newKeyType":"newValue"} {"reliabilityIndicator":"ADVISED","newKeyType":"newValue"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10 {"mcc":"456","mnc":"83"} \N 10 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {"test-app-module:textdata":"Budapest","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328 [] ["test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Budapest","test-app-module:intdata":123} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13 {"mcc":"789","mnc":"84"} \N 13 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] ["test-app-module:Indoor"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":456} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7 [] [] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":456} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14 {"mcc":"123","mnc":"85"} \N 14 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] ["test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA [] [] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} {"reliabilityIndicator":"ADVISED"} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16 {"mcc":"456","mnc":"86"} 16 16 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE [] ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} {"reliabilityIndicator":"RESTORED"} {} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 {"mcc":"789","mnc":"87"} \N 19 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD [] [] {} {} {"reliabilityIndicator":"OK","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28 {"mcc":"123","mnc":"88"} \N 28 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=ADD4A82DFBAF0409FA9D3C929A09314088627B447C733429D4EE7AAE2FFAEE4894F90826B6814B63431EC07140783C7861E463C5AF8330E29469D704675EAB43 [] [] {} {} {"reliabilityIndicator":"RESTORED"} +COPY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id", "dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "metadata", "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 {"mcc":"123","mnc":"82"} \N 9 1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"ORAN"} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B426 [] ["test-app-module:Indoor","test-app-module:Weekend"] {"test-app-module:textdata":"ORAN"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10 {"mcc":"456","mnc":"83"} \N 10 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E"] [] {"test-app-module:textdata":"Budapest","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328 [] ["test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Budapest","test-app-module:intdata":123} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-09T11:40:36.461565Z","lastModified":"2025-01-09T11:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-09T11:40:36.461565Z","lastModified":"2025-01-09T11:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13 {"mcc":"789","mnc":"84"} \N 13 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155"] ["test-app-module:Indoor"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":456} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7 [] [] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":456} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-11T23:40:36.461565Z","lastModified":"2025-01-11T23:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-11T23:40:36.461565Z","lastModified":"2025-01-11T23:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14 {"mcc":"123","mnc":"85"} \N 14 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4"] ["test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA [] [] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-11T09:40:36.461565Z","lastModified":"2025-01-11T09:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-11T09:40:36.461565Z","lastModified":"2025-01-11T09:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16 {"mcc":"456","mnc":"86"} 16 16 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", "urn:cmHandle:453431CC154F900606657D584700827A"] ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE [] ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm","test-app-module:intdata":123} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-12T21:40:36.461565Z","lastModified":"2025-01-12T21:40:36.461565Z"} {} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 {"mcc":"789","mnc":"87"} \N 19 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6BD25E5C8FB7842F69010736253CC47F43535D7238E9E9A03E8092E8C019C83270DE47C96EF1049C40B83A130F9F129AE93B9C8538B6B004AE89BD0A098E48DD [] [] {} {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28 {"mcc":"123","mnc":"88"} \N 28 2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28", "urn:cmHandle:30C68865AF2F353F202056CB1921D418"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28 urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=ADD4A82DFBAF0409FA9D3C929A09314088627B447C733429D4EE7AAE2FFAEE4894F90826B6814B63431EC07140783C7861E463C5AF8330E29469D704675EAB43 [] [] {} {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-14T12:40:36.461565Z","lastModified":"2025-01-14T12:40:36.461565Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_NRCellDU" ("id", "cellLocalId", "nCI", "nRPCI", "nRTAC", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-oduFunction", "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_NRCELLDU", "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU", "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU", "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU", "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_metadata_SECTOR_GROUPS_NRCELLDU") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 1 1 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463 [] [] {} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"OK"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2 2 2 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=46AAB2CC5388BECD7B2180C89EEFA64B9A3BC197B614B57FD4BD9ADACE2475A89E16BA04291DE1674FAF2925483E23B8EDCAD4EE98759A9C08E2677CD88F4C43 [] [] {} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3 3 3 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=714C1B73945C298CAA03FE0D800053CDD1C571BBF375DC647B9F23FDA861CEB369832A3593BB1AA4B8A7245AD187ED24ADDF6FB147130827CDC17BA8370C4838 [] [] {} Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=F892571703F0E20A37F3950818DEFA9991ACF35828EEEBD3E43404218F947E1F522258A1F31F4C82A53E7E60D9E1A7AC7AC4219A0D9DD0D8FD192BC73BBB5101 [] [] {} {"reliabilityIndicator":"OK","foo":"bar"} {"reliabilityIndicator":"OK","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91 91 91 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} \N \N [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar"} {"reliabilityIndicator":"RESTORED","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92 92 92 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=DDECCEFB8831FA4EB21B121BA35EAB07ED8D841B5A38580C5F3AD11E66FE73D2FC42E823C6C73288860C7562B610C3D07B6C39FD386171A3BE622096F4B3D006 [] [] {} \N \N [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar"} {"reliabilityIndicator":"ABC","foo":"bar"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93 93 93 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] ["test-app-module:Rural"] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=7723E5D5B3332E0890EAA620C77A6A47065E15A2EA28AD83F3B3CFEA5A7E3BB5965AE78890F1BF000EAA89BF8DE209E506192BF5EA6871426603ED76CBFAF088 [] [] {} \N \N [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar"} {"reliabilityIndicator":"RESTORED","foo":"bar"} +COPY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id", "cellLocalId", "nCI", "nRPCI", "nRTAC", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-oduFunction", "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_NRCELLDU", "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU", "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU", "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU", "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_metadata_SECTOR_GROUPS_NRCELLDU") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 1 1 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463 [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2 2 2 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=46AAB2CC5388BECD7B2180C89EEFA64B9A3BC197B614B57FD4BD9ADACE2475A89E16BA04291DE1674FAF2925483E23B8EDCAD4EE98759A9C08E2677CD88F4C43 [] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3 3 3 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=714C1B73945C298CAA03FE0D800053CDD1C571BBF375DC647B9F23FDA861CEB369832A3593BB1AA4B8A7245AD187ED24ADDF6FB147130827CDC17BA8370C4838 [] [] {} urn:Sector=2 urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=F892571703F0E20A37F3950818DEFA9991ACF35828EEEBD3E43404218F947E1F522258A1F31F4C82A53E7E60D9E1A7AC7AC4219A0D9DD0D8FD192BC73BBB5101 [] [] {} {"reliabilityIndicator":"OK","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"OK","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91 91 91 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \N \N [] [] {} \N \N [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92 92 92 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=DDECCEFB8831FA4EB21B121BA35EAB07ED8D841B5A38580C5F3AD11E66FE73D2FC42E823C6C73288860C7562B610C3D07B6C39FD386171A3BE622096F4B3D006 [] [] {} \N \N [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"ABC","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93 93 93 789 456 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] ["test-app-module:Rural","test-app-module:Weekend"] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=7723E5D5B3332E0890EAA620C77A6A47065E15A2EA28AD83F3B3CFEA5A7E3BB5965AE78890F1BF000EAA89BF8DE209E506192BF5EA6871426603ED76CBFAF088 [] [] {} \N \N [] [] {} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} {"reliabilityIndicator":"RESTORED","foo":"bar","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ("id", "arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-oduFunction", "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_FK_used-by-nrCellDu", "REL_ID_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER", "REL_FK_used-antennaCapability", "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER", "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "metadata") FROM stdin; -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata":"value1"} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BE61426CAEA457C85D8B551A1A75BFA157BBCE6F143110661C4C9D406A7AAF22D8522515CE924CFB3A9E54E68588A45D3A51065BD24ADBA62CC0FDA761AEE2FC [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=7B9425BBD6977FEA6C180F6078CFBAEBE65400223B29E0EFA4F38424FAD66C690806778909177ECF1457CAC18E5BCF6FA4F24E3ECE524C89DE68108708D6D876 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=11EDFC31E2BE240D3CB15DB1A3FA3B78C828524BC8FCA3365A615129A61A627C21DA8EBF6DD788CDBDEC668344D1F79A371749083D6AE04DDDD57CB4FA8C3ECB [] [] {} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"RESTORED"} {"reliabilityIndicator":"ADVISED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=C0E73797DB4599AB9ECACFC1FFE3543C92926070ECFBE77E7C15BA99DAFBB1D69352533D3DE5EB2D3D3CC84DAD51B242CB0FC594FF9E8B73C3B42106B0F9AF46 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=2F87CE31F38D38B993786E3D75D253984DA2842F71504958AAF052D0728B309C73BB3132D6BEA011748BB0B94F489725DB5765AB5366702B812D5C76A772BD9C [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=27DF07D016FE349EC565DE2FB09303EE7D8700346624046F79D8DAC176E7FA221E918E3030758B51931C430919E14FD7D16720460F6E1585000C72874A1641DA [] [] {} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"ADVISED"} {"reliabilityIndicator":"OK"} {"reliabilityIndicator":"RESTORED"} -urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BD87BC547A6731B2905A989EBA493810C74258337C49BBB288F4F55734D28B4E40D9C719EC3564348253905BD93EC78EB7C88F2297FF20778911635E94800F74 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=950ED4540349F9859CEA9E47884A28CD567BDD2505A3C5335C8851A7AADF2AF65542157BB42D607EE3847E4223D76DE88B90762D0590E48693822FD6DCAE60CD [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=1B891FCC4F5479BC71127ED2EB43EA26AC3452F8C47792786373442C10BBC408FE5B779BF1CF732C81220803342F4FB969E348F9C5CEEDEC78F9764E186C633F [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar"} {"reliabilityIndicator":"ADVISED"} {"reliabilityIndicator":"OK","foo":"bar"} {"reliabilityIndicator":"RESTORED"} +COPY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ("id", "arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-oduFunction", "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_FK_used-by-nrCellDu", "REL_ID_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER", "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER", "REL_FK_used-antennaCapability", "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER", "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "metadata") FROM stdin; +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata":"value1"} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BE61426CAEA457C85D8B551A1A75BFA157BBCE6F143110661C4C9D406A7AAF22D8522515CE924CFB3A9E54E68588A45D3A51065BD24ADBA62CC0FDA761AEE2FC [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=7B9425BBD6977FEA6C180F6078CFBAEBE65400223B29E0EFA4F38424FAD66C690806778909177ECF1457CAC18E5BCF6FA4F24E3ECE524C89DE68108708D6D876 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=11EDFC31E2BE240D3CB15DB1A3FA3B78C828524BC8FCA3365A615129A61A627C21DA8EBF6DD788CDBDEC668344D1F79A371749083D6AE04DDDD57CB4FA8C3ECB [] [] {} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=C0E73797DB4599AB9ECACFC1FFE3543C92926070ECFBE77E7C15BA99DAFBB1D69352533D3DE5EB2D3D3CC84DAD51B242CB0FC594FF9E8B73C3B42106B0F9AF46 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=2F87CE31F38D38B993786E3D75D253984DA2842F71504958AAF052D0728B309C73BB3132D6BEA011748BB0B94F489725DB5765AB5366702B812D5C76A772BD9C [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=27DF07D016FE349EC565DE2FB09303EE7D8700346624046F79D8DAC176E7FA221E918E3030758B51931C430919E14FD7D16720460F6E1585000C72874A1641DA [] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} +urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3 507000 507000 10000 2535000 2535000 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9 urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BD87BC547A6731B2905A989EBA493810C74258337C49BBB288F4F55734D28B4E40D9C719EC3564348253905BD93EC78EB7C88F2297FF20778911635E94800F74 [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3 urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=950ED4540349F9859CEA9E47884A28CD567BDD2505A3C5335C8851A7AADF2AF65542157BB42D607EE3847E4223D76DE88B90762D0590E48693822FD6DCAE60CD [] [] {} urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=1B891FCC4F5479BC71127ED2EB43EA26AC3452F8C47792786373442C10BBC408FE5B779BF1CF732C81220803342F4FB969E348F9C5CEEDEC78F9764E186C633F [] [] {} {"reliabilityIndicator":"ADVISED","foo":"bar","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"OK","foo":"bar","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} \. -COPY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ("id", "aSide_AntennaModule", "bSide_AntennaCapability", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; -urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65 urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata":"value1"} {"reliabilityIndicator":"RESTORED"} -urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=8940999E2069725B463052BC35572FDB888C7B734459EE78A01B9F91E2607D87356425BC8EFF0B1C9057D852A4D3F9E1B09479D32FEE68C65EF2821B65F7BD80 urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7 urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"OK"} +COPY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ("id", "aSide_AntennaModule", "bSide_AntennaCapability", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65 urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["ocucp-ocuup-model:Weekend"] {"ocucp-ocuup-model:metadata":"value1"} {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} +urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=8940999E2069725B463052BC35572FDB888C7B734459EE78A01B9F91E2607D87356425BC8EFF0B1C9057D852A4D3F9E1B09479D32FEE68C65EF2821B65F7BD80 urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7 urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-13T16:40:36.461565Z","lastModified":"2025-01-13T16:40:36.461565Z"} \. -COPY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ("id", "aSide_AntennaModule", "bSide_NRCellDU", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; +COPY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ("id", "aSide_AntennaModule", "bSide_NRCellDU", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_NRCELLDU=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65 urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["gnbcucp-gnbcuup-model:Weekend"] {"gnbcucp-gnbcuup-model:metadata":"value1"} urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_NRCELLDU=8940999E2069725B463052BC35572FDB888C7B734459EE78A01B9F91E2607D87356425BC8EFF0B1C9057D852A4D3F9E1B09479D32FEE68C65EF2821B65F7BD80 urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7 urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2 ["urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", "urn:cmHandle:03661FA2E41EF3D12CAAD5954CD985AC"] [] {} \. -COPY ties_data."o-ran-smo-teiv-ran_NRCellCU" ("id", "cellLocalId", "nCI", "nRTAC", "plmnId", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-ocucpFunction", "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU") FROM stdin; +COPY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ("id", "cellLocalId", "nCI", "nRTAC", "plmnId", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-ocucpFunction", "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU", "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU", "metadata", "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU") FROM stdin; \. -COPY ties_data."o-ran-smo-teiv-equipment_Site" ("id", "geo-location", "name", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; +COPY teiv_data."o-ran-smo-teiv-equipment_Site" ("id", "geo-location", "name", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; \. -- Test specific entries -- -CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( +CREATE TABLE IF NOT EXISTS teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( "id" TEXT, "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT, "F03B534AFF0872651FED60C54AB56BEDADAB94B5" BIGINT, @@ -139,23 +139,23 @@ CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" jsonb ); -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "REL_metadata_F53C39EC1F710F3096BE0588F6783A03A378516A" jsonb; +ALTER TABLE ONLY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "REL_metadata_F53C39EC1F710F3096BE0588F6783A03A378516A" jsonb; -CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( +CREATE TABLE IF NOT EXISTS teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( "id" TEXT, "aSide_EntityTypeA" TEXT, "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, @@ -164,15 +164,15 @@ CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ( +CREATE TABLE IF NOT EXISTS teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ( "id" TEXT, "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815" TEXT, "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, @@ -181,15 +181,15 @@ CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( +CREATE TABLE IF NOT EXISTS teiv_data."test-built-in-module_EntityTypeA" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -206,136 +206,136 @@ CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" jsonb ); -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_3B43F80D423BF8F96A2906643B7B4712604FC28B" jsonb; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_3B43F80D423BF8F96A2906643B7B4712604FC28B" jsonb; -ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_3H23F80D423BF8F96A2906643B7B4712604FC45F" jsonb; +ALTER TABLE ONLY teiv_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_3H23F80D423BF8F96A2906643B7B4712604FC45F" jsonb; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'PK_test-built-in-module_EntityTypeA_id', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES teiv_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '10B9F515756871D3EF6558FAF1F112BAE207945D', 'UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14', - 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' + 'ALTER TABLE teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES teiv_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', 'FK_33B5669A341584011D9A73FB491FF2242A158057', - 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'FB1E124031A12CD85D3335194B39B193723A0490', 'FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5', - 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'test-built-in-module_EntityTypeA', 'UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9', - 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");' + 'ALTER TABLE teiv_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");' ); -COPY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ("id", "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F", "F03B534AFF0872651FED60C54AB56BEDADAB94B5", "333177AA699C0DE6399503171DCF48FB396322B0", "027B1A8019C6DEF04558B90D9D8B52253B82FEC6", "478D043D81678134EF1C8BFB073A70F882C4AF12", "8252D18D44F633831557076D827993C45278024D", "68C48305AB6C3A30DD927F5D38562379374A4B31", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; -LongEntityType1 someStringValue 9223372036854775807 2147483647 -9223372036854775807 1.1 ["1000", "2000"] {"mcc":"01","mnc":"234"} ["LongEntityType1"] [] {} +COPY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ("id", "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F", "F03B534AFF0872651FED60C54AB56BEDADAB94B5", "333177AA699C0DE6399503171DCF48FB396322B0", "027B1A8019C6DEF04558B90D9D8B52253B82FEC6", "478D043D81678134EF1C8BFB073A70F882C4AF12", "8252D18D44F633831557076D827993C45278024D", "68C48305AB6C3A30DD927F5D38562379374A4B31", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:LongEntityType1 someStringValue 9223372036854775807 2147483647 -9223372036854775807 1.1 ["1000", "2000"] {"mcc":"01","mnc":"234"} ["urn:LongEntityType1"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."test-built-in-module_EntityTypeA" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5", "REL_ID_31A5B55158140557F09AE15589A8B8038416689B", "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C", "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9", "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54", "REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA", "REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845", "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B", "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A", "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA") FROM stdin; -EntityType1 [] [] {} \N \N [] [] {} LongEntityType1 RelId_OneToOne_EntityType1_LongEntityType1 ["EntityType1"] [] {} -EntityType2 [] [] {} LongEntityType1 Rel_ManyToOne_EntityType2_LongEntityType1 [] [] {} \N \N ["EntityType2"] [] {} +COPY teiv_data."test-built-in-module_EntityTypeA" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5", "REL_ID_31A5B55158140557F09AE15589A8B8038416689B", "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C", "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9", "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54", "REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA", "REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845", "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B", "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A", "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA", "metadata") FROM stdin; +urn:EntityType1 [] [] {} \N \N [] [] {} urn:LongEntityType1 urn:RelId_OneToOne_EntityType1_LongEntityType1 ["urn:EntityType1"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:EntityType2 [] [] {} urn:LongEntityType1 urn:Rel_ManyToOne_EntityType2_LongEntityType1 [] [] {} \N \N ["urn:EntityType2"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ("id", "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F", "F03B534AFF0872651FED60C54AB56BEDADAB94B5", "333177AA699C0DE6399503171DCF48FB396322B0", "027B1A8019C6DEF04558B90D9D8B52253B82FEC6", "478D043D81678134EF1C8BFB073A70F882C4AF12", "8252D18D44F633831557076D827993C45278024D", "68C48305AB6C3A30DD927F5D38562379374A4B31", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-entityTypeA", "REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0", "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A", "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386", "REL_CD_92559ED73C761B860682582A040E745ECEC194D5") FROM stdin; -LongEntityType2 \N \N \N \N \N \N \N [] [] {} EntityType2 Rel_OneToMany_EntityType2_LongEntityType2 ["LongEntityType2"] [] {} -LongEntityType3 \N \N \N \N \N \N \N [] [] {} \N \N ["LongEntityType3"] [] {} +COPY teiv_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ("id", "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F", "F03B534AFF0872651FED60C54AB56BEDADAB94B5", "333177AA699C0DE6399503171DCF48FB396322B0", "027B1A8019C6DEF04558B90D9D8B52253B82FEC6", "478D043D81678134EF1C8BFB073A70F882C4AF12", "8252D18D44F633831557076D827993C45278024D", "68C48305AB6C3A30DD927F5D38562379374A4B31", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_provided-by-entityTypeA", "REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0", "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A", "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386", "REL_CD_92559ED73C761B860682582A040E745ECEC194D5", "metadata") FROM stdin; +urn:LongEntityType2 \N \N \N \N \N \N \N [] [] {} urn:EntityType2 urn:Rel_OneToMany_EntityType2_LongEntityType2 ["urn:LongEntityType2"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:LongEntityType3 \N \N \N \N \N \N \N [] [] {} \N \N ["urn:LongEntityType3"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ("id", "aSide_EntityTypeA", "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; -Rel_ManyToMany_EntityType1_LongEntityType1 EntityType1 LongEntityType1 ["EntityType1", "LongEntityType1"] [] {} +COPY teiv_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ("id", "aSide_EntityTypeA", "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:Rel_ManyToMany_EntityType1_LongEntityType1 urn:EntityType1 urn:LongEntityType1 ["urn:EntityType1", "urn:LongEntityType1"] [] {} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. -COPY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ("id", "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815", "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; -Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2 LongEntityType1 LongEntityType2 ["LongEntityType1", "LongEntityType2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["test-app-module:Weekday"] {"test-app-module:textdata":"ORAN","test-app-module:intdata":123} -Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3 LongEntityType2 LongEntityType3 ["LongEntityType2", "LongEntityType3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8617"] ["test-app-module:Weekend"] {"test-app-module:textdata":"ORAN","test-app-module:intdata":234} +COPY teiv_data."FB1E124031A12CD85D3335194B39B193723A0490" ("id", "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815", "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata") FROM stdin; +urn:Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2 urn:LongEntityType1 urn:LongEntityType2 ["urn:LongEntityType1", "urn:LongEntityType2", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616"] ["test-app-module:Weekday"] {"test-app-module:textdata":"ORAN","test-app-module:intdata":123} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} +urn:Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3 urn:LongEntityType2 urn:LongEntityType3 ["urn:LongEntityType2", "urn:LongEntityType3", "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8617"] ["test-app-module:Weekend"] {"test-app-module:textdata":"ORAN","test-app-module:intdata":234} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \. COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/groups.sql b/teiv/src/test/resources/pgsqlschema/groups.sql index 29afcf5..94017e4 100644 --- a/teiv/src/test/resources/pgsqlschema/groups.sql +++ b/teiv/src/test/resources/pgsqlschema/groups.sql @@ -21,7 +21,7 @@ BEGIN; -COPY ties_groups."groups" ("id", "name", "type") FROM stdin; +COPY teiv_groups."groups" ("id", "name", "type") FROM stdin; urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050 test-dynamic-group-for-rename dynamic urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440051 test-static-group-for-rename static urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 test-dynamic-group-for-delete dynamic @@ -46,9 +46,13 @@ urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440213 test-group-no-data urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440214 test-group-with-max-provided-members-in-static-group static urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440215 test-group-merge-all-provided-members-in-static-group static urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440216 test-group-almost-max-provided-members-in-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217 test-group-goodtarget-goodscope-members-in-dynamic-group dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440218 test-group-badtarget-goodscope-members-in-dynamic-group dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440219 test-group-goodtarget-badscope-members-in-dynamic-group dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440220 test-group-badtarget-badscope-members-in-dynamic-group dynamic \. -COPY ties_groups."dynamic_groups" ("id", "criteria") FROM stdin; +COPY teiv_groups."dynamic_groups" ("id", "criteria") FROM stdin; urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 {"queryType": "getEntitiesByDomain", "domain": "OAM"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050 {"queryType": "getEntitiesByDomain", "domain": "RAN"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001 {"queryType": "getEntitiesByType", "domain": "RAN", "entityTypeName": "ODUFunction", "targetFilter": "/sourceIds"} @@ -57,9 +61,13 @@ urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003 {"queryType": "get urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440004 {"queryType": "getRelationshipsForEntityId", "domain": "RAN", "entityTypeName": "ODUFunction", "entityId": "urn:3gpp:dn:non-existing-odufunction"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440005 {"queryType": "getEntitiesByType", "domain": "RAN", "entityTypeName": "ODUFunction", "scopeFilter": "/attributes"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440100 {"criteria": {"queryType": "getEntitiesByType", "domain": "RAN", "entityTypeName": "ODUFunction", "targetFilter": "/sourceIds"}} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440217 {"queryType": "getRelationshipsForEntityId", "domain": "TEIV", "entityTypeName": "NRCellDU", "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "targetFilter": "/sourceIds", "scopeFilter": "/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616'];/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaNearUnit=1,RetSubUnit=1']"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440218 {"queryType": "getRelationshipsForEntityId", "domain": "TEIV", "entityTypeName": "NRCellDU", "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "scopeFilter": "/NRCellDU/attributes[@cellLocalId=2]"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440219 {"queryType": "getRelationshipsForEntityId", "domain": "TEIV", "entityTypeName": "NRCellDU", "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "targetFilter": "/NRCellDU/attributes(nCI)"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440220 {"queryType": "getRelationshipsForEntityId", "domain": "TEIV", "entityTypeName": "NRCellDU", "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", "targetFilter": "/NRCellDU/attributes(nCI)", "scopeFilter": "/NRCellDU/attributes[@cellLocalId=2]"} \. -COPY ties_groups."static_groups" ("id", "topology_type", "provided_members_ids") FROM stdin; +COPY teiv_groups."static_groups" ("id", "topology_type", "provided_members_ids") FROM stdin; urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 o-ran-smo-teiv-ran:NRCellDU {"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=92", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=500"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 o-ran-smo-teiv-ran:ODUFunction {"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10"} urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 o-ran-smo-teiv-oam:ManagedElement {"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14", "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=500"} diff --git a/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql index 950ee83..9207aa1 100644 --- a/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql +++ b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql @@ -21,7 +21,18 @@ BEGIN; -CREATE TABLE IF NOT EXISTS ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ( +COPY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id", "metadata", "cellLocalId", "nCI", "nRPCI", "nRTAC") FROM stdin; +myReliabilityCell_1 {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 \N \N +myReliabilityCell_2 {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 \N +myReliabilityCell_3 {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 401 +myReliabilityCell_4 {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 401 +myReliabilityCell_5 {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 401 +myReliabilityCell_6 {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} \N \N \N \N +myReliabilityCell_7 {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 401 +myReliabilityCell_8 {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"} 51 61 701 401 +\. + +CREATE TABLE IF NOT EXISTS teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ( "id" TEXT, "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, @@ -30,19 +41,15 @@ CREATE TABLE IF NOT EXISTS ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "metadata" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ( +CREATE TABLE IF NOT EXISTS teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ( "id" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -54,29 +61,25 @@ CREATE TABLE IF NOT EXISTS ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" jsonb ); -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "metadata" jsonb; - -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; - -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "REL_updated_time_580D8ABEAC14A0B2EC73FC4EB093C446F7CD3E7D" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "REL_metadata_780D8ABEAC14A0B2ET73FC4EB093C446F7CD3E56" jsonb; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB" jsonb; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ( +CREATE TABLE IF NOT EXISTS teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, @@ -91,19 +94,18 @@ CREATE TABLE IF NOT EXISTS ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."53089669D370B15C78B7E8376D434921D1C94240" ( +CREATE TABLE IF NOT EXISTS teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ( "id" TEXT, "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, @@ -112,19 +114,15 @@ CREATE TABLE IF NOT EXISTS ties_data."53089669D370B15C78B7E8376D434921D1C94240" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "metadata" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."83C555BD948277E4A7C99698690BF800604C0603" ( +CREATE TABLE IF NOT EXISTS teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ( "id" TEXT, "eUtranFqBands" jsonb, "geranFqBands" jsonb, @@ -134,19 +132,17 @@ CREATE TABLE IF NOT EXISTS ties_data."83C555BD948277E4A7C99698690BF800604C0603" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ADD COLUMN IF NOT EXISTS "metadata" jsonb; - -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ( +CREATE TABLE IF NOT EXISTS teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ( "id" TEXT, "020335B0F627C169E24167748C38FE756FB34AE2" INTEGER, "nCI" BIGINT, @@ -162,29 +158,25 @@ CREATE TABLE IF NOT EXISTS ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" jsonb ); -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A" jsonb; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "REL_updated_time_FF2D6C2A0F47782B339C603874498CC8572F9D76" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A" jsonb; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."9759D655D5978786B3284FE8057D912192AEB550" ( +CREATE TABLE IF NOT EXISTS teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -202,29 +194,25 @@ CREATE TABLE IF NOT EXISTS ties_data."9759D655D5978786B3284FE8057D912192AEB550" "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" jsonb ); -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "metadata" jsonb; - -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; - -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "REL_updated_time_00017207EE30C3EDDE97A3C4DA4DAC8E2D9FCA99" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "REL_metadata_7E9F11EFBF8974D7C7DAB02E181A0BE4148091DE" jsonb; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ADD COLUMN IF NOT EXISTS "REL_metadata_7E9F11EFBF8974D7C7DAB02E181A0BE4148091DE" jsonb; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ( +CREATE TABLE IF NOT EXISTS teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ( "id" TEXT, "sectorCarrierType" TEXT, "CD_sourceIds" jsonb, @@ -237,29 +225,25 @@ CREATE TABLE IF NOT EXISTS ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" jsonb ); -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "REL_metadata_F723867781098568079DD82E5D5E529374F97E98" jsonb; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "REL_updated_time_F322F0914F5B3B97073AE60B2ACC62C66CCE9B09" TIMESTAMPTZ; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "REL_metadata_F723867781098568079DD82E5D5E529374F97E98" jsonb; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" SET DEFAULT '[]'; - -ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ( +CREATE TABLE IF NOT EXISTS teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ( "id" TEXT, "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, "bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC" TEXT, @@ -268,260 +252,258 @@ CREATE TABLE IF NOT EXISTS ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; - -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "metadata" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "metadata" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '235E984E81B76ADCCFA68BDE09D3BBE49A355919', 'PK_E38D71419D2D129A6834B4E3283938D44105C199', - 'ALTER TABLE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "PK_E38D71419D2D129A6834B4E3283938D44105C199" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "PK_E38D71419D2D129A6834B4E3283938D44105C199" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '28C9A375E800E82308EBE7DA2932EF2C0AF13C38', 'PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62', - 'ALTER TABLE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '53017288F3FE983848689A3DD21D48D298CCD23E', 'PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA', - 'ALTER TABLE ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD CONSTRAINT "PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD CONSTRAINT "PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '53089669D370B15C78B7E8376D434921D1C94240', 'PK_054AA52D66B07A7CCFFE992ED59634B506322187', - 'ALTER TABLE ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "PK_054AA52D66B07A7CCFFE992ED59634B506322187" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "PK_054AA52D66B07A7CCFFE992ED59634B506322187" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '83C555BD948277E4A7C99698690BF800604C0603', 'PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF', - 'ALTER TABLE ties_data."83C555BD948277E4A7C99698690BF800604C0603" ADD CONSTRAINT "PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."83C555BD948277E4A7C99698690BF800604C0603" ADD CONSTRAINT "PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '84E676149362F50C55FE1E004B98D4891916BBF3', 'PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5', - 'ALTER TABLE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '9759D655D5978786B3284FE8057D912192AEB550', 'PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65', - 'ALTER TABLE ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'C278F34A021D7A9AD13BE860608751874F21C00C', 'PK_00966063B84AE30FE4B3DEF804C06532734473E9', - 'ALTER TABLE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "PK_00966063B84AE30FE4B3DEF804C06532734473E9" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "PK_00966063B84AE30FE4B3DEF804C06532734473E9" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CE18CE5B725879B4016F5C281D80D37A95EA7E28', 'PK_4307C17B59528C77107E7C39986C0D18277F61FD', - 'ALTER TABLE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "PK_4307C17B59528C77107E7C39986C0D18277F61FD" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "PK_4307C17B59528C77107E7C39986C0D18277F61FD" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '235E984E81B76ADCCFA68BDE09D3BBE49A355919', 'FK_2E4BCE7E3E19C851F14B87EF1BB00F7C918B5DCF', - 'ALTER TABLE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "FK_2E4BCE7E3E19C851F14B87EF1BB00F7C918B5DCF" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "FK_2E4BCE7E3E19C851F14B87EF1BB00F7C918B5DCF" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '235E984E81B76ADCCFA68BDE09D3BBE49A355919', 'FK_7762EA35111FA62ED7E064A70380C8E12F050F28', - 'ALTER TABLE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "FK_7762EA35111FA62ED7E064A70380C8E12F050F28" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "FK_7762EA35111FA62ED7E064A70380C8E12F050F28" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '28C9A375E800E82308EBE7DA2932EF2C0AF13C38', 'FK_6CAC17243CDF76F4F070B2D097A169FBD41588AB', - 'ALTER TABLE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "FK_6CAC17243CDF76F4F070B2D097A169FBD41588AB" FOREIGN KEY ("REL_FK_used-nrCellDu") REFERENCES ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "FK_6CAC17243CDF76F4F070B2D097A169FBD41588AB" FOREIGN KEY ("REL_FK_used-nrCellDu") REFERENCES teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '28C9A375E800E82308EBE7DA2932EF2C0AF13C38', 'UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C', - 'ALTER TABLE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C" UNIQUE ("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU");' + 'ALTER TABLE teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C" UNIQUE ("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '53089669D370B15C78B7E8376D434921D1C94240', 'FK_EAB359DF1FC9806007FD44BF435DE5711915589A', - 'ALTER TABLE ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "FK_EAB359DF1FC9806007FD44BF435DE5711915589A" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "FK_EAB359DF1FC9806007FD44BF435DE5711915589A" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '53089669D370B15C78B7E8376D434921D1C94240', 'FK_99559DB06CF1125A1EB4364780EB8B2A8A6C4BCA', - 'ALTER TABLE ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "FK_99559DB06CF1125A1EB4364780EB8B2A8A6C4BCA" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "FK_99559DB06CF1125A1EB4364780EB8B2A8A6C4BCA" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '84E676149362F50C55FE1E004B98D4891916BBF3', 'FK_3B5DED591A6C8D4A14706E7E9B712BB23E4B01CF', - 'ALTER TABLE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "FK_3B5DED591A6C8D4A14706E7E9B712BB23E4B01CF" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES ties_data."9759D655D5978786B3284FE8057D912192AEB550" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "FK_3B5DED591A6C8D4A14706E7E9B712BB23E4B01CF" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."9759D655D5978786B3284FE8057D912192AEB550" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '84E676149362F50C55FE1E004B98D4891916BBF3', 'UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3', - 'ALTER TABLE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3" UNIQUE ("REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F");' + 'ALTER TABLE teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3" UNIQUE ("REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '9759D655D5978786B3284FE8057D912192AEB550', 'FK_059D7C49C9FF74C65CE378DB6DA019FE030027EB', - 'ALTER TABLE ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "FK_059D7C49C9FF74C65CE378DB6DA019FE030027EB" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "FK_059D7C49C9FF74C65CE378DB6DA019FE030027EB" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( '9759D655D5978786B3284FE8057D912192AEB550', 'UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A', - 'ALTER TABLE ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");' + 'ALTER TABLE teiv_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'C278F34A021D7A9AD13BE860608751874F21C00C', 'FK_6292B05AE4EFCFFAE3343B626AA0E854181DC8E0', - 'ALTER TABLE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "FK_6292B05AE4EFCFFAE3343B626AA0E854181DC8E0" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."83C555BD948277E4A7C99698690BF800604C0603" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "FK_6292B05AE4EFCFFAE3343B626AA0E854181DC8E0" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."83C555BD948277E4A7C99698690BF800604C0603" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'C278F34A021D7A9AD13BE860608751874F21C00C', 'UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8', - 'ALTER TABLE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8" UNIQUE ("REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64");' + 'ALTER TABLE teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8" UNIQUE ("REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CE18CE5B725879B4016F5C281D80D37A95EA7E28', 'FK_B44561B5980FFD16E1386AEA3192A2612C96D738', - 'ALTER TABLE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "FK_B44561B5980FFD16E1386AEA3192A2612C96D738" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "FK_B44561B5980FFD16E1386AEA3192A2612C96D738" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'CE18CE5B725879B4016F5C281D80D37A95EA7E28', 'FK_5DD6B84381C61E614924591CA5F01C4169700280', - 'ALTER TABLE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "FK_5DD6B84381C61E614924591CA5F01C4169700280" FOREIGN KEY ("bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC") REFERENCES ties_data."83C555BD948277E4A7C99698690BF800604C0603" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "FK_5DD6B84381C61E614924591CA5F01C4169700280" FOREIGN KEY ("bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC") REFERENCES teiv_data."83C555BD948277E4A7C99698690BF800604C0603" (id) ON DELETE CASCADE;' ); -CREATE INDEX IF NOT EXISTS "IDX_A431A290E4A5C18874FE31117537BB03F86A4BE1" ON ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A431A290E4A5C18874FE31117537BB03F86A4BE1" ON teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_65CAD728629B6E4501E261A44FA4551A3C29FF7E" ON ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_65CAD728629B6E4501E261A44FA4551A3C29FF7E" ON teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B38A3DE6633390FD5D88720054D2659A52D9E5D9" ON ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_B38A3DE6633390FD5D88720054D2659A52D9E5D9" ON teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_DF65ACAC403E061AF151ECC6E1A0B5251A57663A" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DF65ACAC403E061AF151ECC6E1A0B5251A57663A" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FC784BD0FA3BEBD9F5C8333C558B7A0BE874E9B4" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FC784BD0FA3BEBD9F5C8333C558B7A0BE874E9B4" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_9B2B02F454ADC81B20DF50A78854FDDAE1E07781" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_9B2B02F454ADC81B20DF50A78854FDDAE1E07781" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_A784A72DDC0B6161C3C40CC809908B28CBA3586C" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A784A72DDC0B6161C3C40CC809908B28CBA3586C" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_411D5CAD37663D02499EB24445A21693A234FFDE" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_411D5CAD37663D02499EB24445A21693A234FFDE" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN (("REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_B0FFEC36366A5E403AADCA0B9DCEB13F511B226F" ON ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN ("REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92"); +CREATE INDEX IF NOT EXISTS "IDX_B0FFEC36366A5E403AADCA0B9DCEB13F511B226F" ON teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" USING GIN ("REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92"); -CREATE INDEX IF NOT EXISTS "IDX_9375E42087BDE5DF649B8F30DA3DEE96D07C863C" ON ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_9375E42087BDE5DF649B8F30DA3DEE96D07C863C" ON teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_822F9AB2F47067FDB88F9C322BC6A2B3B6C947B9" ON ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_822F9AB2F47067FDB88F9C322BC6A2B3B6C947B9" ON teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FF1E0F629EA6972551FCE6D99834A31FE5A7FB10" ON ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FF1E0F629EA6972551FCE6D99834A31FE5A7FB10" ON teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_734E3F8FAD3A1B010D7E2095EA1357D4CEABD249" ON ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_734E3F8FAD3A1B010D7E2095EA1357D4CEABD249" ON teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_629B2C2E73E2B5BF5BB31BB816EE0597484360CD" ON ties_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_629B2C2E73E2B5BF5BB31BB816EE0597484360CD" ON teiv_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2B2F5C1C9635A1AF418B85A486601087C420E8F9" ON ties_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2B2F5C1C9635A1AF418B85A486601087C420E8F9" ON teiv_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_0A8C3B8A6C6FC1C4C60C47C3996F65D200F2CDAC" ON ties_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_0A8C3B8A6C6FC1C4C60C47C3996F65D200F2CDAC" ON teiv_data."53089669D370B15C78B7E8376D434921D1C94240" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_7DACD641D4ED26579A7D8F94C74447B19D067ECD" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_7DACD641D4ED26579A7D8F94C74447B19D067ECD" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_BC63EFD4857126FFC64E88F6136B85CA31E2A0EB" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BC63EFD4857126FFC64E88F6136B85CA31E2A0EB" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E754CEE6CB27BA7BE1ECB90F717B2C241381B00F" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E754CEE6CB27BA7BE1ECB90F717B2C241381B00F" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_337B9980AA0401C715A372CF8615E73F826B9DAE" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_337B9980AA0401C715A372CF8615E73F826B9DAE" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DD78610CF631FE9F7AEB4068C0A4D8A40234DB31" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_DD78610CF631FE9F7AEB4068C0A4D8A40234DB31" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_572A048D2B70E8CE7B919179CE285264951E6057" ON ties_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_572A048D2B70E8CE7B919179CE285264951E6057" ON teiv_data."83C555BD948277E4A7C99698690BF800604C0603" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_5AEF72C5C2C83452A1BC8535E3EFF6E2AC9F4E02" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_5AEF72C5C2C83452A1BC8535E3EFF6E2AC9F4E02" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_941E47F8B0E1F353F356F09A7D4EED3670560681" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_941E47F8B0E1F353F356F09A7D4EED3670560681" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C6135512BCBC5F91EAD1D324759ADD1B88901FE9" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_C6135512BCBC5F91EAD1D324759ADD1B88901FE9" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_BF805D12F8B66196DC7513960E3872DCFCCCA31E" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_BF805D12F8B66196DC7513960E3872DCFCCCA31E" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8A9B70E4E83E34700456A8395E18BE2F7E793F20" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8A9B70E4E83E34700456A8395E18BE2F7E793F20" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN (("REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_6BEF4595F68DF48B662E68003C784CD6D944087B" ON ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN ("REL_CD_0AC0D382E4274681870EC7319460192F4F603001"); +CREATE INDEX IF NOT EXISTS "IDX_6BEF4595F68DF48B662E68003C784CD6D944087B" ON teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3" USING GIN ("REL_CD_0AC0D382E4274681870EC7319460192F4F603001"); -CREATE INDEX IF NOT EXISTS "IDX_E1ACC551BE0D4D70B82C930C793C0C3751006444" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("dUpLMNId"); +CREATE INDEX IF NOT EXISTS "IDX_E1ACC551BE0D4D70B82C930C793C0C3751006444" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("dUpLMNId"); -CREATE INDEX IF NOT EXISTS "IDX_8F11B2E5857B19A3F9FB339F4DFB139751097100" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_8F11B2E5857B19A3F9FB339F4DFB139751097100" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_AA040BB82CC5AD00E57E39F729D6AB3DF6CCA9F8" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_AA040BB82CC5AD00E57E39F729D6AB3DF6CCA9F8" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_98DD6CE7BB866A4EA737CE96FF985936134D39C5" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_98DD6CE7BB866A4EA737CE96FF985936134D39C5" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_0648B3E68F701DC7FDC41A87DE0D79FB167AFB78" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_0648B3E68F701DC7FDC41A87DE0D79FB167AFB78" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_FF9E656D3D0CB257F97FDDCB728E7637783C889B" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_FF9E656D3D0CB257F97FDDCB728E7637783C889B" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN (("REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_DED8DFAF8F597276CAA4680444C6A069A0570510" ON ties_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B"); +CREATE INDEX IF NOT EXISTS "IDX_DED8DFAF8F597276CAA4680444C6A069A0570510" ON teiv_data."9759D655D5978786B3284FE8057D912192AEB550" USING GIN ("REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B"); -CREATE INDEX IF NOT EXISTS "IDX_389F565ED970F5EB2FAC8A94766B2A60E5DEB022" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_389F565ED970F5EB2FAC8A94766B2A60E5DEB022" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_2888BA890DB44CD93287CAAF0695047CF39B736B" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2888BA890DB44CD93287CAAF0695047CF39B736B" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_C65D145DDF1B1222AB4DFF08B0F504605F3E8468" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_C65D145DDF1B1222AB4DFF08B0F504605F3E8468" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN ("CD_decorators"); -CREATE INDEX IF NOT EXISTS "IDX_839D67DA1D3875780CA8C2EC7DFD39C4F0A7D666" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_839D67DA1D3875780CA8C2EC7DFD39C4F0A7D666" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A3CD76C492D00CAAE49571191E3270D53FA818EE" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_A3CD76C492D00CAAE49571191E3270D53FA818EE" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN (("REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_8D9A8B3F7A4B33D0D985B1F13D210F71277AACBC" ON ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN ("REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC"); +CREATE INDEX IF NOT EXISTS "IDX_8D9A8B3F7A4B33D0D985B1F13D210F71277AACBC" ON teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C" USING GIN ("REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC"); -CREATE INDEX IF NOT EXISTS "IDX_E61FF1756D360B904A01B032904F380F9D4A8650" ON ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_E61FF1756D360B904A01B032904F380F9D4A8650" ON teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_AF0E12037BDEE1B45F3F902B29E0823D713DBB06" ON ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_AF0E12037BDEE1B45F3F902B29E0823D713DBB06" ON teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_A2E437FF2DD6096051A873525763FD9EF7709350" ON ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN ("CD_decorators"); +CREATE INDEX IF NOT EXISTS "IDX_A2E437FF2DD6096051A873525763FD9EF7709350" ON teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN ("CD_decorators"); -ANALYZE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28"; +ANALYZE teiv_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28"; -ANALYZE ties_data."9759D655D5978786B3284FE8057D912192AEB550"; +ANALYZE teiv_data."9759D655D5978786B3284FE8057D912192AEB550"; -ANALYZE ties_data."53089669D370B15C78B7E8376D434921D1C94240"; +ANALYZE teiv_data."53089669D370B15C78B7E8376D434921D1C94240"; -ANALYZE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3"; +ANALYZE teiv_data."84E676149362F50C55FE1E004B98D4891916BBF3"; -ANALYZE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C"; +ANALYZE teiv_data."C278F34A021D7A9AD13BE860608751874F21C00C"; -ANALYZE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38"; +ANALYZE teiv_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38"; -ANALYZE ties_data."83C555BD948277E4A7C99698690BF800604C0603"; +ANALYZE teiv_data."83C555BD948277E4A7C99698690BF800604C0603"; -ANALYZE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919"; +ANALYZE teiv_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919"; -ANALYZE ties_data."53017288F3FE983848689A3DD21D48D298CCD23E"; +ANALYZE teiv_data."53017288F3FE983848689A3DD21D48D298CCD23E"; COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql b/teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql index c20e10b..45f4b4d 100644 --- a/teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql +++ b/teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql @@ -21,7 +21,7 @@ BEGIN; -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; FK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_2E4BCE7E3E19C851F14B87EF1BB00F7C918B5DCF CONSTRAINT FK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_7762EA35111FA62ED7E064A70380C8E12F050F28 CONSTRAINT FK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_EAB359DF1FC9806007FD44BF435DE5711915589A CONSTRAINT @@ -92,7 +92,7 @@ REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYY REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6 COLUMN REL_metadata_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_metadata_7E9F11EFBF8974D7C7DAB02E181A0BE4148091DE COLUMN REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD COLUMN -REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_metadata_780D8ABEAC14A0B2ET73FC4EB093C446F7CD3E56 COLUMN +REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB COLUMN REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_0AC0D382E4274681870EC7319460192F4F603001 COLUMN REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC COLUMN REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B COLUMN @@ -125,7 +125,7 @@ o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY CE18CE5B725879B4016F5C281D80D37A95EA7E28 TABLE \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran @@ -134,7 +134,7 @@ o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr LTESec o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY serviced-antennaCapability AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY o-ran-smo-teiv-rel-equipment-ran ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE deployed-on-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment 0 1 deployed-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment 0 9223372036854775807 BI_DIRECTIONAL true RELATION o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE o-ran-smo-teiv-equipment ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE realised-by-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment 0 1 realised-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-equipment 0 1 BI_DIRECTIONAL true RELATION o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE o-ran-smo-teiv-equipment diff --git a/teiv/src/test/resources/pgsqlschema/model.sql b/teiv/src/test/resources/pgsqlschema/model.sql index b8def27..c8d56a0 100644 --- a/teiv/src/test/resources/pgsqlschema/model.sql +++ b/teiv/src/test/resources/pgsqlschema/model.sql @@ -21,7 +21,7 @@ BEGIN; -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F CONSTRAINT FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5 CONSTRAINT FK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeA FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30 CONSTRAINT @@ -70,7 +70,7 @@ test-built-in-module_EntityTypeA test-built-in-module_EntityTypeA TABLE test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters 10B9F515756871D3EF6558FAF1F112BAE207945D TABLE \. -COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; +COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; test-existing-rapp-module \N \N [] 2024-05-02 dGVzdA== test-module-for-deletion \N \N [] 2024-05-02 dGVzdA== test-module-in-deleting-state \N \N [] 2024-05-02 dGVzdA== @@ -78,12 +78,12 @@ module-rapp-module \N \N [] 2024-05-01 dGVzdE1vZHVsZQo= test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA4LTIwIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc291cmNlSWRzLW9yLXRlaXYtdHlwZXMgewogICAgICAgICAgICB0eXBlIGxlYWZyZWYgewogICAgICAgICAgICAgICAgcGF0aCAiL29yLXRlaXYtdHlwZXM6c291cmNlSWRzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQSBsZWFmLWxpc3QgdGhhdCByZWZlcmVuY2VzIHRoZSBzb3VyY2VJZHMgZnJvbSBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMtb3ItdGVpdi10eXBlcyB7CiAgICAgICAgICAgIHR5cGUgbGVhZnJlZiB7CiAgICAgICAgICAgICAgICBwYXRoICIvb3ItdGVpdi10eXBlczpzb3VyY2VJZHMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBIGxlYWYtbGlzdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHNvdXJjZUlkcyBmcm9tIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMtb3ItdGVpdi10eXBlcyB7CiAgICAgICAgICAgIHR5cGUgbGVhZnJlZiB7CiAgICAgICAgICAgICAgICBwYXRoICIvb3ItdGVpdi10eXBlczpzb3VyY2VJZHMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBIGxlYWYtbGlzdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHNvdXJjZUlkcyBmcm9tIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIjsKICAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin; test-built-in-module_EntityTypeA EntityTypeA test-built-in-module [] test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module ["attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters", "attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters"] \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL true RELATION test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 grouped-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL false A_SIDE test-built-in-module_EntityTypeA test-built-in-module ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS installed-at-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 installed-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 9223372036854775807 BI_DIRECTIONAL false RELATION test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module diff --git a/teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql b/teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql index 604f598..1f71b7a 100644 --- a/teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql +++ b/teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql @@ -21,7 +21,7 @@ BEGIN; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ( "id" VARCHAR(511), "aSide_TestEntityA" VARCHAR(511), "bSide_TestEntityB" VARCHAR(511), @@ -31,13 +31,12 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TEST "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ( "id" VARCHAR(511), "aSide_TestEntityA" VARCHAR(511), "bSide_TestEntityB" VARCHAR(511), @@ -47,13 +46,12 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TE "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityA" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_TestEntityA" ( "id" VARCHAR(511), "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -61,14 +59,12 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityA" ( "attribute1" TEXT ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityA" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityB" ( +CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_TestEntityB" ( "id" VARCHAR(511), "CD_sourceIds" jsonb, "CD_classifiers" jsonb, @@ -82,76 +78,73 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityB" ( "REL_metadata_TESTENTITYA_USES_TESTENTITYB" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "REL_updated_time_TESTENTITYA_USES_TESTENTITYB" TIMESTAMPTZ; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "metadata" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "REL_metadata_TESTENTITYA_USES_TESTENTITYB" jsonb; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '{}'; - -SELECT ties_data.create_constraint_if_not_exists( +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "metadata" jsonb; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ADD COLUMN IF NOT EXISTS "REL_metadata_TESTENTITYA_USES_TESTENTITYB" jsonb; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_TestEntityB" ALTER COLUMN "REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '{}'; + +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB', 'PK_TESTENTITYA_GROUPS_TESTENTITYB_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "PK_TESTENTITYA_GROUPS_TESTENTITYB_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "PK_TESTENTITYA_GROUPS_TESTENTITYB_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB', 'PK_TESTENTITYA_PROVIDES_TESTENTITYB_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "PK_TESTENTITYA_PROVIDES_TESTENTITYB_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "PK_TESTENTITYA_PROVIDES_TESTENTITYB_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TestEntityA', 'PK_TestEntityA_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TestEntityA" ADD CONSTRAINT "PK_TestEntityA_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TestEntityA" ADD CONSTRAINT "PK_TestEntityA_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TestEntityB', 'PK_TestEntityB_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "PK_TestEntityB_id" PRIMARY KEY ("id");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "PK_TestEntityB_id" PRIMARY KEY ("id");' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB', 'FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES ties_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES teiv_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB', 'FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES ties_data."o-ran-smo-teiv-ran_TestEntityB" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES teiv_data."o-ran-smo-teiv-ran_TestEntityB" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB', 'FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES ties_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES teiv_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB', 'FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES ties_data."o-ran-smo-teiv-ran_TestEntityB" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES teiv_data."o-ran-smo-teiv-ran_TestEntityB" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TestEntityB', 'FK_TestEntityB_REL_FK_used-by-testEntityA', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "FK_TestEntityB_REL_FK_used-by-testEntityA" FOREIGN KEY ("REL_FK_used-by-testEntityA") REFERENCES ties_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "FK_TestEntityB_REL_FK_used-by-testEntityA" FOREIGN KEY ("REL_FK_used-by-testEntityA") REFERENCES teiv_data."o-ran-smo-teiv-ran_TestEntityA" (id) ON DELETE CASCADE;' ); -SELECT ties_data.create_constraint_if_not_exists( +SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_TestEntityB', 'UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB" UNIQUE ("REL_ID_TESTENTITYA_USES_TESTENTITYB");' + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_TestEntityB" ADD CONSTRAINT "UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB" UNIQUE ("REL_ID_TESTENTITYA_USES_TESTENTITYB");' ); COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql b/teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql index 115d155..3718544 100644 --- a/teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql +++ b/teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql @@ -21,7 +21,7 @@ BEGIN; -COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; +COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin; FK_TestEntityB_REL_FK_used-by-testEntityA FK_TestEntityB_REL_FK_used-by-testEntityA CONSTRAINT UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB CONSTRAINT PK_TESTENTITYA_PROVIDES_TESTENTITYB_id PK_TESTENTITYA_PROVIDES_TESTENTITYB_id CONSTRAINT @@ -44,12 +44,12 @@ PK_TESTENTITYA_GROUPS_TESTENTITYB_id PK_TESTENTITYA_GROUPS_TESTENTITYB_id CONSTR REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB COLUMN \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; +COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; o-ran-smo-teiv-ran_TestEntityB TestEntityB o-ran-smo-teiv-ran o-ran-smo-teiv-ran_TestEntityA TestEntityA o-ran-smo-teiv-ran \. -COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; +COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin; TESTENTITYA_PROVIDES_TESTENTITYB provided-testEntityB TestEntityA o-ran-smo-teiv-ran 0 2 provided-by-testEntityA TestEntityB o-ran-smo-teiv-ran 0 3 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB o-ran-smo-teiv-ran TESTENTITYA_USES_TESTENTITYB used-TestEntityB TestEntityA o-ran-smo-teiv-ran 0 1 used-by-testEntityA TestEntityB o-ran-smo-teiv-ran 0 2 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_TestEntityB o-ran-smo-teiv-ran TESTENTITYA_GROUPS_TESTENTITYB grouped-testEntityB TestEntityA o-ran-smo-teiv-ran 0 2 grouped-by-testEntityA TestEntityB o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB o-ran-smo-teiv-ran diff --git a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/JsonParserExample.java b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/JsonParserExample.java index 640e982..628407b 100644 --- a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/JsonParserExample.java +++ b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/JsonParserExample.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/Main.java b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/Main.java index ad69fce..d994295 100644 --- a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/Main.java +++ b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/Main.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangParserExample.java b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangParserExample.java index 9e87fc2..f4810ea 100644 --- a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangParserExample.java +++ b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangParserExample.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/pom.xml b/yang-parser/yang-parser-jar/pom.xml index 8e33aa2..578f555 100644 --- a/yang-parser/yang-parser-jar/pom.xml +++ b/yang-parser/yang-parser-jar/pom.xml @@ -80,6 +80,18 @@ + + org.apache.rat + apache-rat-plugin + 0.15 + + + + check + + + + com.diffplug.spotless spotless-maven-plugin diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CheckYangLibraryAgainstSchema.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CheckYangLibraryAgainstSchema.java index b546d26..e9cdcf2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CheckYangLibraryAgainstSchema.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CheckYangLibraryAgainstSchema.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CustomProcessor.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CustomProcessor.java index 15f7452..90b8226 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CustomProcessor.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/CustomProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/ParserExecutionContext.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/ParserExecutionContext.java index 7360873..ba6acb8 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/ParserExecutionContext.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/ParserExecutionContext.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/PrefixResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/PrefixResolver.java index 8cb7cf0..e9a136f 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/PrefixResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/PrefixResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/YangDeviceModel.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/YangDeviceModel.java index d3ca5e3..54a29de 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/YangDeviceModel.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/YangDeviceModel.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/YangData.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/YangData.java index ceec152..6365e08 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/YangData.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/YangData.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomDocumentRoot.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomDocumentRoot.java index 5f22e5c..d231954 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomDocumentRoot.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomDocumentRoot.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNode.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNode.java index 66384fe..2ec816c 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNode.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNode.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNodeAnnotationValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNodeAnnotationValue.java index d70a30f..5ae360d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNodeAnnotationValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/dom/YangDataDomNodeAnnotationValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractContentInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractContentInstance.java index fd4b52d..6b01777 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractContentInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractContentInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractDataInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractDataInstance.java index d50d0ef..47c3717 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractDataInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractDataInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java index 4302475..4a10074 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyDataInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyDataInstance.java index 14079f9..9b89231 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyDataInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyDataInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyXmlInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyXmlInstance.java index f80574d..8c13f6a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyXmlInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/AnyXmlInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ContainerInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ContainerInstance.java index 0c7d436..c64c6d2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ContainerInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ContainerInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/DataTreeBuilderPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/DataTreeBuilderPredicate.java index 144ff9b..4cd3912 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/DataTreeBuilderPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/DataTreeBuilderPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/InstanceDataTreeBuilder.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/InstanceDataTreeBuilder.java index bc12e1b..4d23330 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/InstanceDataTreeBuilder.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/InstanceDataTreeBuilder.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafInstance.java index 8a0c4d7..9896a01 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafListInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafListInstance.java index 77b835b..fd055cc 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafListInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/LeafListInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ListInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ListInstance.java index 55b695f..c7da196 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ListInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/ListInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/RootInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/RootInstance.java index b3a9cae..f0024c1 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/RootInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/instance/RootInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonParser.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonParser.java index 3c7a937..310f60b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonParser.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonWriter.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonWriter.java index 97c53ee..4236c79 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonWriter.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/JsonWriter.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/XmlParser.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/XmlParser.java index 5033335..5d112f0 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/XmlParser.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/parser/XmlParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BinaryValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BinaryValue.java index 4726c00..ccddda8 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BinaryValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BinaryValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BitsValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BitsValue.java index 56786b7..6f3bbff 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BitsValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/BitsValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/IdentityRefValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/IdentityRefValue.java index 13a3dee..f538bd6 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/IdentityRefValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/IdentityRefValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/ValueHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/ValueHelper.java index 41fb289..9014fb9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/ValueHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/data/util/ValueHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/Finding.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/Finding.java index 6ccc4f6..5ed7787 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/Finding.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/Finding.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingFilterPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingFilterPredicate.java index 0f481e8..fe77e70 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingFilterPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingFilterPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverity.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverity.java index 0cabed4..e3b63cd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverity.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverity.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverityCalculator.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverityCalculator.java index 270b106..8b75637 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverityCalculator.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingSeverityCalculator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingsManager.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingsManager.java index dbb29dc..81af394 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingsManager.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/FindingsManager.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModifyableFindingSeverityCalculator.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModifyableFindingSeverityCalculator.java index 1a6790c..eb1b6b9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModifyableFindingSeverityCalculator.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModifyableFindingSeverityCalculator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.java index b56dff7..f7cca7f 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndSeverityFilterPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndSeverityFilterPredicate.java index ae514ec..71ed206 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndSeverityFilterPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ModuleAndSeverityFilterPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ParserFindingType.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ParserFindingType.java index 50b01ec..9f693f4 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ParserFindingType.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/ParserFindingType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SeverityCalculatorFilterPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SeverityCalculatorFilterPredicate.java index 028974a..8812205 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SeverityCalculatorFilterPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SeverityCalculatorFilterPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SuppressAllFilterPredicate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SuppressAllFilterPredicate.java index 66ac4e4..e1121cf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SuppressAllFilterPredicate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/findings/SuppressAllFilterPredicate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/BufferedStreamYangInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/BufferedStreamYangInput.java index 29b51ab..e83f74c 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/BufferedStreamYangInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/BufferedStreamYangInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/ByteArrayYangInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/ByteArrayYangInput.java index 313d283..3e72e15 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/ByteArrayYangInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/ByteArrayYangInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/DirectYangInputResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/DirectYangInputResolver.java index 1f31ef3..6060b26 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/DirectYangInputResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/DirectYangInputResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInput.java index 3190435..e0c822c 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInputResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInputResolver.java index bbc77c6..f1ffeb3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInputResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/FileBasedYangInputResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/StringYangInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/StringYangInput.java index b15d084..3cacb1d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/StringYangInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/StringYangInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInput.java index 41b40d5..ba1f9b9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInputResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInputResolver.java index 492459d..ba8b3b8 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInputResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/input/YangInputResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ConformanceType.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ConformanceType.java index 7e598b1..a9cccd0 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ConformanceType.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ConformanceType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModuleIdentity.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModuleIdentity.java index e0704ca..01487c8 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModuleIdentity.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModuleIdentity.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModulePrefixResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModulePrefixResolver.java index fa5f05f..bfc88a8 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModulePrefixResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/ModulePrefixResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModel.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModel.java index d6336d4..6e3ccaa 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModel.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModel.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModelUtil.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModelUtil.java index af4023f..eeb4678 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModelUtil.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/YangModelUtil.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/Token.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/Token.java index 9d2a603..994dd47 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/Token.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/Token.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/TokenIterator.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/TokenIterator.java index 9330a32..b1f5778 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/TokenIterator.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/TokenIterator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/YamTokenizer.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/YamTokenizer.java index 65c39d8..5974d37 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/YamTokenizer.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/parser/YamTokenizer.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/AugmentResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/AugmentResolver.java index 1ef3e6a..262582a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/AugmentResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/AugmentResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/DeviationResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/DeviationResolver.java index 9eb097f..3f42d5a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/DeviationResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/DeviationResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/Helper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/Helper.java index 001706a..653061a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/Helper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/Helper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/TypeResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/TypeResolver.java index ac3550c..dc3af4d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/TypeResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/TypeResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/UsesResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/UsesResolver.java index 659c6dd..eeaa2c9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/UsesResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/resolvers/UsesResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/AnnotationRegistry.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/AnnotationRegistry.java index 3d5dc7f..8666b8b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/AnnotationRegistry.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/AnnotationRegistry.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/IdentityRegistry.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/IdentityRegistry.java index 5ce0ded..bbf54a7 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/IdentityRegistry.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/IdentityRegistry.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleAndNamespaceResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleAndNamespaceResolver.java index d8b62a2..f077aaf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleAndNamespaceResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleAndNamespaceResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleRegistry.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleRegistry.java index 902a06a..c92cfd5 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleRegistry.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/ModuleRegistry.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/Schema.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/Schema.java index aad192b..49e97fd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/Schema.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/Schema.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaCheckModuleRelationships.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaCheckModuleRelationships.java index e233659..f0c4304 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaCheckModuleRelationships.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaCheckModuleRelationships.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaProcessor.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaProcessor.java index cab50b3..8b42641 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaProcessor.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/schema/SchemaProcessor.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatement.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatement.java index b0763b6..c462820 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatement.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatementClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatementClassSupplier.java index 6b7f353..7bfd313 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatementClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/AbstractStatementClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ExtensionStatement.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ExtensionStatement.java index 8e8e07d..bb4b353 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ExtensionStatement.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ExtensionStatement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/SimpleStatement.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/SimpleStatement.java index e68f12b..23332a3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/SimpleStatement.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/SimpleStatement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementClassSupplier.java index 11eb9c1..329dd44 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementFactory.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementFactory.java index d1746e3..d5a92a7 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementFactory.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementFactory.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementModuleAndName.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementModuleAndName.java index afe2a58..be6a573 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementModuleAndName.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/StatementModuleAndName.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/YangModelRoot.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/YangModelRoot.java index d4122b6..3dbe68d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/YangModelRoot.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/YangModelRoot.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/CIETF.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/CIETF.java index c660666..3eb6e0a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/CIETF.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/CIETF.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/IetfExtensionsClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/IetfExtensionsClassSupplier.java index 1ad3b0a..3913d8d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/IetfExtensionsClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/IetfExtensionsClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfAnnotation.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfAnnotation.java index 3996134..37bc0e5 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfAnnotation.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfAnnotation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyAll.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyAll.java index 833be94..cbf679e 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyAll.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyAll.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyWrite.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyWrite.java index db52d9a..fa425cd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyWrite.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfDefaultDenyWrite.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfMountPoint.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfMountPoint.java index fefb885..54ac4a9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfMountPoint.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/ietf/YIetfMountPoint.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/CORAN.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/CORAN.java index 47bc0bb..4eb8328 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/CORAN.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/CORAN.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/OranExtensionsClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/OranExtensionsClassSupplier.java index 04a350d..73007af 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/OranExtensionsClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/OranExtensionsClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivASide.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivASide.java index 2b6143c..d87d4c3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivASide.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivASide.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBSide.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBSide.java index a6aeaa7..1a167ce 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBSide.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBSide.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBiDirectionalTopologyRelationship.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBiDirectionalTopologyRelationship.java index 0b2b42e..c301e93 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBiDirectionalTopologyRelationship.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivBiDirectionalTopologyRelationship.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivLabel.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivLabel.java index 53c60d1..c121c15 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivLabel.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/oran/YOranSmoTeivLabel.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/C3GPP.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/C3GPP.java index 3095565..7febacd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/C3GPP.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/C3GPP.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/ThreeGppExtensionsClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/ThreeGppExtensionsClassSupplier.java index dd0086d..addf09e 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/ThreeGppExtensionsClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/ThreeGppExtensionsClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInVariant.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInVariant.java index a2bb490..46057a3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInVariant.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInVariant.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInitialValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInitialValue.java index 9045b2d..1923a41 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInitialValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppInitialValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppNotNotifyable.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppNotNotifyable.java index ed6308b..1710d2f 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppNotNotifyable.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/threegpp/Y3gppNotNotifyable.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/CY.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/CY.java index d49a6b7..cf1cbd1 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/CY.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/CY.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAction.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAction.java index 4947564..b258421 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAction.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAction.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnydata.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnydata.java index d84ec07..2ad8aa9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnydata.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnydata.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnyxml.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnyxml.java index c78ab2b..d0c7716 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnyxml.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAnyxml.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YArgument.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YArgument.java index 818f86c..e0b6238 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YArgument.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YArgument.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAugment.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAugment.java index e8acd59..6e9f0e3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAugment.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YAugment.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBase.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBase.java index cf102ff..ecc9cdd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBase.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBase.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBelongsTo.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBelongsTo.java index 1b9c6ea..3127896 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBelongsTo.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBelongsTo.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBit.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBit.java index d684a33..e344784 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBit.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YBit.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YCase.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YCase.java index ee1b459..faea0a2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YCase.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YCase.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YChoice.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YChoice.java index 442253b..175e0e1 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YChoice.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YChoice.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YConfig.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YConfig.java index d4791e9..b2a5209 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YConfig.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YConfig.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContact.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContact.java index 930000d..1b07810 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContact.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContact.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContainer.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContainer.java index c39d973..7b4e92b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContainer.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YContainer.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDefault.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDefault.java index bac05d6..ceae74e 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDefault.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDefault.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDescription.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDescription.java index 7ab3fb2..4cbc73b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDescription.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDescription.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviate.java index 152118e..6dd7027 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviation.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviation.java index b7e3b28..000d076 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviation.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YDeviation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YEnum.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YEnum.java index f253938..81e9db2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YEnum.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YEnum.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorAppTag.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorAppTag.java index 60e8a27..6967df2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorAppTag.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorAppTag.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorMessage.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorMessage.java index d42ddc8..0e4f996 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorMessage.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YErrorMessage.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YExtension.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YExtension.java index 632389d..3f13654 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YExtension.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YExtension.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFeature.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFeature.java index 11c6d17..a2f3de6 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFeature.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFeature.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFractionDigits.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFractionDigits.java index 3e55c67..786368e 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFractionDigits.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YFractionDigits.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YGrouping.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YGrouping.java index 82faf6e..0b96484 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YGrouping.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YGrouping.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIdentity.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIdentity.java index d7afaee..be7a4c5 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIdentity.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIdentity.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIfFeature.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIfFeature.java index df93439..0c9fcc9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIfFeature.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YIfFeature.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YImport.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YImport.java index 8dd24c5..8d16e98 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YImport.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YImport.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInclude.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInclude.java index 9841ff5..72429b9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInclude.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInclude.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInput.java index eabe3af..f676d40 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YInput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YKey.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YKey.java index c67f653..c877078 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YKey.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YKey.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeaf.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeaf.java index b18106c..c15abcf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeaf.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeaf.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeafList.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeafList.java index 9ea44c4..1e9a0cc 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeafList.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLeafList.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLength.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLength.java index d433e4a..74ac591 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLength.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YLength.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YList.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YList.java index 3653e7d..6c44b27 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YList.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YList.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMandatory.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMandatory.java index be6112b..3d35ea0 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMandatory.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMandatory.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMaxElements.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMaxElements.java index 7e8d985..f5c9581 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMaxElements.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMaxElements.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMinElements.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMinElements.java index a2f7641..75f0164 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMinElements.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMinElements.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModifier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModifier.java index fd5ffff..41f493e 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModifier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModifier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModule.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModule.java index d6d422f..d305b13 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModule.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YModule.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMust.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMust.java index 6da3e52..441d44d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMust.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YMust.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNamespace.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNamespace.java index 300f814..fffc522 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNamespace.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNamespace.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNotification.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNotification.java index 4a0101b..2de85a7 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNotification.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YNotification.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrderedBy.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrderedBy.java index d2261d0..360ddf9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrderedBy.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrderedBy.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrganization.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrganization.java index 627162c..5c5b50d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrganization.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOrganization.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOutput.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOutput.java index 9ec60d8..a8e5e7b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOutput.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YOutput.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPath.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPath.java index 119dab4..d927ccf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPath.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPath.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPattern.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPattern.java index c8914fa..61e7420 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPattern.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPattern.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPosition.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPosition.java index ff847cb..2e9090b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPosition.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPosition.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPrefix.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPrefix.java index 5416b17..2cea750 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPrefix.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPrefix.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPresence.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPresence.java index ef7fdc2..582d720 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPresence.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YPresence.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRange.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRange.java index b0d3f65..49aa06b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRange.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRange.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YReference.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YReference.java index 95223b1..7ee9b7a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YReference.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YReference.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRefine.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRefine.java index 5b73f21..edb5b7c 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRefine.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRefine.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRequireInstance.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRequireInstance.java index c827b4b..fb77042 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRequireInstance.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRequireInstance.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevision.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevision.java index 9282974..564d0bf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevision.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevision.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevisionDate.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevisionDate.java index c3f158f..982df2b 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevisionDate.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRevisionDate.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRpc.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRpc.java index e50c4d4..91ab9fd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRpc.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YRpc.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YStatus.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YStatus.java index 3489025..2548ca9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YStatus.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YStatus.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YSubmodule.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YSubmodule.java index 101fc4b..512ba17 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YSubmodule.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YSubmodule.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YType.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YType.java index 6e3be06..736d643 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YType.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YType.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YTypedef.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YTypedef.java index 7cee01f..3ec3e6c 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YTypedef.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YTypedef.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnique.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnique.java index e6d2857..2f71955 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnique.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnique.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnits.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnits.java index ad18b41..a675c0d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnits.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUnits.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUses.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUses.java index 6a98ff1..98a4dde 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUses.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YUses.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YValue.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YValue.java index 2d796c6..f60bcb6 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YValue.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YValue.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YWhen.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YWhen.java index 29669ce..4bf30dd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YWhen.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YWhen.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYangVersion.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYangVersion.java index f9af21a..33d4739 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYangVersion.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYangVersion.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYinElement.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYinElement.java index cff61b2..2e47027 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYinElement.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YYinElement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YangCoreClassSupplier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YangCoreClassSupplier.java index 517bde5..4213689 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YangCoreClassSupplier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/statements/yang/YangCoreClassSupplier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/DataTypeHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/DataTypeHelper.java index 9a590ab..c96ae90 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/DataTypeHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/DataTypeHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/GrammarHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/GrammarHelper.java index da1234d..e7bfa72 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/GrammarHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/GrammarHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/NumberHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/NumberHelper.java index 4b8ed60..cde5814 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/NumberHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/NumberHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/PatternHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/PatternHelper.java index 1d76c39..8b4acc9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/PatternHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/PatternHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/StringHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/StringHelper.java index d947254..d309529 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/StringHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/StringHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangAnnotation.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangAnnotation.java index 8e03d91..d7241f3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangAnnotation.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangAnnotation.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangFeature.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangFeature.java index 25af84e..d63cb42 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangFeature.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangFeature.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangIdentity.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangIdentity.java index b654d6f..d48ae96 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangIdentity.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/util/YangIdentity.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/DefaultOutputFileNameResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/DefaultOutputFileNameResolver.java index e9f2a65..44d16e1 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/DefaultOutputFileNameResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/DefaultOutputFileNameResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OriginalFileNameOutputFileNameResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OriginalFileNameOutputFileNameResolver.java index 7b6b0af..a4a7c72 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OriginalFileNameOutputFileNameResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OriginalFileNameOutputFileNameResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputFileNameResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputFileNameResolver.java index 421ebda..dc07ca2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputFileNameResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputFileNameResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputStreamResolver.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputStreamResolver.java index 7aaf3ca..6ac12bd 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputStreamResolver.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/OutputStreamResolver.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomDocumentRoot.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomDocumentRoot.java index 7e114af..4f74d6f 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomDocumentRoot.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomDocumentRoot.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomElement.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomElement.java index 75bf88a..a155ba2 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomElement.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomElement.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomWriter.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomWriter.java index 71256ab..ba5bf17 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomWriter.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/model/yangdom/YangDomWriter.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/InstanceIdentifier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/InstanceIdentifier.java index c200da1..2f2aeeb 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/InstanceIdentifier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/InstanceIdentifier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/NamespaceModuleIdentifier.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/NamespaceModuleIdentifier.java index f735fbc..eb392b9 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/NamespaceModuleIdentifier.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/NamespaceModuleIdentifier.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/QNameHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/QNameHelper.java index bc1877d..9d2bc87 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/QNameHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/QNameHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/StackTraceHelper.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/StackTraceHelper.java index d484da1..599b583 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/StackTraceHelper.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/util/StackTraceHelper.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Datastore.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Datastore.java index b792282..9bcf149 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Datastore.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Datastore.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/IetfYangLibraryParser.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/IetfYangLibraryParser.java index 55095da..d312d03 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/IetfYangLibraryParser.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/IetfYangLibraryParser.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Module.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Module.java index d392a26..787747a 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Module.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Module.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModuleSet.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModuleSet.java index 80a0c26..8850d85 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModuleSet.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModuleSet.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModulesState.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModulesState.java index 774f48f..d5cd62d 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModulesState.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/ModulesState.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/RFC8525Populator.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/RFC8525Populator.java index 6509166..71b1cce 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/RFC8525Populator.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/RFC8525Populator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Submodule.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Submodule.java index 45e4dfa..c3d56b3 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Submodule.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/Submodule.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibrary.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibrary.java index 38f88bc..1537660 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibrary.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibrary.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibraryPopulator.java b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibraryPopulator.java index 6e4453e..087a3bf 100644 --- a/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibraryPopulator.java +++ b/yang-parser/yang-parser-jar/src/main/java/org/oran/smo/yangtools/parser/yanglibrary/YangLibraryPopulator.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/JsonTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/JsonTest.java index 01f34db..e70393e 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/JsonTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/JsonTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlPrefixesTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlPrefixesTest.java index 6da4f24..acef45b 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlPrefixesTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlPrefixesTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlRootElementsTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlRootElementsTest.java index 72f4ddd..bb3bb44 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlRootElementsTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/dom/test/XmlRootElementsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonParserTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonParserTest.java index 3b20a44..11eb4a4 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonParserTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonParserTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonWriterTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonWriterTest.java index bd8c81d..188fc47 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonWriterTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/parser/test/JsonWriterTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/ComplexInstanceDataTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/ComplexInstanceDataTest.java index e22e2bf..ca12b2c 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/ComplexInstanceDataTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/ComplexInstanceDataTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/DataTreeBuilderPredicateTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/DataTreeBuilderPredicateTest.java index 0bed93f..3aa4b30 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/DataTreeBuilderPredicateTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/DataTreeBuilderPredicateTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/InstanceDataTreeBuilderTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/InstanceDataTreeBuilderTest.java index 8875908..4320830 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/InstanceDataTreeBuilderTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/test/InstanceDataTreeBuilderTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BinaryValueTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BinaryValueTest.java index eb6f246..0647c12 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BinaryValueTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BinaryValueTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BitsValueTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BitsValueTest.java index 5f79ac1..816d7b4 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BitsValueTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/BitsValueTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/IdentityRefValueTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/IdentityRefValueTest.java index 0f93ca1..2527713 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/IdentityRefValueTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/IdentityRefValueTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/ValueHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/ValueHelperTest.java index a08a3bf..197a463 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/ValueHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/data/util/test/ValueHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/findings/test/FindingsManagerTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/findings/test/FindingsManagerTest.java index 001087e..11c23c3 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/findings/test/FindingsManagerTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/findings/test/FindingsManagerTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/ByteArrayYangInputTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/ByteArrayYangInputTest.java index 4516e3e..d18b0d1 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/ByteArrayYangInputTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/ByteArrayYangInputTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputResolverTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputResolverTest.java index 7e5a7c0..aa1f46a 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputResolverTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputResolverTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputTest.java index db6ec33..518c6c0 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/input/test/FileBasedYangInputTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/AnnotationRegistryTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/AnnotationRegistryTest.java index ecce50b..3d3478e 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/AnnotationRegistryTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/AnnotationRegistryTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/IdentityRegistryTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/IdentityRegistryTest.java index 2364d1a..431b2b6 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/IdentityRegistryTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/IdentityRegistryTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/ModuleRegistryTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/ModuleRegistryTest.java index 521c3e8..a869a67 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/ModuleRegistryTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/ModuleRegistryTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/PrefixAndNamespaceResolverTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/PrefixAndNamespaceResolverTest.java index 74d4d71..0d7ce0d 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/PrefixAndNamespaceResolverTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/PrefixAndNamespaceResolverTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveFindingsOnUnusedSchemaNodesTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveFindingsOnUnusedSchemaNodesTest.java index db8ff55..17f5231 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveFindingsOnUnusedSchemaNodesTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveFindingsOnUnusedSchemaNodesTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveProtocolAccessibleObjectsTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveProtocolAccessibleObjectsTest.java index 3061fb1..6742132 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveProtocolAccessibleObjectsTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/RemoveProtocolAccessibleObjectsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/StopAfterInitialParseTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/StopAfterInitialParseTest.java index 50b761b..8c7f76e 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/StopAfterInitialParseTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/schema/test/StopAfterInitialParseTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/ietf/test/OtherExtensionsTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/ietf/test/OtherExtensionsTest.java index 4c0e587..e8ea461 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/ietf/test/OtherExtensionsTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/ietf/test/OtherExtensionsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/oran/test/OranSmoTeivExtensionsTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/oran/test/OranSmoTeivExtensionsTest.java index 4aeec95..f6235a7 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/oran/test/OranSmoTeivExtensionsTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/oran/test/OranSmoTeivExtensionsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,15 +46,15 @@ import org.oran.smo.yangtools.parser.testutils.YangTestCommon; public class OranSmoTeivExtensionsTest extends YangTestCommon { - protected static final String SMO_TIES_COMMON_YANG_EXT = "src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-extensions@2023-12-12.yang"; - protected static final String SMO_TIES_COMMON_YANG_TYPES = "src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang"; + protected static final String SMO_TEIV_COMMON_YANG_EXT = "src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-extensions@2023-12-12.yang"; + protected static final String SMO_TEIV_COMMON_YANG_TYPES = "src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang"; @Test public void test_oran_extensions() { parseAbsoluteImplementsYangModels(Arrays.asList( - "src/test/resources/model-statements-oran/oran-smo-teiv-extension-test.yang", SMO_TIES_COMMON_YANG_EXT, - SMO_TIES_COMMON_YANG_TYPES)); + "src/test/resources/model-statements-oran/oran-smo-teiv-extension-test.yang", SMO_TEIV_COMMON_YANG_EXT, + SMO_TEIV_COMMON_YANG_TYPES)); final YModule module = getModule("oran-smo-teiv-extension-test"); assertTrue(module != null); diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/AugmentTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/AugmentTest.java index ad7c581..6ce43ff 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/AugmentTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/AugmentTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BelongsToTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BelongsToTest.java index fa8662c..daad985 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BelongsToTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BelongsToTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BitsTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BitsTest.java index dc87878..1399854 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BitsTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/BitsTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ConformanceTypeTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ConformanceTypeTest.java index 80e8db0..aa49f07 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ConformanceTypeTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ConformanceTypeTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DataTypeTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DataTypeTest.java index be28623..7439560 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DataTypeTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DataTypeTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DeviationTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DeviationTest.java index a9672a8..0342867 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DeviationTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/DeviationTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GeneralSyntaxTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GeneralSyntaxTest.java index b819370..434a494 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GeneralSyntaxTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GeneralSyntaxTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GroupingTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GroupingTest.java index cc6a517..e8445cd 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GroupingTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/GroupingTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IdentityTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IdentityTest.java index b1c26df..5abdc48 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IdentityTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IdentityTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IfFeatureTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IfFeatureTest.java index 8b9bc8e..5047edc 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IfFeatureTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IfFeatureTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ImportTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ImportTest.java index e9de118..3849e28 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ImportTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ImportTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IncludeTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IncludeTest.java index deefa72..2815b8b 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IncludeTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/IncludeTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/LengthTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/LengthTest.java index fdd8bbd..df3524c 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/LengthTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/LengthTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ModuleTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ModuleTest.java index 320a174..d593c69 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ModuleTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/ModuleTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/NamespaceTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/NamespaceTest.java index b2921a1..b438d40 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/NamespaceTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/NamespaceTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/PrefixesTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/PrefixesTest.java index bf60352..04103b8 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/PrefixesTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/PrefixesTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RangeTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RangeTest.java index e9cf949..d2e38d7 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RangeTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RangeTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RevisionTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RevisionTest.java index bb4d42a..2fc21f1 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RevisionTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/RevisionTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StatusTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StatusTest.java index a50e00c..7e76588 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StatusTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StatusTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StringTokenizationTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StringTokenizationTest.java index b21f74a..f5ded7e 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StringTokenizationTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/StringTokenizationTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/SubmoduleTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/SubmoduleTest.java index 01ee3fd..f26f84a 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/SubmoduleTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/SubmoduleTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/TypedefTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/TypedefTest.java index 0386429..9740e03 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/TypedefTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/TypedefTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/WhenTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/WhenTest.java index 730ed15..989a49e 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/WhenTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/statements/yang/test/WhenTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/test/ModuleIdentityTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/test/ModuleIdentityTest.java index 387e9f5..37c10a4 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/test/ModuleIdentityTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/test/ModuleIdentityTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/DataTypeHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/DataTypeHelperTest.java index 91ad51c..0cec11d 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/DataTypeHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/DataTypeHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/GrammarHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/GrammarHelperTest.java index 0f53d82..1b0e2f6 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/GrammarHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/GrammarHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/NumberHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/NumberHelperTest.java index 7e30abc..69a8ed7 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/NumberHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/NumberHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/PatternHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/PatternHelperTest.java index aa05099..2d9c047 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/PatternHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/PatternHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/StringHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/StringHelperTest.java index 4def755..7013773 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/StringHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/StringHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangAnnotationTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangAnnotationTest.java index 91631c7..f33fef1 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangAnnotationTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangAnnotationTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangIdentityTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangIdentityTest.java index d2c9bfb..f64c8fe 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangIdentityTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/util/test/YangIdentityTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/yangdom/test/BasicParsingTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/yangdom/test/BasicParsingTest.java index dd5c981..e6d1559 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/yangdom/test/BasicParsingTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/model/yangdom/test/BasicParsingTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/CheckYangLibraryAgainstSchemaTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/CheckYangLibraryAgainstSchemaTest.java index 30ddc94..a69b4f0 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/CheckYangLibraryAgainstSchemaTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/CheckYangLibraryAgainstSchemaTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/FailFastTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/FailFastTest.java index 61ee201..d2cde7f 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/FailFastTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/FailFastTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/ParseIetfModulesTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/ParseIetfModulesTest.java index ed980e9..533d31b 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/ParseIetfModulesTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/ParseIetfModulesTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/UnsatisfiedIfFeatureRemoveTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/UnsatisfiedIfFeatureRemoveTest.java index 8d27314..d6a5800 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/UnsatisfiedIfFeatureRemoveTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/UnsatisfiedIfFeatureRemoveTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDeviceModelTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDeviceModelTest.java index c7b5619..8b36595 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDeviceModelTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDeviceModelTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDomWriteOutTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDomWriteOutTest.java index 4bbc30c..cee6176 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDomWriteOutTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/test/YangDomWriteOutTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/testutils/YangTestCommon.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/testutils/YangTestCommon.java index fdedeb8..0f37491 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/testutils/YangTestCommon.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/testutils/YangTestCommon.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/InstanceIdentifierTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/InstanceIdentifierTest.java index f7fea0c..2ae8fbc 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/InstanceIdentifierTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/InstanceIdentifierTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/NamespaceAndIdentifierTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/NamespaceAndIdentifierTest.java index 6b273c6..76162de 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/NamespaceAndIdentifierTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/NamespaceAndIdentifierTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/QNameHelperTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/QNameHelperTest.java index 27e774b..92dac8d 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/QNameHelperTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/util/test/QNameHelperTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/yanglibrary/test/IetfYangLibraryParserTest.java b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/yanglibrary/test/IetfYangLibraryParserTest.java index 134d380..34ca15b 100644 --- a/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/yanglibrary/test/IetfYangLibraryParserTest.java +++ b/yang-parser/yang-parser-jar/src/test/java/org/oran/smo/yangtools/parser/yanglibrary/test/IetfYangLibraryParserTest.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2024 Ericsson - * Modifications Copyright (C) 2024 OpenInfra Foundation Europe + * Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/yang-parser/yang-parser-jar/src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang b/yang-parser/yang-parser-jar/src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang index 7f23938..0a2038c 100644 --- a/yang-parser/yang-parser-jar/src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang +++ b/yang-parser/yang-parser-jar/src/test/resources/_orig-modules/o-ran-smo-teiv-common-yang-types@2023-12-12.yang @@ -36,8 +36,8 @@ module o-ran-smo-teiv-common-yang-types { } } - container ties-consumer-data { - description "This container defines the TIES consumer-data. Consumer-data may be attached to Topology Entity or + container teiv-consumer-data { + description "This container defines the TEIV consumer-data. Consumer-data may be attached to Topology Entity or Topology Relation instance, outside of the declared Topology Entity or Topology Relationship's attributes. This container cannot be instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise."; @@ -49,7 +49,7 @@ module o-ran-smo-teiv-common-yang-types { leaf-list classifiers { description "Consumer defined tags to topology entities and relationships. The ability to apply classifier is - supported through TIES REST API"; + supported through TEIV REST API"; type identityref { base classifier; } } -- 2.16.6